客户端只发了一句话,为什么非阻塞服务器端可以收到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.