tcp epoll 接收数据卡死
程序员文章站
2024-02-25 15:51:51
...
今天遇见一个有点诡异的事情,我需要对tcp做点测试,就从网上找了一份代码[1]。我又找了个tcp的客户端[2],修改了一下,一共向服务器发送200M的数据。但是发现服务器接收一段数据后,打印的接收信息就不再变化了。截图如下,接收了13个数据包之后就不干活了。weired.
我找另外一个关于epoll tcp server的例子[3]。发现两者的数据读取处理不同。
[1]的代码,判断epoll事件为EPOLLIN,就调用read函数一次。
//判断epoll事件为EPOLLIN,之后
nread = read( evs[i].data.fd, buf, sizeof( buf ) );
[3]的数据读取逻辑,判断epoll事件为EPOLLIN,多次调用read函数,把所有的数据都读出去。
while (1)
{
ssize_t count;
char buf[512];
count = read (events[i].data.fd, buf, sizeof buf);
if (count == -1)
{
/* If errno == EAGAIN, that means we have read all
* data. So go back to the main loop. */
if (errno != EAGAIN)
{
perror ("read");
done = 1;
}
break;
}
else if (count == 0)
{
/* End of file. The remote has closed the
* connection. */
done = 1;
break;
}
}
上面代码中的注释很好,在tcp的non blocking模式,调用read函数,若返回值为0,说明对端调用了close函数。
[1]的问题就是数据到了很多,但是就读了那么几次,tcp缓冲区被填满。这里就需要区分epoll的EPOLLLT和EPOLLET模式[4]。
我擦,上午与晚上就这样过去了。摘取别人的代码需要付出代价。
顺便把我写的一个例子贴出来[5]。
[1]linux中的epoll机制
[2]tcp-client
[3]epoll-server
[4]epoll:EPOLLLT和EPOLLET的区别
[5]tcp epoll server example
上一篇: java泛型类的定义与使用详解
下一篇: 二维数组之鞍点