Linux C API中是否有一种方法可以获取tcp套接字的传入窗口大小?
要明确,从Linux服务器的角度来看,我的意思是进入。 似乎我接受的套接字中的linux中的SND和RCV值被翻转了,即RCV意味着从服务器到客户端。 在这种情况下,我需要客户端到服务器端,即SND。
SND_BUF
和RCV_BUF
似乎与发送的实际值无关,
并且TCP_WINDOW_CLAMP
不正确。
答案 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_wnd
和trw.rcv_wnd
中读取TCP发送和接收窗口。