如何使用setsockopt()函数从C++代码更改TCP拥塞控制算法

4

在Linux系统中,使用C++编写的程序可以通过调用setsockopt函数,实现从CubicReno或相反方向切换TCP拥塞控制算法。我需要一个示例代码来完成这个操作。

1个回答

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;
}

对于我来说,输出结果是:

Current: cubic
New: reno

2
但是,我如何使用C++代码中的setsockopt调用来更改它呢?这也是我的问题。我知道也可以通过命令行更改,前提是具有特权。 - TheWaterProgrammer
3
@Game_Of_Threads: 我已经添加了一个简短的C语言示例以进行说明。如果不太清晰,我可以添加一些注释。 - Hasturkun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接