C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用Winsock的send()/ recv()时是否需要确认响应?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Winsock,C,我使用send()/ recv(),TCP连接发送和接收数据.我想确保数据已经传递给另一方,并且想知道是否建议在(如果)使用recv接收数据之后发回一些确认消息.

这有两种可能性,请指出要走的路:

>如果send返回传递缓冲区的大小,则假设数据已至少传送到线路另一侧的recv函数.当我说“至少”时,我的意思是即使recv在那里失败(例如由于缓冲不足等原因),我也不在乎,我只是想确定我已经完成了我的服务器部分工作 – 我已完全发送数据(即数据到达另一台机器).
>使用附加确认:在使用recv接收数据后,发回一些接收到的数据包的ID(发送的每个数据的标题的一部分),用信号通知该数据包的成功接收操作.如果在一段时间后没有收到这样的“确认消息”,则从发送方功能返回失败代码.

第二个答案看起来更安全,但如果冗余,我不想让传输协议复杂化.另请注意,我在谈论TCP连接(它本身比UDP更安全).

有没有其他机制(可能是其他一些API?可能WSARecv()/ WSASend()工作方式不同?)确保数据传递到另一端的recv函数

如果你推荐第二种方式,请给我一些代码片段,允许我使用带超时的recv来接收确认? recv是一个阻塞操作,因此如果先前的发送尝试失败(另一方未收到通知),它将永久挂起.有没有任何简单的方法来使用带有超时的recv(每次都不创建单独的线程,这可能是每次发送操作的过度杀伤).

我传递给send函数的数据量也可能很大(几兆字节),那么如何选择“确认消息”的超时?也许我应该“拆分”大缓冲区并使用多个发送调用?我觉得它会变得很复杂,请指教!

编辑:好的,你们有人建议TCP / IP堆栈将处理它(即不需要手动确认),但这是我在MSDN页面上找到的:“成功完成发送功能并不表示数据成功发送和接收到收件人.此功能仅表示数据已成功发送.“因此,即使TCP机制具有确保数据传递的能力,我也无法通过send()函数或我知道的任何其他Winsock函数获得该状态(成功与否).你知道从TCP层获取状态的任何方法吗?再次 – send()函数的返回值似乎还不够!

================================================== ======

编辑2:好的,我认为我们同意即使TCP协议在出现问题时错误处理,Winsock的send()函数也无法报告错误(仅仅因为它在实际数据传输开始之前返回网络驱动程序).所以这里有一个百万美元的问题:Winsock的send()函数是否至少确保在当前数据包出现之前不会将其他数据包传递给另一方?换句话说,如果发送失败导致某些网络故障(但没有通过send()调用报告),然后在下一次调用send()函数和下一个数据块之前修复网络故障,那么是否可以确保上一个数据包(失败但send()没有报告)将在下一个数据包之前传递?换句话说,一个特定的send()函数是否有可能“静”失败,以便后续的send()调用成功,但第一个数据包将丢失?再次 – 我不是在谈论TCP级别,我正在谈论Winsock API级别!

解决方法

为什么不相信您的TCP / IP堆栈以保证交付.毕竟,这是使用TCP而不是UDP的重点.

大佬总结

以上是大佬教程为你收集整理的c – 使用Winsock的send()/ recv()时是否需要确认响应?全部内容,希望文章能够帮你解决c – 使用Winsock的send()/ recv()时是否需要确认响应?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。