欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tcp epoll 接收数据卡死

程序员文章站 2024-02-25 15:51:51
...

 今天遇见一个有点诡异的事情,我需要对tcp做点测试,就从网上找了一份代码[1]。我又找了个tcp的客户端[2],修改了一下,一共向服务器发送200M的数据。但是发现服务器接收一段数据后,打印的接收信息就不再变化了。截图如下,接收了13个数据包之后就不干活了。weired.
tcp epoll 接收数据卡死
 我找另外一个关于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

相关标签: tcp epoll 卡死