在 C 语言中保留端口号的更简单方法



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

 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()失败时循环是没有意义的。整件事真的毫无意义。您指定了一个零端口,因此您将获得一个系统分配的端口,除非端口空间已用尽。这是您在创建所需套接字时应该做的。仅仅为了"保留"端口而创建另一个套接字是没有意义的。保留端口的方法是创建所需的套接字。

保留端口数字:

您不能事先为程序/应用程序保留端口号。 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 socketn");

int i = bind(sockFd, (struct sockaddr *)&server, sizeof(struct sockaddr));
if(i < 0)
    perror("Unable to bindn");

i = listen(sockFd, 1);
if(i < 0)
    printf("Unable to listenn");

int len = sizeof(struct sockaddr);
int connectionSocket = accept(sockFd, (struct sockaddr *) &client, &len);
if(connectionSocket < 0)
    perror("connection not establishedn");

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

最新更新