accept sur socket non bloquante

Le
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üntl(sockfd, F_GETFL, &flags);
if (ret<0){
perror("Error fcntl getting flags:");
}
flags |= O_NONBLOCK;
retüntl(sockfd, F_SETFL, &flags);
if (ret<0){
perror("Error fcntl setting flags:");
}

fprintf(stdout,"#WAITCONNECT");
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");
}
}
}


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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric Levenez
Le #986888
Le 6/06/07 10:23, dans Meyer »
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 -- Unix is not only an OS, it's a way of life.

François Meyer
Le #986742
Eric Levenez
Le 6/06/07 10:23, dans Meyer »
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


Publicité
Poster une réponse
Anonyme