服务器在数据库已满时无法从套接字读取数据

时间:2014-01-16 16:29:19

标签: c linux sockets tcp

我有一个基于LINUX的服务器应用程序正在读取已满的套接字(我通过执行Wireshark捕获确定它已满,并注意到TCP连接上有一个TCP ZeroWindow,这意味着接收套接字缓冲区已满。

由于某种原因,服务器进入一种状态,它不再能够读取完整套接字接收缓冲区中的数据,并且因为这段代码在循环中运行,所以它无限期地保持在这种状态并且套接字连接仍然是开放的。

为了从套接字获取数据,我的应用程序使用了以下组合:

ppoll
ioctl
recv

(按此顺序执行)。例如:

lPollRes =ppoll (&lPollFd, 1, &lTimeOut, NULL);
ioctl (aSocket, FIONREAD, &lNbBytesToRead)
recv (aSocket, apBuffer, lNbBytesToRead, 0)

进行了适当的错误检查,并且值得注意的是,ppoll配置了超时1秒,因此不会无限期挂起。

我还试图弄清楚我正在为套接字监听的文件描述符是否可能错误地陷入了尚未准备好处理I / O的状态,但我无法确定这一点(至少据我所知。)

值得注意的是,这种行为不会经常重现。实际上,它是可重现的,但需要数千个连接才能不时地重现它。

所以我正在寻找可能的解释,看看为什么会出现这种情况。

谢谢!

0 个答案:

没有答案