[英]How do you know if a Socket.Send() has worked?
一个很简单的问题 - 我一直有一些 TCP 数据包丢失(远程套接字没有收到它们),所以我正在考虑重新发送任何没有收到的数据包。
但是我需要知道什么时候发送不起作用才能做到这一点! 我知道 Send() 返回一个包含“发送到套接字的字节数”的整数,但即使另一台计算机什么也没收到,这始终是整个缓冲区的长度,表明所有内容(理论上)都已发送。 我也知道有一个 Socket.Connected 属性,但即使接收到该数据也是假的,有时即使没有收到也是真的,所以这也无济于事。
那么我怎么知道 Send() 是否有效呢?
Send()
只是将数据放在缓冲区中供网络适配器处理。 当Send()
返回时,即使套接字处于阻塞模式,您也不能保证有一个字节“离开”了您的计算机。
TCP 确保在连接内所有数据都按发送顺序接收。 它永远不会在对话过程中“忘记”一个数据包,并在需要时自动重新传输数据。
为了确定是否需要重传,协议会发送确认消息,但是:
Socket
类访问它们确保您的消息到达的最简单方法是让对方自己回复。 如果您在合理的时间内没有收到回复,您可以将该连接视为已断开。
关于 Sriram Sakthivel 和“其他人”之间的整个讨论——我遇到过类似的问题,即收到重复的消息和遗漏其他消息,但就我个人而言,这是由以下原因引起的:
BeginReceive()
(异步接收方法),BeginReceive()
调用中重用相同的缓冲区,以及BeginReceive()
,导致在读取旧消息之前用新数据填充缓冲区。执行此操作的理想方法是在发送消息后检查bufferedAmount
是否为零。 诀窍是,您必须让您的应用程序知道您实际上是在发送消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.