繁体   English   中英

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

[英]How do you know if a Socket.Send() has worked?

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

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

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

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

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

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

  • 你不能从Socket类访问它们
  • 主机可能会推迟发送此 ACK 消息

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

关于 Sriram Sakthivel 和“其他人”之间的整个讨论——我遇到过类似的问题,即收到重复的消息和遗漏其他消息,但就我个人而言,这是由以下原因引起的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM