C#Socket.BeginSend AsyncCallback行为(超时?)

时间:2010-03-18 22:24:48

标签: c# sockets asyncsocket

这是一个异步套接字的场景,我不太明白......我有2个Tcp套接字,一个客户端套接字&服务器套接字。我的服务器套接字是绑定的&在港口听。

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

我的BeginSend调用指定的AsyncCallback被调用&它的IAsyncResult告诉我它完成了&对Socket.EndSend()的调用不会引发任何异常......

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

由于

1 个答案:

答案 0 :(得分:3)

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

想想就像邮寄一封信一样。它位于您的邮箱中,直到邮件人员拿起它为止。一旦发生这种情况,它就会被发送。它还没有收到。它可能在传输中,或者它可能在他们的邮箱中等待他们阅读。

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