这是一个我不太明白的异步套接字场景...我有 2 个 Tcp 套接字,一个客户端套接字和一个服务器套接字。我的服务器套接字已绑定(bind)并正在监听端口。
我的客户端套接字连接到服务器套接字(使用 BeginConnect/EndConnect)。然后我使用 BeginSend() 向服务器发送一条消息。在服务器端,我不执行 Receive() 或 BeginReceive()。
发生的事情是我的 BeginSend 调用指定的 AsyncCallback 被调用并且它的 IAsyncResult 告诉我它已完成并且对 Socket.EndSend() 的调用没有引发任何异常...
只有当 BeginSend 调用实际向服务器发送了一些东西时(即:在服务器接收到所有字节后调用的回调),是否存在我没有得到或不应该调用我的 AsyncCallback 的东西?如果服务器上没有完成接收,我的回调是否应该在 sendtimeout 到期后调用,然后我对 Socket.EndSend 的调用会引发异常?
谢谢
最佳答案
不,TCP/IP 会为您处理所有这些。连接的两端都有缓冲区,可以保存数据直到可以接收到数据。如果没有缓冲,发送闲聊通信时可能会有可怕的延迟。
把它想象成邮寄一封信。它位于您的邮箱中,直到 postman 将其取走。一旦发生这种情况,它就被发送了。尚未收到。它可能正在运输途中,也可能正在他们的邮箱中等待他们阅读。
因此在 BeginSend 之后得到回调只会告诉您它已被发送。确定另一方是否接收并处理了数据的唯一方法是请求一定时间的确认。
关于C# Socket.BeginSend AsyncCallback 行为(超时?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473759/