Skip to content

Commit 06c860d

Browse files
committed
session CHANGE use more practical TCP keep alive options
Refs CESNET/netopeer2#292
1 parent f703352 commit 06c860d

2 files changed

Lines changed: 31 additions & 17 deletions

File tree

src/session_client.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -935,18 +935,7 @@ nc_sock_connect(const char* host, uint16_t port)
935935
/* make the socket non-blocking */
936936
if (((flags = fcntl(sock, F_GETFL)) == -1) || (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1)) {
937937
ERR("Fcntl failed (%s).", strerror(errno));
938-
close(sock);
939-
freeaddrinfo(res_list);
940-
return -1;
941-
}
942-
943-
/* enable keep-alive */
944-
i = 1;
945-
if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &i, sizeof i) == -1) {
946-
ERR("Setsockopt failed (%s).", strerror(errno));
947-
close(sock);
948-
freeaddrinfo(res_list);
949-
return -1;
938+
goto error;
950939
}
951940

952941
/* we're done, network connection established */
@@ -959,6 +948,13 @@ nc_sock_connect(const char* host, uint16_t port)
959948
freeaddrinfo(res_list);
960949

961950
return sock;
951+
952+
error:
953+
if (sock > -1) {
954+
close(sock);
955+
}
956+
freeaddrinfo(res_list);
957+
return -1;
962958
}
963959

964960
static NC_MSG_TYPE

src/session_server.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <sys/types.h>
2222
#include <sys/socket.h>
2323
#include <netinet/in.h>
24+
#include <netinet/tcp.h>
2425
#include <arpa/inet.h>
2526
#include <unistd.h>
2627
#include <fcntl.h>
@@ -163,8 +164,7 @@ nc_session_set_status(struct nc_session *session, NC_STATUS status)
163164
int
164165
nc_sock_listen(const char *address, uint16_t port)
165166
{
166-
const int optVal = 1;
167-
const socklen_t optLen = sizeof(optVal);
167+
int opt;
168168
int is_ipv4, sock;
169169
struct sockaddr_storage saddr;
170170

@@ -184,8 +184,14 @@ nc_sock_listen(const char *address, uint16_t port)
184184
goto fail;
185185
}
186186

187-
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&optVal, optLen) == -1) {
188-
ERR("Could not set socket SO_REUSEADDR socket option (%s).", strerror(errno));
187+
opt = 1;
188+
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) == -1) {
189+
ERR("Could not set SO_REUSEADDR socket option (%s).", strerror(errno));
190+
goto fail;
191+
}
192+
opt = 1;
193+
if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof opt) == -1) {
194+
ERR("Could not set SO_KEEPALIVE option (%s).", strerror(errno));
189195
goto fail;
190196
}
191197

@@ -332,7 +338,19 @@ nc_sock_accept_binds(struct nc_bind *binds, uint16_t bind_count, int timeout, ch
332338

333339
/* enable keep-alive */
334340
flags = 1;
335-
if (setsockopt(ret, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof flags) == -1) {
341+
if (setsockopt(ret, IPPROTO_TCP, TCP_KEEPIDLE, &flags, sizeof flags) == -1) {
342+
ERR("Setsockopt failed (%s).", strerror(errno));
343+
close(ret);
344+
return -1;
345+
}
346+
flags = 5;
347+
if (setsockopt(ret, IPPROTO_TCP, TCP_KEEPINTVL, &flags, sizeof flags) == -1) {
348+
ERR("Setsockopt failed (%s).", strerror(errno));
349+
close(ret);
350+
return -1;
351+
}
352+
flags = 10;
353+
if (setsockopt(ret, IPPROTO_TCP, TCP_KEEPCNT, &flags, sizeof flags) == -1) {
336354
ERR("Setsockopt failed (%s).", strerror(errno));
337355
close(ret);
338356
return -1;

0 commit comments

Comments
 (0)