您好我想知道是否有更简单的方法来检查端口号是否可用,我想保留它以便我可以提前使用它?下面的代码就是这样做的,但它似乎过于复杂。
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);
}
答案 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()
失败时循环是毫无意义的。整个事情真的没有意义。您正在指定一个零端口,因此您将获得系统分配的端口,除非端口空间耗尽。这是你在创建所需套接字时应该做的。创建另一个套接字只是为了试图“保留”一个端口是没有意义的。保留端口的方法是创建所需的套接字。