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:
// 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