首页 文章

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

提问于
浏览
3

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

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

发生的事情是我为我的BeginSend调用指定的AsyncCallback被调用并且它的IAsyncResult告诉我它已完成并且对Socket.EndSend()的调用不会引发任何异常......

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

谢谢

1 回答

  • 3

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

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

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

相关问题