Je viens de reproduire la chose avec deux bouts de programmes écrits en C (voir les deux pièces jointes).
hilbert:[~/rpl-test] > ./server
[+]Server Socket is created.
[+]Bind to port 4444
[+]Listening....
accept(3, 4)
Connection accepted from 127.0.0.1:43388
Client: aze
Disconnected from 127.0.0.1:43388
shutdown: 0
close: 0
accept(3, 6)
Connection accepted from 127.0.0.1:49504
Client: aze
Disconnected from 127.0.0.1:49504
shutdown: 0
close: 0
hilbert:[~/rpl-test] > ./client
[+]Client Socket is created.
[+]Connected to Server.
Client: aze
Server: aze
Client: :exit
[-]Disconnected from server.
hilbert:[~/rpl-test] > ./client
[+]Client Socket is created.
[+]Connected to Server.
Client: aze
Server: aze
Client: :exit
[-]Disconnected from server.
Un coup de valgrind montre exactement la même chose lorsque le
processus serveur racine est tué par un SIGINT :
==10415== Process terminating with default action of signal 2 (SIGINT)
==10415== at 0x49A04D0: accept (accept.c:26)
==10415== by 0x109233: main (tcpServer.c:52)
==10415==
==10415== FILE DESCRIPTORS: 7 open (3 std) at exit.
==10415== Open AF_INET socket 6: 127.0.0.1:4444 <-> 127.0.0.1:57256
==10415== at 0x49A04D0: accept (accept.c:26)
==10415== by 0x109233: main (tcpServer.c:52)
==10415==
==10415== Open AF_INET socket 4: 127.0.0.1:4444 <-> 127.0.0.1:46402
==10415== at 0x49A04D0: accept (accept.c:26)
==10415== by 0x109233: main (tcpServer.c:52)
==10415==
==10415== Open AF_INET socket 3: 127.0.0.1:4444 <-> unbound
==10415== at 0x49A0BA7: socket (syscall-template.S:120)
==10415== by 0x109141: main (tcpServer.c:25)
==10415==
==10415== Open file descriptor 5:
==10415== <inherited from parent>
Les sockets créées par accept() [ici fd=4 et fd=6] restent ouvertes dans
le processus racine du serveur et au bout d'un certain nombre de
connexions (dépendant de la valeur max open files), accept() retourne
une erreur.
À noter : la socket est bien fermée dans le processus créé par fork()
[shutdown + close] et est fermée dans le client.
Merci de vos lumières,
JB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 4444
int main(){
int clientSocket, ret;
struct sockaddr_in serverAddr;
char buffer[1024];
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if(clientSocket < 0){
printf("[-]Error in connection.\n");
exit(1);
}
printf("[+]Client Socket is created.\n");
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if(ret < 0){
printf("[-]Error in connection.\n");
exit(1);
}
printf("[+]Connected to Server.\n");
while(1){
printf("Client: \t");
scanf("%s", &buffer[0]);
send(clientSocket, buffer, strlen(buffer), 0);
if(strcmp(buffer, ":exit") == 0){
printf("shutdown: %d\n", shutdown(clientSocket, SHUT_RDWR));
printf("close: %d\n", close(clientSocket));
printf("[-]Disconnected from server.\n");
exit(1);
}
if(recv(clientSocket, buffer, 1024, 0) < 0){
printf("[-]Error in receiving data.\n");
}else{
printf("Server: \t%s\n", buffer);
}
}
return 0;
}
signature.asc
Description: OpenPGP digital signature

