繁体   English   中英

C++ 套接字缓冲区大小

[英]C++ Socket Buffer Size

这更像是一个确认请求而不是一个问题,所以我会保持简短。 (我远离我的电脑,所以不能简单地实现这个解决方案来测试)。

我正在编写一个程序,将通过网络摄像头拍摄的图像文件(连同元数据)从 raspberryPi 发送到我的 PC。

我已经计算出图像大约为 130kb,数据包头为 12b,关联的元数据为 24b。 虽然我将来可能会增加图像大小,但一旦我有了一个工作原型。

目前我无法成功检索整个数据包,因为在将其发送到 PC 后,我只能在缓冲区中获得大约 64kb 的数据。

我假设这是因为无论出于何种原因,套接字的默认缓冲区大小声明如下:

SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);

是 64kb(如果您“知情”,请有人澄清这一点)

所以 - 为了解决这个问题,我打算通过 setsockopt(x..) 命令将套接字大小增加到 1024kb。

请有人确认我对问题的诊断和建议的解决方案是否正确?

我问这个问题是因为我现在离开我的电脑并且在我回家之前无法尝试它。

这很可能与套接字缓冲区无关,但事实上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 = EAGAINEWOULDBLOCK ),在这种情况下,您应该重试发送命令,在所有其他情况下,您应该退出循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM