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

标签 c# sockets asyncsocket

这是一个我不太明白的异步套接字场景...我有 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/

相关文章:

c++ - 绑定(bind)在同一端口上的两个进程如何接收相同的消息?

sockets - 同时处理多个连接的最佳方法

android - 使用 AsyncTask 从错误的线程异常中调用

c# - 如何将字节 [] 写入 Excel 文件?

c# - 在C#中设置允许快速插入/删除和随机选择

sockets - 如何处理java.net.SocketException : too many open files in dispatch/reboot?

.net - SocketAsyncEventArgs.Completed 在 Windows 8 中不会触发

C# 套接字检查连接

c# - C#套接字,如何获取所有监听(套接字)计算机的IP地址和端口号

c# - 我不使用 Newtonsoft.Json,但收到错误消息说找不到它