2011-11-23 121 views
0

我有一个客户端TCP套接字,每5秒钟写入几个字节,服务器回应字节回来。Tcp套接字读取总是阻止

连接()写()工作蛮好的,我有通知我服务器的回声的IP层的回调。这在发送之间可靠地发生。

但我无法从套接字读取回显。

我试过用select()来通知我传入的回声。奇怪的是,我的回调没有被调用,直到我关闭套接字,此时它被连续调用。然而,对于这些呼叫中的每一个,read()返回-1/WOULD_BLOCK。

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

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

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

+1

当你调用read()时,你提供的count值是多少? – TJD

+0

请显示您的实际阅读代码。你明显使用API​​错误。我的猜测是你滥用'SOCKET'手柄。 –

+0

@TJD:'count'表示字节数?我分配并要求高达4k。相同的代码适用于UDP recv(),当然,对于UDP,我传递其他fromaddr参数。 –

回答

-1

看来服务器处于TCP回显应用程序崩溃的状态,但UDP回显正常,并且TCP层仍能够处理流量。

因此,我的应用程序将从传入TCP的IP通知,并相信有一个回声被读取,但在套接字层找不到数据。我预计这意味着我在使用API​​或IP与套接字之间的层次时出现问题。不,通知是针对服务器ACK而不是回显,并且由于该通知是在TCP层处理的,所以它从未将其发送到套接字。

+0

这没有任何意义。如果TCP回显关闭,那么传入的TCP数据怎么可能?而且你没有在ACK上得到select()事件。毫无疑问,您使用的API错误,但是如果没有看到代码,则无法进一步评论。 – EJP

+0

服务器端TCP层正在处理消息传递,但客户端应用程序崩溃,因此没有数据。来自IP层的传入数据只是TCP消息。 –

+0

你也许可以提高你的语气只是一个smidge。 –