我正在编写一个小程序来测试网络吞吐量作为练习的一部分,并且需要将发送和接收缓冲区增加到 256 KB(以尝试提高 TCP 性能)。我正在使用setsockopt()
SO_SNDBUF/SO_RCVBUF 选项执行此操作,并且还增加了 'net.core.rmem_max' 和 'net.core.wmem_max' 值。
getsockopt() 确认缓冲区大小的增加(256KB 值的两倍)所以我知道这很好。但是,当我将 256KB 的数据从一台主机发送到另一台主机时,接收器总是以多次读取的形式接收数据,每次读取的大小各不相同(形成 20 到 40 次读取,接收字节数从 1448 到 18824 不等),直到它接收到所有数据. 在这一点上我很困惑,主要是这些问题,
- 随着缓冲区大小的增加,它不应该在一次读取中接收它吗?
- 另外,为什么每次读取的字节数差异如此之大(它们不应该更不恒定)?
- 有什么方法可以确保一次读取就收到 256KB 吗?
下面是显示读取部分的接收端片段,
while(1) {
memset(&client_addr, 0, sizeof(client_addr));
if ((connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) <= 0) {
perror("accept()");
exit(EXIT_FAILURE);
}
while ((n = recv(connfd, &buff[0], BUFF_SIZE, 0/*MSG_WAITALL*/)) > 0) {
totalBytes += n;
++pktCount;
printf("Received(%d): %d bytes\n", pktCount, n);
}
if (n == 0) {
printf("Connection closed (Total: %lu bytes received)\n", totalBytes);
}
close(connfd);
connfd = -1;
totalBytes = 0;
pktCount = 0;
}
任何帮助都会很棒。
TIA