0

我有一个客户端 TCP 套接字,它每五秒写入几个字节,服务器立即回显这些字节。

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

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

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

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

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

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

4

1 回答 1

-1

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

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

于 2011-11-29T01:12:05.467 回答