【发布时间】:2016-09-29 09:10:18
【问题描述】:
这更像是一个确认请求而不是一个问题,所以我会保持简短。 (我离开了我的电脑,所以不能简单地实现这个解决方案来测试)。
我正在编写一个程序,将通过网络摄像头拍摄的图像文件(连同元数据)从树莓派发送到我的电脑。
我计算出图像大约为 130kb,数据包标头为 12b,相关元数据为 24b。虽然将来我可能会增加图像大小,但一旦我有一个工作原型。
目前我无法成功检索整个数据包,因为在将其发送到 PC 后,我只能在缓冲区中收到大约 64kb 的数据。
我假设这是因为无论出于何种原因,套接字的默认缓冲区大小声明如下:
SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);
是 64kb(如果您“知情”,请有人澄清一下)
所以 - 为了解决这个问题,我打算通过 setsockopt(x..) 命令将套接字大小增加到 1024kb。
请有人确认我对问题的诊断和建议的解决方案是否正确?
我问这个问题是因为我现在不在我的电脑上,在我回家之前无法尝试。
【问题讨论】:
-
我在精神上为自己准备的另一种选择是手动分割数据包。但是,我怀疑这会引入更多的错误可能性,并且会增加整体数据包大小/计算时间,因为我需要为每个单独的段发送和读取标头。
-
你没有收到所有数据的原因是你假设
recv()填充了你的缓冲区而不是循环。文档中没有任何内容支持该假设。 -
感谢您的回复,不是 100% 肯定我会关注您,但要澄清一下:我知道传入数据的大小,因为它存储在标题中,并且被提取、读取和适当大小分配缓冲区以接收其余数据。因此,进一步说明: >获取具有数据包大小的标头 >创建正确大小的缓冲区 >运行 recv 以填充缓冲区并记下接收到的字节 >检查接收到的字节与标头中的数据大小
标签: c++ sockets buffer setsockopt