Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

accept sur socket non bloquante

2 réponses
Avatar
François Meyer
Bonjour,

Sur un serveur tcp je veux faire un accept sur une socket
non bloquante (histoire de pouvoir causer au serveur sur stdin
depuis le processus qui le lance, mais peu importe la raison).

Le problème est que j'obtiens un résultat aléatoire, c'est à
dire que ce schéma ne fonctionne qu'une fois sur deux (en gros),
le serveur passant bien à travers l'accept.
Les autres fois, tout se passe comme si la socket restait bloquante :
un peu de code:

sockfd = socket(AF_INET, SOCK_STREAM, 0);
...
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0) {
...
}

listen(sockfd,1);
clilen = sizeof(cli_addr);

// socket non bloquante :
ret=fcntl(sockfd, F_GETFL, &flags);
if (ret<0){
perror("Error fcntl getting flags:");
}
flags |= O_NONBLOCK;
ret=fcntl(sockfd, F_SETFL, &flags);
if (ret<0){
perror("Error fcntl setting flags:");
}

fprintf(stdout,"#WAITCONNECT\n");
while (1){
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd<0){ // pas de connection en attente
stdwait(buffer,0); // Le pere scrute stdin pour
// repondre au ping ou mourir
}
else{ // une connection est faite
pid=fork(); // on forke
if (pid==0){ // le fils ...
return (newsockfd); // retourne la chaussette
// et va mourir ailleurs
}
else{ // le papa ...
close(newsockfd); // ferme la chaussette
waitpid(pid,&status,0); // et attend la mort du ptit
fprintf(stdout,"#WAITCONNECT\n");
}
}
}


Aucun appel système ne retourne d'erreur et pourtant une fois ça marche,
une fois pas... Où merdouillé-je ?

Merci
croisé fcolc, fclc, suivi fr.comp.lang.c
--
François Meyer

2 réponses

Avatar
Eric Levenez
Le 6/06/07 10:23, dans <46666f0c$0$5006$, « François
Meyer » a écrit :

sockfd = socket(AF_INET, SOCK_STREAM, 0);
...


Ces points de suspensions contiennent-ils bien un code du genre :

int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt))

if (bind(sockfd, (struct sockaddr *) &serv_addr,


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
François Meyer
Eric Levenez wrote:
Le 6/06/07 10:23, dans <46666f0c$0$5006$, « François
Meyer » a écrit :

sockfd = socket(AF_INET, SOCK_STREAM, 0);
...


Ces points de suspensions contiennent-ils bien un code du genre :

int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt))


Presque mot pour mot, ainsi que les règlages de serv_addr.
J'ai un peu trop élagué effectivement.

if (bind(sockfd, (struct sockaddr *) &serv_addr,



--
François Meyer