gpt4 book ai didi

c++ - 使用Winsock的send()/recv()时,确认响应是否必要?

转载 作者:可可西里 更新时间:2023-11-01 02:33:25 26 4
gpt4 key购买 nike

使用C++的Winsock,我使用 send()/recv() TCP连接来发送和接收数据。我想确定数据已经传递给另一方,并且想知道是否建议在(如果)使用 recv 接收数据后发送一些确认消息。

这有两种可能性,请提出建议:

  • 如果发送返回传递的缓冲区的大小,则假定数据至少已传递到线路另一侧的 recv 函数。当我说“至少”时,我的意思是即使 recv 在那里失败(例如,由于缓冲区不足等),我也不在乎,我只是想确保自己已完成服务器的部分工作正确-我已经完全发送了数据(即数据已到达另一台计算机)。
  • 使用其他确认:在使用 recv 接收到数据之后,发回一些已接收数据包的ID(已发送的每个数据的 header 的一部分),表示该数据包的成功接收操作。如果经过一段时间后仍未收到此类“确认消息”,请从发送方函数返回失败代码。

  • 第二个答案看起来更安全,但是如果冗余的话,我不想使传输协议(protocol)复杂化。还请注意,我在说的是TCP连接(它本身比UDP更安全)。

    是否有其他机制(可能还有其他一些API?也许 WSARecv()/WSASend()的工作方式不同?)来确保将数据传递到另一侧的 recv 函数中?

    如果您推荐第二种方法,请给我一些代码片段,使我可以在超时的情况下使用 recv 来接收确认吗? recv 是一项阻止操作,因此如果上一次发送尝试失败(未通知另一方),它将永久挂起。有没有一种简单的方法可以将 recv 与超时一起使用(每次都没有创建单独的线程,这可能对每个 发送操作来说都是过大的杀伤力)。

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

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

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

    编辑2:好的,我认为我们同意,即使TCP协议(protocol)在出现问题时也考虑错误处理,Winsock的 send()函数也无法报告错误(这是因为它在实际数据传输开始之前就返回了)通过网络驱动程序)。因此,这是一个百万美元的问题:Winsock的 send()函数是否至少确保在当前数据包发送之前没有其他数据包传递给对方?换句话说,如果由于某些网络故障而发送失败(但未通过 send()调用报告),则将在下一次调用 send()函数的下一个数据块之前修复网络故障,将是否确保先前的数据包(失败但未通过 send()报告的数据包)将在下一个数据包之前传递?换句话说,一个特定的send()函数是否有可能“无声地”失败,从而随后的send()调用将成功但第一个数据包将丢失?再次-我不是在TCP级别,而是Winsock API级别!

    最佳答案

    您为什么不信任您的TCP/IP堆栈来保证交付。毕竟,这就是使用TCP而不是UDP的全部要点。

    关于c++ - 使用Winsock的send()/recv()时,确认响应是否必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6318939/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com