Tcp套接字读取总是阻塞

时间:2011-11-23 23:51:02

标签: sockets tcp udp ip berkeley-sockets

我有一个客户端TCP套接字,每隔五秒写一些字节,服务器会回显这些字节。

Connect() write()工作得很好,我在IP层有一个回调通知我服务器的回声。这在发送之间可靠地发生。

但是我无法从插座中读取回声。

我尝试使用 select()来通知我传入的回声。奇怪的是,直到我关闭套接字才调用我的回调,此时它被连续调用。但是,对于每个调用, read()返回-1 / WOULD_BLOCK。

当IP层通知我输入数据时,我的第二种方法异步调用 read()。同样, read()只返回-1 / WOULD_BLOCK。我意识到 read()可以将数据击败到套接字层,但希望在下一次写入后它只是意味着更多。

我倾向于认为我在某种程度上滥用了API,因为我是一个IP /套接字菜鸟而且选择方法表现得如此奇怪。

这不太可能是一个愚蠢的错误,因为几乎完全相同的代码路径适用于UDP模式。唯一的区别是:对于UDP我使用DATAGRAM模式,sendto()和recvfrom()。对于TCP,我使用STREAM模式,write()和read()。

1 个答案:

答案 0 :(得分:-1)

服务器似乎处于TCP回应应用程序崩溃的状态,但UDP回显很好,TCP层仍然能够处理流量。

因此,我的应用程序将从IP获取传入TCP的通知,并相信有一个要读取的回显,但在套接字层找不到数据。我预计这意味着我使用API​​或IP和套接字之间的层存在问题。不,通知是服务器ACK而不是回声,因为这是在TCP层处理的,所以它从未进入套接字。