fermer le socket client et garder le socket serveur actif

J’établis une connexion serveur-client à l’aide de sockets TCP. Chaque fois que je ferme le socket client, mon serveur est également fermé. Mais je veux que seul mon client soit fermé et que mon serveur doit attendre le prochain accept() .

Du côté serveur:

 { bind(lfd,(struct sockaddr*)&serv_addr, sizeof(serv_addr)); listen(lfd, 10); while(1) { cfd = accept(lfd, (struct sockaddr*)NULL, NULL); //server must wait here after client closes the connection application code close(lfd); } } 

côté client:

 inet_pton(AF_INET, argv[1], &serv_addr.sin_addr); connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); // ... application code if(c == 1) close(fd); 

Lorsque vous accept le côté serveur, vous générez un nouveau socket pour ce client uniquement.

Lorsque vous avez fini de traiter avec le client, vous devez close() ce socket (ce qui est close(cfd) dans votre terminologie). Vous pouvez également shutdown() le socket, ce qui influera sur la fermeture du socket à un niveau TCP. Mais que vous fassiez ou non un shutdown() , vous devez le close() , sinon vous fuiriez des FD.

Vous ne devez pas close() votre listen fd ( lfd dans votre programme) tant que vous n’avez pas l’intention de ne plus accepter de connexions.

TLDR: change close(lfd) pour close(cfd)

Le socket d’écoute TCP décrit par le descripteur lfd est utilisé pour attendre les connexions entrantes TCP sur un port spécifique. Une fois l’appel d’ accept un nouveau descripteur de socket est créé, le cfd de votre exemple.

Tous les échanges de données entre serveur et client sont effectués à l’aide du cfd . Si le client ferme d’abord le socket, un send ou une recv possible côté serveur renverra -1 avec la valeur errno appropriée.

Si vous souhaitez que le serveur ferme la connexion, vous devez utiliser shutdown(cfd, SHUT_RDWR) et close(cfd) après, NOT close(lfd) . Cela laisse la socket lfd s’ouvrir, permettant au serveur d’attendre l’ accept de la prochaine connexion entrante. Le lfd devrait se fermer à la fin du serveur.

La fonction shutdown() offre plus de flexibilité pour envoyer ou recevoir les données restantes avant la fin définitive de la communication.

accepter un appel renverrait le nouveau descripteur de socket (cfd dans votre code) connecté au côté client. Ainsi, lorsque le client ferme sa fin de connexion, cfd sera fermé et non lfd. Vous pouvez utiliser lfd (listening socket) pour accepter une connexion tant que le serveur en a besoin. Pensez également à appeler shutdown avant close (fd) dans le code client.