gpt4 book ai didi

c++ - 如何使用 read() 在 C++ 套接字中接收超过 40Kb 的数据

转载 作者:行者123 更新时间:2023-11-30 00:49:43 24 4
gpt4 key购买 nike

我正在使用 C++ 在 Linux 中开发客户端-服务器应用程序 (TCP)。该应用程序负责测试网络性能。客户端和服务器之间的连接只建立一次,然后使用具有自定义协议(protocol)的 write()/read() 传输/接收数据。

当数据超过 40Kb 时,我只收到一部分数据一次。 (即我收到大约 48KB)

请找到代码的相关部分:

while (1) {
servMtx.lock();
...
serv_bytes = (byte *) malloc(size_bytes);
n = read(newsockfd, serv_bytes,size_bytes);
if (n != (int)size_bytes ) {
std::cerr << "No enough data available for msg. Received just: " << n << std::endl;
continue;
}
receivedBytes += n + size_header_bytes + sizeof(ssize_t);
....
}

我使用以下方法将内核缓冲区大小增加到 1MB:

int buffsize = 1024*1024;
setsockopt(newsockfd, SOL_SOCKET, SO_RCVBUF, &buffsize, sizeof(buffsize));

也修改了 sysctl 变量:

sysctl -w net.core.rmem_max=8388608;sysctl -w net.core.wmem_max=8388608;

如本 How to recive more than 65000 bytes in C++ socket using recv() 所述但没有任何改变。另外,我尝试更改包大小无济于事。

最佳答案

您应该readrecv 几个 block (通常;如果您不走运,“多个”会变成“一个”) .因此,您需要管理缓冲并保持(和使用)接收到的字节数。

所以在某个时候,你会编码

int nbrecv = recv(s, buffer + off, bufsize, 0);
if (nbrec>0) { off += nbrecv; bufsize -= nbrecv; }

你可能应该在你的 event loop 中这样做(通常在 poll(2) ... 左右)。 nbrec 确实比 bufsize 小很多,您应该处理这种常见情况。

TCP不保证您会在同一个 recv 中获得所有字节!它可能取决于外部因素(路由、网络硬件……);它是一种面向流的协议(protocol),而不是消息包协议(protocol)。如果您的应用程序需要消息,它应该根据内容缓冲输入和输入到消息中的 block 。看HTTPSMTP : 他们的消息有一个明确定义的边界,由 header 信息(HTTP 中的 Content-Length:)或结束约定(SMTP 中的单个 . 行)给出。

请仔细阅读read(2) , recv(2) , socket(7) , tcp(7) , 一些 sockets tutorial , Advanced Linux Programming .

关于c++ - 如何使用 read() 在 C++ 套接字中接收超过 40Kb 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com