更容易在C中保留端口号的方法

时间:2013-10-15 06:56:41

标签: c sockets

您好我想知道是否有更简单的方法来检查端口号是否可用,我想保留它以便我可以提前使用它?下面的代码就是这样做的,但它似乎过于复杂。

 int getSocketNo(){
socklen_t namelen;
struct sockaddr_in node;
int sock_1;

/* ----Address information for use with bind---- */
node.sin_family = AF_INET;         /* it is an IP address */
node.sin_port   = 0;
node.sin_addr.s_addr = INADDR_ANY; /* use any interface on this host*/

/* ----Create TCP/IP socket---- */
sock_1 = socket(AF_INET, SOCK_STREAM, 0);
if (sock_1 == -1) {
    perror("socket() Socket was not created");
    exit(-1);
}

while(1){
    /* ----Bind socket to address and port---- */
    if (bind(sock_1, (struct sockaddr *) &node, sizeof(node))) {
        perror("Server bind error");
        continue;
    }

    int y = 1; // not sure what this does yet
    setsockopt(sock_1, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(y));

    /* ----Find out what port number was assigned---- */
    namelen = sizeof(node);
    if (getsockname(sock_1, (struct sockaddr *) &node, &namelen)) {
        perror("Server get port number");
        exit(-1);
    }
    close(sock_1);
    break;
}

return ntohs(node.sin_port);

}

2 个答案:

答案 0 :(得分:1)

预订Port Numner:

您不能预先为程序/应用程序保留端口号。 bind()做你想做的事。 保留为端口号调用bind的进程的端口号。


检查端口号是否可用

至于检查端口号是否可用,答案是bind()If the port number is not available, bind will fail。这意味着该端口正被其他进程使用。尝试绑定新的端口号

了解更多信息: Linux Man


简易示例代码:

int main()
{
int sockFd, bytesRead = 1, bytesSent;

char buffer[MaxBufferLength];

struct sockaddr_in server, client;


server.sin_port= htons(PORT);
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);

sockFd = socket(AF_INET, SOCK_STREAM, 0);


if(sockFd < 0)
    printf("Unable to open socket\n");


int i = bind(sockFd, (struct sockaddr *)&server, sizeof(struct sockaddr));

if(i < 0)
    perror("Unable to bind\n");



i = listen(sockFd, 1);

if(i < 0)
    printf("Unable to listen\n");


int len = sizeof(struct sockaddr);

int connectionSocket = accept(sockFd, (struct sockaddr *) &client, &len);

if(connectionSocket < 0)
    perror("connection not established\n");


   // from this point onwards, send & receive data.

答案 1 :(得分:1)

除了关闭套接字外,你做的一切都正常。不要关闭它:返回套接字。否则你只是打开另一个时间窗口,在此期间可以通过别的东西抓住端口。

bind()失败时循环是毫无意义的。整个事情真的没有意义。您正在指定一个零端口,因此您将获得系统分配的端口,除非端口空间耗尽。这是你在创建所需套接字时应该做的创建另一个套接字只是为了试图“保留”一个端口是没有意义的。保留端口的方法是创建所需的套接字。