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)
163164int
164165nc_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