这更像是一个确认请求,而不是一个问题,所以我会保持简短。 (我离开了我的电脑,所以不能简单地实施这个解决方案来测试)。
我正在编写程序,将通过网络摄像头拍摄的图像文件(以及元数据)从raspberryPi发送到我的电脑。
我已经知道图像大约是130kb,包头是12b,相关的元数据是24b。虽然我将来可能会增加图像尺寸,但是一旦我有了工作原型。
目前我无法成功检索整个数据包,因为在将数据包发送到PC后,我只能在缓冲区中获得大约64kb的recv。
我认为这是因为无论出于何种原因,套接字的默认缓冲区大小如下所示:
SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);
是64kb(如果你知道'那么有人可以澄清这个问题)
所以 - 为了解决这个问题,我打算通过setsockopt(x ..)命令将套接字大小增加到1024kb。
请有人确认我的问题诊断,建议的解决方案是否正确?
我问这个问题,因为我现在离开我的电脑,直到我回家才能尝试。
答案 0 :(得分:0)
这很可能与套接字缓冲区无关,但事实上recv()
和send()
不必接收和发送您想要的所有数据。检查这些函数调用的返回值,它表示实际发送和接收的字节数。
处理"短"的最佳方式读/写是将它们放在循环中,如下所示:
char *buf; // pointer to your data
size_t len; // length of your data
int fd; // the socket filedescriptor
size_t offset = 0;
ssize_t result;
while (offset < len) {
result = send(fd, buf + offset, len - offset, 0);
if (result < 0) {
// Deal with errors here
}
offset += result;
}
使用类似的结构接收数据。请注意,一个可能的错误条件是函数调用被中断(errno = EAGAIN
或EWOULDBLOCK
),在这种情况下,您应该重试send命令,在所有其他情况下,您应该退出循环。