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:
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);
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.
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:
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);
}
en regardant le code je comprend toujours pas pourquoi ca bloque. Merci pour coup de main.