确保发送send()数据

时间:2011-01-26 22:27:12

标签: winsock send reliability

有没有办法检查使用winsock的send()或WSASend()发送的数据是否真的传递到目的地?

我正在编写一个与第三方服务器通信的应用程序,有时在工作一段时间后会停机,并且需要确定发送到该服务器的消息是否已发送。问题是有时调用send()完成没有错误,即使服务器已经关闭,只有下一个send()完成错误 - 所以我不知道是否已经发送了上一条消息。

我想在TCP层上有信息,如果发送的某些(或所有)数据包是否被激活,但是使用套接字接口不可用(或者我找不到办法)。

最糟糕的是,我无法更改服务器的代码,因此我无法收到任何传递确认消息。

2 个答案:

答案 0 :(得分:0)

不是从return()返回。所有send()都表示数据已被推送到发送缓冲区。连接的套接字流不保证发送所有数据,只是数据将按顺序排列。因此,您不能假设您的send()将在单个数据包中完成,或者由于网络延迟或中断而发生。

如果您需要完整的确认,则必须查看更高的应用程序级别的ack(服务器发送格式化的ack消息,而不仅仅是数据包ACK)。

答案 1 :(得分:0)

对不起,但考虑到你要实现的目标,你应该意识到,即使TCP堆栈可以指示远程TCP堆栈确认了一组特定的字节,它也不会实际上意味着与你目前所知的不同。

问题在于,除非您从远程应用程序获得应用程序级别的ACK,只有在远程应用程序对您发送给它的数据进行操作后才会发送,然后您将永远无法确定数据是否已被远程应用程序。

  

'但我可以认为它足够接近'

只是妄想。如果你的发送完成,你也可以做出这个假设,因为它是有效的。

问题在于,即使TCP堆栈可以告诉您远程堆栈已确认数据(1)与接收数据的远程应用程序(2)不同,这也不是一回事作为远程应用程序实际使用数据(3)。

鉴于远程应用程序COULD在任何时候崩溃,1,2或3,数据已到达的唯一有价值的指示是远程应用程序在将数据用于预期目的之后发送的指示。

其他一切都只是一厢情愿。