C++ Socket Buffer Size

C++ Socket Buffer Size

本文关键字:Size Buffer Socket C++      更新时间:2023-10-16

这与其说是一个问题,不如说是一个确认请求,所以我将保持简短。(我离开了我的电脑,所以不能简单地执行这个解决方案来测试)。

我正在编写一个程序,将通过网络摄像头拍摄的图像文件(以及元数据)从树莓派发送到我的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),在这种情况下,您应该重试发送命令,在所有其他情况下,您应该退出循环。