日期:2014-05-16  浏览次数:20781 次

客户端只发了一句话,为什么非阻塞服务器端可以收到n多句一样的话?
这是自己学习用的一段代码
在client和server建立TCP/IP的连接以后
client端发一句话给server,然后就无限循环的停在那里,代码如下:
---------------     client.c     -------------------
    ……
    char               sendbuf[]   =   "1234567890123456789 ";
    ……
    write(sockfd,   sendbuf,   strlen(sendbuf));
    while(1)
    {
          sleep(10);
    }
------------------------------------------------
然后server端读取client发来的这句话,为了让server在套接口没数据的时候停止读往下继续运行,我将套接口设置成非阻塞的,代码如下:
----------------   server.c   -----------------------
  #define         MAXLINE           4096
      ……
      val   =   fcntl(sockfd,   F_GETFL,   0);
      if(val   <   0)
      {
printf( "[error]   get   sockfd   status   failed!\n ");      
      }
      m   =   fcntl(sockfd,   F_SETFL,   val   |   O_NONBLOCK);
      if(m   <   0)
      {
                  printf( "[error]   set   sockfd   status   failed!\n ");      
        }
               
        while(recv(sockfd,   buffer,   MAXLINE,   0))
        {          
                printf( "[buffer_len   =   %d]     %s\n ",   strlen(buffer),   buffer);
        }  

        ……
-----------------------------------------------------

然后现象就是client把1234567890123456789发给了server,server端却打出了n多句1234567890123456789

这是为什么啊,套接口的接收缓冲区在应用程序读完后不会自动清空吗?还是什么别的原因啊?



------解决方案--------------------
由于设置了 O_NONBLOCK
while(recv(sockfd, buffer, MAXLINE, 0))
recv 会返回-1,并设置了errno为EAGAIN, 而返回 -1 是不退出循环的。

[EAGAIN] The socket is marked non-blocking, and the receive
operation would block, or a receive timeout had been
set, and the timeout expired before data were
received.