linux c++ 获取空闲端口

/*
*g++ -o bind_c bind_c.cc
*/
#include <stdio.h>  
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>

 bool getAvaliablePort(unsigned short &port )
 {
    pid_t fpid;
    int status;
    int server_sockfd;//服务器端套接字  
    int len;  
     bool result = true;
    struct sockaddr_in server_addr;   //服务器网络地址结构体   
    memset(&server_addr,0,sizeof(server_addr)); //数据初始化--清零  
    server_addr.sin_family=AF_INET; //设置为IP通信  
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//服务器IP地址--允许连接到所有本地地址上  
    //server_addr.sin_port=htons(23); //服务器telnet端口号  
    server_addr.sin_port=htons(port); //服务器telnet端口号  
    //init_telnetd();
    /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/  
    if((server_sockfd=socket(AF_INET,SOCK_STREAM,0))<0)  
    {    
      //  printf("socket faile server_addr.sin_port %d\n",server_addr.sin_port);
        result =false;
    }  

        /*将套接字绑定到服务器的网络地址上*/  
    if (bind(server_sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))<0)  
    {  
      //  printf("close faile\n");
        result =false;
    }
    if ( 0 != close(server_sockfd)){
       // printf("close faile\n");
        result = false;
    }
   // port = ntohs(server_addr.sin_port);
    return  result;
}

 bool getAvaliableRangePort(unsigned short &port ,unsigned short range_s=8192 , unsigned short range_e=65535){
    bool ret;
    unsigned short portIndex;
    for( portIndex = range_s; portIndex<=range_e; portIndex++){
        ret = getAvaliablePort(portIndex);
        if(ret) break;
       // printf("portIndex = %d\n",portIndex);
    }
    port = ret? portIndex:0;
    //printf("port = %d\n",port);
    return ret;
 }
 

int main(){
unsigned short port;
getAvaliableRangePort(port ,8192 , 8192);
printf("port = %d\n",port);
return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值