3

我正在尝试使用 TUN 接口测试无线设备的最大吞吐量,并且我想避免发送缓冲​​区溢出,这将导致数据包在实际到达设备之前被丢弃。因此,理想情况下,我想使用 TIOCOUTQ 查询发送缓冲区,以确保队列中始终有数据而不会溢出。我创建了一个如下所示的简单测试。

int i, sr, buff_stat;
for(i=0; i<1000; i++){
  sr = sendto(sock, message, sizeof(message), 0, &addr, sizeof(addr));
  ioctl(sock, TIOCOUTQ, &buff_stat);
  printf("buffer status: %i\n", buff_stat);
}

如果创建 sock 以使其通过标准以太网设备进行路由,则输出非零,但如果创建 sock 以使其通过 TUN 接口进行路由,则输出全为零。在这种情况下,没有进程消耗数据,所以我认为缓冲区会填满。我在我的实际应用程序中得到了相同的行为,我确实有一个消耗数据的进程。

所以我想知道我的结论是否正确,TIOCOUTQ 根本不适用于 TUN 接口,是否可能有其他方法来确定发送缓冲区状态。

4

0 回答 0