相当简单的问题 - 我一直在丢失一些TCP数据包(远程套接字没有收到它们),所以我正在考虑重新发送任何未收到的数据包。
但是我需要知道发送不起作用才能做到这一点!我知道Send()返回一个包含'发送到Socket的字节数'的整数,但即使另一台计算机什么也没有收到,这总是整个缓冲区的长度,表明一切都是(理论上)发送的。我也知道有一个Socket.Connected属性,但即使接收到这个数据也是如此,有时即使不是这样也是如此,所以这也无济于事。
那我怎么知道Send()是否有效?
答案 0 :(得分:1)
Send()
只是将数据放在缓冲区中供网络适配器处理。当Send()
返回时,即使套接字处于阻塞模式,也无法保证单个字节“离开”您的计算机。
TCP确保在连接中按照发送顺序接收所有数据。它永远不会在对话过程中“忘记”数据包,并在需要时自动重新传输数据。
要确定是否需要重新传输,协议会发送确认消息,但是:
Socket
类确保您的消息到达的最简单方法是让对方自己回复。如果您未在合理的时间内收到回复,则可以将该连接视为已损坏。
关于Sriram Sakthivel与“其他人”之间的整个讨论 - 我遇到了类似的问题,即接收重复的邮件并遗漏其他邮件,但在我的个人情况下这是由以下原因造成的:
BeginReceive()
(异步接收方法),BeginReceive()
来电时重复使用相同的缓冲区,BeginReceive()
,导致缓冲区在读取旧消息之前填充新数据。答案 1 :(得分:0)
执行此操作的理想方法是在发送消息后检查bufferedAmount
是否为零。诀窍是,您必须让您的应用程序知道您实际上正在发送消息。