C++ Socket Buffer Size
C++ Socket Buffer Size
这与其说是一个问题,不如说是一个确认请求,所以我将保持简短。(我离开了我的电脑,所以不能简单地执行这个解决方案来测试)。
我正在编写一个程序,将通过网络摄像头拍摄的图像文件(以及元数据)从树莓派发送到我的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 = EAGAIN
或EWOULDBLOCK
),在这种情况下,您应该重试发送命令,在所有其他情况下,您应该退出循环。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- std::string.size() 未知行为
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 如何"buffer" UNIX 信号
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 如何将Boost::asio::buffer(buf,size)与Boost绑定一起使用
- C++ Socket Buffer Size