C ++套接字缓冲区大小

时间:2016-09-29 09:10:18

标签: c++ sockets buffer setsockopt

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

我正在编写程序,将通过网络摄像头拍摄的图像文件(以及元数据)从raspberryPi发送到我的电脑。

我已经知道图像大约是130kb,包头是12b,相关的元数据是24b。虽然我将来可能会增加图像尺寸,但是一旦我有了工作原型。

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

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

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

是64kb(如果你知道'那么有人可以澄清这个问题)

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

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

我问这个问题,因为我现在离开我的电脑,直到我回家才能尝试。

1 个答案:

答案 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 = EAGAINEWOULDBLOCK),在这种情况下,您应该重试send命令,在所有其他情况下,您应该退出循环。