这是一个我不太了解的异步套接字方案...我有2个Tcp套接字,一个客户端套接字和一个服务器套接字。我的服务器套接字已绑定(bind)并正在监听端口。

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

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

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

谢谢

最佳答案

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

认为它就像寄一封信。它位于您的邮箱中,直到 postman 将其捡起为止。一旦发生这种情况,它就被发送了。尚未收到。它可能正在运输中,或者可能正在其邮箱中等待他们阅读。

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

10-08 02:36