2011-03-31 4 views
1

Ceci est le code principal de mon programme serveur dans C:TCP Server dans C - Ports toujours croissant?

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

Mon serveur imprime toujours l'adresse IP de la connexion entrante et le port qu'il arrive depuis. J'ai remarqué que les ports sont toujours en augmentation.

  1. Est-ce normal? Sinon, qu'est-ce que je fais de mal?
  2. Si mon serveur fonctionne longtemps, est-ce qu'il manquera de ports? Si oui, que va-t-il se passer?
+0

Vous ne présentez pas la mise en œuvre de 'interpretMessage' - t-il toujours près' info.connection'? Vous pouvez vouloir utiliser un programme tel que 'lsof' pour lister les ports que votre serveur utilise encore .... –

Répondre

2

TCP a un état appelé TIME_WAIT qui est utilisé pour s'assurer que tout a été envoyé et reçu correctement avant de nettoyer le socket. Cela se produit après que vous avez fermé le socket dans votre code. L'heure à laquelle une socket est dans l'état TIME_WAIT dépend du système d'exploitation. C'est pourquoi vous n'obtenez pas le même port pour les connexions client.

Vous pouvez en savoir plus sur l'état ici: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait

4
  1. Si votre serveur fonctionne, vous ne faites rien de mal. Les ports source ne sont pas garantis de suivre un modèle, ils existent juste pour compléter le tuple de connexion, (port source, adresse source, port dest, adresse dest).
  2. Les ports sont réutilisés une fois les connexions fermées, vous devriez donc être d'accord.
2

1) Oui; le port disponible suivant est sélectionné. Il peut s'agir du même port (si le socket prev a déjà été libéré par le noyau), il peut s'agir du port libre suivant ou de tout autre port libre, de 1024 à 65535 (les premiers 1024 sont réservés comme vous le savez); Dans votre cas, vous voyez un numéro de port client différent, soit parce que vous ne fermez pas correctement le socket client, soit lorsque le socket précédent persiste lorsque vous établissez la connexion suivante ou que vous établissez simplement plusieurs connexions parallèles

2) Si vous n'arrêtez pas correctement les sockets, vous le ferez (il y aura probablement d'abord un descripteur de fichier si vous avez des limites par défaut moins élevées, c'est-à-dire ... 1024 fds par proc?); Si vous les supprimez correctement, alors tout ira bien