加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用Winsock的send()/ recv()时是否需要确认响应?

发布时间:2020-12-16 09:35:20 所属栏目:百科 来源:网络整理
导读:使用Winsock,C,我使用send()/ recv(),TCP连接发送和接收数据.我想确保数据已经传递给另一方,并且想知道是否建议在(如果)使用recv接收数据之后发回一些确认消息. 这有两种可能性,请指出要走的路: 如果send返回传递缓冲区的大小,则假设数据已至少传送到线路另
使用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的重点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读