From 044536aef6187b347f27ee79378f31d384a96ee6 Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sun, 3 Nov 2019 09:15:24 +0800 Subject: [PATCH] optimize tcp connection lag --- src/dns_client.c | 6 ++++++ src/util.c | 15 +++++++++++++++ src/util.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/src/dns_client.c b/src/dns_client.c index 48087a8..30b9529 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -1380,6 +1380,9 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)); setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority)); setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos)); + setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes)); + setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes)); + set_sock_keepalive(fd, 15, 3, 4); if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) { if (errno != EINPROGRESS) { @@ -1449,6 +1452,9 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch // setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)); setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority)); setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos)); + setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes)); + setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes)); + set_sock_keepalive(fd, 15, 3, 4); if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) { if (errno != EINPROGRESS) { diff --git a/src/util.c b/src/util.c index 2a2b695..508900d 100644 --- a/src/util.c +++ b/src/util.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -933,3 +934,17 @@ int has_network_raw_cap(void) close(fd); return 1; } + +int set_sock_keepalive(int fd, int keepidle, int keepinterval, int keepcnt) +{ + const int yes = 1; + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes))!= 0) { + return -1; + } + + setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle)); + setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepinterval, sizeof(keepinterval)); + setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepcnt, sizeof(keepcnt)); + + return 0; +} \ No newline at end of file diff --git a/src/util.h b/src/util.h index d438c02..f2b7c09 100644 --- a/src/util.h +++ b/src/util.h @@ -69,6 +69,8 @@ void get_compiled_time(struct tm *tm); int has_network_raw_cap(void); +int set_sock_keepalive(int fd, int keepidle, int keepinterval, int keepcnt); + #ifdef __cplusplus } #endif /*__cplusplus */