如何使用 C++ 代码中的 setsockopt() 调用更改 TCP 拥塞控制算法

Gam*_*ads 4 sockets linux tcp congestion-control setsockopt

是否可以使用Linux 中C++ 代码中的setsockopt调用来更改TCP 拥塞控制算法,Cubic反之亦然? 我正在寻找这样做的示例代码。Reno

Has*_*kun 5

您可以使用TCP_CONGESTION套接字选项来获取套接字的拥塞控制算法或将其设置为 中列出的值之一,或者如果您的进程具有特权,/proc/sys/net/ipv4/tcp_allowed_congestion_control则为 中的任何一个值。/proc/sys/net/ipv4/tcp_available_congestion_control

C 示例:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char buf[256];
    socklen_t len;
    int sock = socket(AF_INET, SOCK_STREAM, 0);

    if (sock == -1)
    {
        perror("socket");
        return -1;
    }

    len = sizeof(buf);

    if (getsockopt(sock, IPPROTO_TCP, TCP_CONGESTION, buf, &len) != 0)
    {
        perror("getsockopt");
        return -1;
    }

    printf("Current: %s\n", buf);

    strcpy(buf, "reno");

    len = strlen(buf);

    if (setsockopt(sock, IPPROTO_TCP, TCP_CONGESTION, buf, len) != 0)
    {
        perror("setsockopt");
        return -1;
    }

    len = sizeof(buf);

    if (getsockopt(sock, IPPROTO_TCP, TCP_CONGESTION, buf, &len) != 0)
    {
        perror("getsockopt");
        return -1;
    }

    printf("New: %s\n", buf);

    close(sock);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对我来说输出:

Current: cubic
New: reno
Run Code Online (Sandbox Code Playgroud)

  • @Game_Of_Threads:我在 C 中添加了一个小例子来说明。如果不言自明,我可以添加一些评论。 (3认同)
  • 但是,如何使用 C++ 代码中的“setsockopt”调用来更改它?这也是我的问题。我知道只要存在特权,也可以更改命令行。 (2认同)