Accepter plusieurs connexions ultérieures à socket

J’ai un auditeur qui transmettra des données arbitraires, des requêtes HTTP, à un socket réseau qui sera ensuite livré via TCP. Cela fonctionne correctement pour la première demande, mais le programme d’écoute n’accepte pas les nouvelles demandes ultérieures.

Ma question est:

Si j’ai sock=accept(listener,(struct addr *)&sin, &sinlen); ensuite, en fonction de la référence de la fonction socket, le socket de l’auditeur rest ouvert et je devrais être capable de rappeler call accept() autant de fois que nécessaire pour les requêtes suivantes. Est-ce correct? Si tel est le cas, une personne plus familière que moi avec la programmation de sockets peut-elle expliquer à quoi ce code pourrait ressembler?

Oui, vous pouvez accept() plusieurs fois sur le socket d’écoute. Pour desservir plusieurs clients, vous devez éviter de bloquer les E / S, c’est-à-dire que vous ne pouvez pas simplement lire à partir du socket et bloquer jusqu’à l’entrée des données. Il existe deux approches: vous pouvez servir chaque client dans son propre thread (ou son processus propre, en utilisant fork() sur les systèmes UNIX), ou vous pouvez utiliser select() . La fonction select() permet de vérifier si des données sont disponibles sur un groupe de descripteurs de fichiers. Il est disponible sous UNIX et Windows.

Voici un exemple simple tiré du Guide de la programmation réseau de Beej .

 while(1) { // main accept() loop sin_size = sizeof their_addr; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); if (new_fd == -1) { perror("accept"); continue; } inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), s, sizeof s); printf("server: got connection from %s\n", s); if (!fork()) { // this is the child process close(sockfd); // child doesn't need the listener if (send(new_fd, "Hello, world!", 13, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); // parent doesn't need this } 

Le processus enfant – après le fork() – gère la communication de manière asynchrone en accept() autres connexions dans le parent.

Oui, vous avez la bonne idée générale.

Bien que ma programmation de socket C soit un peu rouillée, l’appel à accepter sur une socket de serveur configure le canal de communication vers le côté client de la socket. L’appel d’accepter lors de tentatives de connexion futures configurera plusieurs canaux de socket.

Cela signifie que vous devez veiller à ne pas écraser une seule structure partagée avec les données d’une connexion spécifique, mais cela ne semble pas être le genre d’erreur que vous seriez susceptible de commettre.