你怎么知道Socket.Send()是否有效?

时间:2013-11-18 14:42:44

标签: c# .net sockets

相当简单的问题 - 我一直在丢失一些TCP数据包(远程套接字没有收到它们),所以我正在考虑重新发送任何未收到的数据包。

但是我需要知道发送不起作用才能做到这一点!我知道Send()返回一个包含'发送到Socket的字节数'的整数,但即使另一台计算机什么也没有收到,这总是整个缓冲区的长度,表明一切都是(理论上)发送的。我也知道有一个Socket.Connected属性,但即使接收到这个数据也是如此,有时即使不是这样也是如此,所以这也无济于事。

那我怎么知道Send()是否有效?

2 个答案:

答案 0 :(得分:1)

Send()只是将数据放在缓冲区中供网络适配器处理。当Send()返回时,即使套接字处于阻塞模式,也无法保证单个字节“离开”您的计算机。

TCP确保在连接中按照发送顺序接收所有数据。它永远不会在对话过程中“忘记”数据包,并在需要时自动重新传输数据。

要确定是否需要重新传输,协议会发送确认消息,但是:

  • 您无法从Socket
  • 访问它们
  • 主机可以推迟发送此ACK消息

确保您的消息到达的最简单方法是让对方自己回复。如果您未在合理的时间内收到回复,则可以将该连接视为已损坏。

关于Sriram Sakthivel与“其他人”之间的整个讨论 - 我遇到了类似的问题,即接收重复的邮件并遗漏其他邮件,但在我的个人情况下这是由以下原因造成的:

  • 使用BeginReceive()(异步接收方法),
  • 在每次BeginReceive()来电时重复使用相同的缓冲区,
  • 在处理该缓冲区之前调用BeginReceive(),导致缓冲区在读取旧消息之前填充新数据。

答案 1 :(得分:0)

执行此操作的理想方法是在发送消息后检查bufferedAmount是否为零。诀窍是,您必须让您的应用程序知道您实际上正在发送消息。