-1

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

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

}

4

2 回答 2

1

预留端口号:

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


检查端口号是否可用:

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

欲了解更多信息: Linux 人


简单的示例代码:

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.
于 2013-10-15T07:01:09.620 回答
1

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

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

于 2013-10-15T07:02:24.033 回答