使用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(发送的每个数据头的一部分),表示该数据包的成功接收操作。如果我在一段时间后没有收到这样的“确认消息”,则从发送方函数返回失败代
编辑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 torecv
这里现有的答案基本上是正确的:如果你使用TCP,你真的不需要担心你的数据包是否可靠地传递给你的对等方
但对于某些系统来说,这是一种危险的观点,在这些系统中,必须将数据完整性提升到下一个级别:通用标准审核要求FAU STG.4.1要求在审核日志可能丢失审核条目时能够防止可审核事件的发生。(例如,Linuxauditd(8)
audit logging daemon可以配置为将计算机置于单用户模式,或者在没有更多空间用于审核日志时完全停止系统。)远程系统的审核日志可能应该保留,直到知道它们已成功写入集中日志服务器
金融交易可能最好使用比简单TCP更可靠的协议来处理——贷记或借记账户最好使用多级协议来处理,以确保有效性