服务端是用epoll et模式写的echo服务器 ,更改了accept函数返回的fd为NONBLOCK模式
下文代码是客户端的一部分接收和发送代码
乍一看没有什么问题,但是在运行时发生了意料之外的事
while(1)
{
printf("Please input: ");
scanf("%s", buff);
int ss=strlen(buff);
int ret= send(sockfd, buff,ss, 0);
if(ret==-1)
{
printf("send error(%d) :%s n",errno,strerror(errno));
return -1;
}
memset(buff,0,sizeof(buff));
while(1)
{
ret=recv(sockfd, buff,sizeof(buff), 0);
if(errno==EAGAIN) break;
}
printf("Recv: %sn", buff);
}
这是截取的一部分执行结果
可以看出来在第一次输入11之后,客户端并没有按照约定输出11,而是输出了一个空字符串
在之后的输入中,客户端输出的数据都是上一次操作输入到客户端中的
猜测问题在于调用send函数发送数据后,因为sockfd是非阻塞的,所以没有等到服务端给客户端返回数据时,客户端就已经输出了缓冲区的数据。很显然,这时缓冲区为空字符串。
while(1)
{
printf("Please input: ");
scanf("%s", buff);
int ss=strlen(buff);
int ret= send(sockfd, buff,ss, 0);
if(ret==-1)
{
printf("send error(%d) :%s n",errno,strerror(errno));
return -1;
}
sleep(1);
memset(buff,0,sizeof(buff));
while(1)
{
ret=recv(sockfd, buff,sizeof(buff), 0);
if(errno==EAGAIN) break;
}
printf("Recv: %sn", buff);
}
如上文代码,在服务端recv之前调用sleep(1),即可解决上述问题。
但是感觉用这种方式解决略显随意,希望以后能找到更好的解决方法。



