2011-03-31 111 views
1

這是我的服務器程序在C主代碼:C中的TCP服務器 - 端口總是增加?

int main(int argc, char** argv) 
{ 
    int sock, connected, bytes_received, true = 1; 

    struct sockaddr_in server_addr, client_addr; 
    int sin_size; 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 

    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &true, sizeof (int)) == -1) { 
     perror("Setsockopt"); 
     exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(atoi(argv[1])); 
    server_addr.sin_addr.s_addr = INADDR_ANY; 
    bzero(&(server_addr.sin_zero), 8); 

    if (bind(sock, (struct sockaddr *) &server_addr, sizeof (struct sockaddr)) 
      == -1) { 
     perror("Unable to bind"); 
     exit(1); 
    } 

    if (listen(sock, 5) == -1) { 
     perror("Listen"); 
     exit(1); 
    } 

    printf("\nTCPServer Waiting for client on port 5000"); 
    fflush(stdout); 

    while (1) 
    { 
     pthread_t child; 

     sin_size = sizeof (struct sockaddr_in); 
     connected = accept(sock, (struct sockaddr *) &client_addr, &sin_size); 
     printf("\n I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 

     threadInfo info; 
     info.argumentsPassedToCode = argv; 
     info.connected = connected; 

     pthread_create(&child, NULL, interpretMessage, &info); 
    } 

    close(sock); 
    return 0; 
} 

我的服務器總是打印出傳入連接的IP,而且它是來自於該端口。我注意到端口一直在增加。

  1. 這是正常的嗎?如果不是,我做錯了什麼?
  2. 如果我的服務器運行了很長時間,它是否會耗盡端口?如果是這樣,會發生什麼?
+0

你沒有表現interpretMessage'的'執行 - 它始終貼近'info.connection'?您可能想要使用諸如'lsof'的程序來列出您的服務器仍在使用的端口.... – 2011-03-31 05:04:04

回答

4
  1. 如果你的服務器正在工作,你沒有做錯任何事情。源端口不保證遵循一個模式,它們只是爲了完成連接元組(源端口,源地址,目標端口,目標地址)而存在。
  2. 一旦連接關閉,端口被重用,所以你應該沒問題。
2

1)是;下一個可用端口被選中。它可以是相同的端口(如果prev套接字已被內核釋放),它可以是下一個空閒端口或任何其他空閒的端口,從1024到65535(如你所知,前1024個是保留的)。在你的情況下,你看到一個不同的客戶端口號,因爲要麼你沒有正確關閉客戶端套接字,或者在進行下一個連接時以前的套接字仍然存在,或者你只是進行多個並行連接。

2)If你沒有正確地關閉套接字,你會(如果你的默認每進程限制低於1024 fds per proc,你可能會首先用完文件描述符)。如果你確實把它們撕下來,那麼你會好的