C++:如何测量非阻塞套接字上的实际上传速率

标签 c++ linux sockets send nonblocking

我正在使用带 epoll 的非阻塞套接字在 linux C++ 上编写程序,等待 EPOLLOUT 以便对某些数据执行 send()。

我的问题是:我读到在非阻塞模式下数据被复制到内核的缓冲区,因此 send() 调用可能会立即返回,表明所有数据都已发送,而实际上它只是复制到内核的缓冲区。

为了了解实际传输速率,我如何知道数据实际发送和接收的时间?

最佳答案

无论是否处于非阻塞模式,只要数据被复制到内核缓冲区,send 就会返回。阻塞模式和非阻塞模式的区别在于缓冲区何时已满。在缓冲区满的情况下,阻塞模式将挂起当前线程,直到写入发生,而非阻塞模式将立即返回 EAGAIN 或 EWOULDBLOCK。

在 TCP 连接中,内核缓冲区通常等于窗口大小,因此一旦有太多数据未被确认,连接就会阻塞。这意味着发送方知道远程端接收数据的速度有多快。

UDP 有点复杂,因为没有确认。这里只有接收端能够测量真实速度,因为发送的数据可能在途中丢失。

在TCP和UDP两种情况下,内核都不会尝试发送链路层无法处理的数据。如果网络拥塞,链路层也可以流出数据。

回到您的案例,当使用非阻塞套接字时,如果您正确处理 EAGAIN 或 EWOULDBLOCK 错误,则可以测量网络速度。对于发送比当前窗口大小(可能 64K 左右)更多的数据的 TCP,这当然是正确的,并且您也可以了解 UDP 套接字的链路层速度。

关于C++:如何测量非阻塞套接字上的实际上传速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879001/

相关文章:

c++ - 预处理器保持宏

sockets - 如果不需要回退,使用WebSocket API代替Socket.io有任何优势吗?

c++ - 如何正确轮询ncurses

json - 通过node.js套接字发送文本JSON如何处理 '\n\r'符号

c++ - 这个结构实际上有什么作用?

c++ - Qt C++ - 构造带双引号的 QStringlist

c++ - 了解对齐概念

linux - 识别哪个 Linux 系统库包含一个函数

计算 linux 机器上非空 SNDBUF 的 tcp 套接字总数

c - epoll_wait : maxevents