bonjour,
en m'amusant un peu dans un programme je me suis rendu compte du pourquoi dans un precedent topic ma function read bloquait.
voici le code appellant read:quand je fait un telnet sur localhost je ne recois jamais ok. et printf qui doit m'afficher la tail recu et le text n'affiche jamais rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 connfd=accept(listenfd,(struct sockaddr*) &client,&len); for(;;) { ip=inet_ntoa(client.sin_addr); n_cport=ntohs(client.sin_port); fprintf(stdout,"connection from %s,port %d\n",ip,n_cport); //int s_s=fd_readln(connfd,buff,BUFF_SIZE); int s_s=fd_read(connfd,buff,BUFF_SIZE); fprintf(stdout,"[%d] %s",s_s,buff); if(s_s==4 && buff[0]=='\\' && buff[1]=='q') { sprintf(buff,"connected with %s and port %d\n",ip,n_cport); fd_write(connfd,buff,strlen(buff)); close(connfd); break; } fd_write(connfd,"OK \n",4); } close(listenfd);
j'ai envoye un text de dimension BUFF_SIZE par telnet et la j'ai recu la taille et le text
donc la fonction fd_read attend de recevoir un texte de dimension BUFF_SIZE avant de sortir. ce qui est tres embetant car je veux sortir si je recois "\q" c'est pour cela qu'il y a la deuxieme fonction fd_readln qui sort si j'ai atteind BUFF_SIZE ou si un '\n'
j'aimerai savoir si il y a un moyende lire la socket au rythme au quel je tape avec telnet et non pas attendre d'avoir remplis le buffer.
voici le code de fd_read a toute fin utiles:
en regardant le code je comprend toujours pas pourquoi ca bloque. Merci pour coup de main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 size_t fd_read(int fd, void *buff, size_t nbyte) { size_t nleft; size_t nread; char *ptr; ptr=buff; nleft=nbyte; while(nleft>0) { if((nread=read(fd, ptr, nleft))<0) { if(errno==EINTR) nread=0; else return -1; } else if(nread==0) break; /*EOF*/ nleft -= nread; ptr += nread; } return (nbyte - nleft); }
Partager