当前位置:  开发笔记 > 运维 > 正文

C socket:确实发送等待recv结束?

如何解决《Csocket:确实发送等待recv结束?》经验,为你挑选了2个好方法。

我在Windows上使用阻塞C套接字.我使用它们将数据的更新从服务器发送到客户端,反之亦然.我以高频率(每100毫秒)发送更新.该send()函数是否会recv()在结束前等待收件人接收数据?

如果我理解man手册页,我会假设:

"send()的成功完成并不能保证传递信息."

那么,如果一个人运行10次,send()而另一个只完成1次,会发生什么recv()

我是否需要使用某种确认系统?



1> doron..:

让我们假设您正在使用TCP.当您调用send时,您发送的数据会立即放在传出队列上,然后发送成功完成.但是,如果send无法将数据放在传出队列中,send将返回错误.

由于Tcp是保证传送协议,因此只有在远程端收到确认后才能删除传出队列上的数据.这是因为如果没有及时收到确认,则可能需要重新发送数据.

如果远程端缓慢,则传出队列将填满数据,然后发送将阻塞,直到有空间将新数据放在传出队列上.

然而,连接失败的方式是无法发送任何其他数据.虽然TCP连接一旦关闭,任何进一步的发送都将导致错误,用户无法知道实际上有多少数据到达另一方.(我知道无法从套接字检索TCP簿记到用户应用程序).因此,如果需要确认收到数据,您应该在应用程序级别实现此功能.

对于UDP,我认为不言而喻,某种方式报告已经收到或未收到的内容是必须的.



2> 小智..:

send()阻塞,直到操作系统(内核)获取数据并将其放入传出数据的缓冲区.它不会等到另一端收到数据.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有