【发布时间】:2019-12-10 10:22:47
【问题描述】:
是否可以将TCP congestion control algorithm 从Cubic 更改为Reno 或使用setsockopt 在Linux 中调用来自C++ 代码?
我正在寻找这样做的示例代码。
【问题讨论】:
标签: linux sockets tcp setsockopt congestion-control
是否可以将TCP congestion control algorithm 从Cubic 更改为Reno 或使用setsockopt 在Linux 中调用来自C++ 代码?
我正在寻找这样做的示例代码。
【问题讨论】:
标签: linux sockets tcp setsockopt congestion-control
您可以使用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
【讨论】:
setsockopt 调用来更改它?这也是我的问题。我知道如果存在特权,它也可以更改命令行。