【发布时间】:2018-06-10 22:49:54
【问题描述】:
Beej 的套接字编程指南/教程提供了一个易于使用的 sn-p,用于通过 send 发送所有数据。它被称为sendall,并在此处提供 - http://beej.us/guide/bgnet/html/single/bgnet.html#sendall
没有为recv all 提供这样的明确指导,尽管声明recv 也可以是部分的。为什么?
另外,我如何编写类似于sendall 建议的非阻塞recvall 函数。尽管没有简单的答案,但这似乎是常见问题解答。
【问题讨论】:
-
sendall() 知道它必须发送多少数据。由于普通 TCP 是一个字节/八位字节流协议,除非指定 TCP 之上的消息协议,否则不可能有这样的“recvall”功能。
-
@MartinJames - 谢谢,这很有帮助。
-
你能解释一下接收全部并且也是非阻塞是什么意思吗?即,如果只有一半消息可用,行为应该是什么(根据 Martin James,接收者如何学习预期的消息长度?它是固定长度的吗?)
-
我的想法是保持 MAXSIZE 的全局
char *buffer,并继续执行recv并将消息追加到char *buffer,直到recv返回 0。 -
你怎么会有一个非阻塞的 recvall?您想等待接收 100 个字节(例如),但您也不希望它等待?