使用Winsock的send()/recv()时是否需要确认响应? < >使用Winsock,C++,我用 sEnter()/ReCVE()/,TCP连接发送和接收数据。我想确定数据已发送给另一方,并想知道是否建议在(如果)使用recv接收数据后发回一些确认消息

使用Winsock的send()/recv()时是否需要确认响应? < >使用Winsock,C++,我用 sEnter()/ReCVE()/,TCP连接发送和接收数据。我想确定数据已发送给另一方,并想知道是否建议在(如果)使用recv接收数据后发回一些确认消息,c++,tcp,winsock,send,recv,C++,Tcp,Winsock,Send,Recv,这里有两种可能性,请建议走哪条路: 如果send返回传递的缓冲区的大小,则假定数据已至少传递到导线另一侧的recv函数。当我说“至少”时,我的意思是即使recv在那里失败(例如,由于缓冲区不足等),我不在乎,我只想确保我已经正确地完成了服务器部分的工作-我已经完全发送了数据(即,数据到达了另一台机器) 使用附加确认:在使用recv接收数据后,发回接收到的数据包的一些ID(发送的每个数据头的一部分),表示该数据包的成功接收操作。如果我在一段时间后没有收到这样的“确认消息”,则从发送方函数返回失败代

这里有两种可能性,请建议走哪条路:

  • 如果send返回传递的缓冲区的大小,则假定数据已至少传递到导线另一侧的recv函数。当我说“至少”时,我的意思是即使recv在那里失败(例如,由于缓冲区不足等),我不在乎,我只想确保我已经正确地完成了服务器部分的工作-我已经完全发送了数据(即,数据到达了另一台机器)

  • 使用附加确认:在使用recv接收数据后,发回接收到的数据包的一些ID(发送的每个数据头的一部分),表示该数据包的成功接收操作。如果我在一段时间后没有收到这样的“确认消息”,则从发送方函数返回失败代码

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

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

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

    另外,我传递给send函数的数据量可能相当大(数兆字节),因此如何选择“确认消息”的超时?也许我应该“拆分”大缓冲区并使用几个发送呼叫?我想事情会变得很复杂,请指教

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

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


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

    为什么不信任TCP/IP堆栈来保证传输。毕竟,这就是使用TCP而不是UDP的全部意义。

    如果您使用UDP,并且您关心ot实际接收的数据在她的方面,你需要使用ACK,但如果你不需要UDP的速度,你应该使用TCP,因为它为你提供了ACK。

    我认为你过于复杂了,请相信你的TCP/IP软件堆栈及其提供的可靠传输。TCP套接字操作的是数据流,而不是数据包。另外,对
    发送的一次调用也不能保证一个call to
    recv

    这里现有的答案基本上是正确的:如果你使用TCP,你真的不需要担心你的数据包是否可靠地传递给你的对等方

    但对于某些系统来说,这是一种危险的观点,在这些系统中,必须将数据完整性提升到下一个级别:通用标准审核要求FAU STG.4.1要求在审核日志可能丢失审核条目时能够防止可审核事件的发生。(例如,Linux
    auditd(8)
    audit logging daemon可以配置为将计算机置于单用户模式,或者在没有更多空间用于审核日志时完全停止系统。)远程系统的审核日志可能应该保留,直到知道它们已成功写入集中日志服务器

    金融交易可能最好使用比简单TCP更可靠的协议来处理——贷记或借记账户最好使用多级协议来处理,以确保有效性