我在Windows上使用阻塞C套接字.我使用它们将数据的更新从服务器发送到客户端,反之亦然.我以高频率(每100毫秒)发送更新.该send()
函数是否会recv()
在结束前等待收件人接收数据?
如果我理解man手册页,我会假设:
"send()的成功完成并不能保证传递信息."
那么,如果一个人运行10次,send()
而另一个只完成1次,会发生什么recv()
?
我是否需要使用某种确认系统?
让我们假设您正在使用TCP.当您调用send时,您发送的数据会立即放在传出队列上,然后发送成功完成.但是,如果send无法将数据放在传出队列中,send将返回错误.
由于Tcp是保证传送协议,因此只有在远程端收到确认后才能删除传出队列上的数据.这是因为如果没有及时收到确认,则可能需要重新发送数据.
如果远程端缓慢,则传出队列将填满数据,然后发送将阻塞,直到有空间将新数据放在传出队列上.
然而,连接失败的方式是无法发送任何其他数据.虽然TCP连接一旦关闭,任何进一步的发送都将导致错误,用户无法知道实际上有多少数据到达另一方.(我知道无法从套接字检索TCP簿记到用户应用程序).因此,如果需要确认收到数据,您应该在应用程序级别实现此功能.
对于UDP,我认为不言而喻,某种方式报告已经收到或未收到的内容是必须的.
send()
阻塞,直到操作系统(内核)获取数据并将其放入传出数据的缓冲区.它不会等到另一端收到数据.