如何在Linux中获取套接字的tcp窗口大小?

时间:2019-01-07 08:34:15

标签: c linux tcp

Linux C API中是否有一种方法可以获取tcp套接字的传入窗口大小?

要明确,从Linux服务器的角度来看,我的意思是进入。 似乎我接受的套接字中的linux中的SND和RCV值被翻转了,即RCV意味着从服务器到客户端。 在这种情况下,我需要客户端到服务器端,即SND。

SND_BUFRCV_BUF似乎与发送的实际值无关, 并且TCP_WINDOW_CLAMP不正确。

1 个答案:

答案 0 :(得分:0)

您可以使用以下(特定于Linux的,不可移植的)套接字选项读取内部tcp套接字参数:

struct tcp_info ti;
socklen_t tisize = sizeof(ti);
getsockopt(fd, IPPROTO_TCP, TCP_INFO, &ti, &tisize);

tcp_info结构在linux/tcp.h中定义,其成员ti.tcpi_rcv_space包含相应套接字的广告tcp接收窗口。

从Linux 4.8开始,有一个新的tcp套接字选项TCP_REPAIR_WINDOW,它允许直接读取(甚至设置)发送和接收窗口:

struct tcp_repair_window trw;
socklen_t trwsize = sizeof(trw);
getsockopt(fd, IPPROTO_TCP, TCP_REPAIR_WINDOW, &trw, &trwsize);

现在可以从trw.snd_wndtrw.rcv_wnd中读取TCP发送和接收窗口。