3

这是一个我不太了解的异步套接字场景......我有 2 个 Tcp 套接字,一个客户端套接字和一个服务器套接字。我的服务器套接字已绑定并在端口上侦听。

我的客户端套接字连接到服务器套接字(使用 BeginConnect / EndConnect)。然后我使用 BeginSend() 向服务器发送一条消息。在服务器端,我不执行 Receive() 或 BeginReceive()。

发生的情况是我为 BeginSend 调用指定的 AsyncCallback 被调用,它的 IAsyncResult 告诉我它已完成,对 Socket.EndSend() 的调用没有引发任何异常......

只有当 BeginSend 调用实际上向服务器发送了一些东西(即:在服务器接收到所有字节后调用回调)时,是否有我没有得到或不应该调用我的 AsyncCallback 的东西?如果服务器上没有完成接收,在 sendtimeout 到期后不应该调用我的回调并且我对 Socket.EndSend 的调用会引发异常吗?

谢谢

4

1 回答 1

3

不,TCP/IP 为您处理所有这些。连接的两端都有缓冲区,用于保存数据直到可以接收。如果没有缓冲,发送聊天通信时可能会有可怕的延迟。

把它想象成邮寄一封信。它会一直放在你的邮箱里,直到邮递员把它捡起来。一旦发生这种情况,它就被发送了。它还没有收到。它可能正在传输中,也可能正在他们的邮箱中等待他们阅读。

因此,在 BeginSend 之后获取回调只会告诉您它已发送。确定对方是否接收并处理了数据的唯一方法是请求一段时间的确认回复。

于 2010-03-18T22:55:36.133 回答