gpt4 book ai didi

c - 在 C 中保留端口号的更简单方法

转载 作者:行者123 更新时间:2023-11-30 18:57:50 27 4
gpt4 key购买 nike

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

 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);

}

最佳答案

除了关闭套接字之外,您所做的一切都是正确的。不要关闭它:返回套接字。否则,您只是打开另一个计时窗口,在此期间端口可以被其他东西占用。

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

关于c - 在 C 中保留端口号的更简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19374997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com