print setsockopt errors and add missing options, add TCP_USER_TIMEOUT if defined
This commit is contained in:
@@ -89,13 +89,40 @@ int tcpKeepAliveInterval) {
|
|||||||
}
|
}
|
||||||
if (tcpKeepAliveInterval > 0) {
|
if (tcpKeepAliveInterval > 0) {
|
||||||
value = 1;
|
value = 1;
|
||||||
setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<void*>(&value), sizeof(value));
|
if (setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<void*>(&value), sizeof(value)) != 0) {
|
||||||
|
perror("setsockopt KEEPALIVE");
|
||||||
|
}
|
||||||
|
#ifndef TCP_KEEPIDLE
|
||||||
|
#ifdef TCP_KEEPALIVE
|
||||||
|
#define TCP_KEEPIDLE TCP_KEEPALIVE
|
||||||
|
#else
|
||||||
|
#define TCP_KEEPIDLE 4
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef TCP_KEEPINTVL
|
||||||
|
#define TCP_KEEPINTVL 5
|
||||||
|
#endif
|
||||||
|
#ifndef TCP_KEEPCNT
|
||||||
|
#define TCP_KEEPCNT 6
|
||||||
|
#endif
|
||||||
value = tcpKeepAliveInterval+1; // send keepalive after interval + 1 seconds of silence
|
value = tcpKeepAliveInterval+1; // send keepalive after interval + 1 seconds of silence
|
||||||
setsockopt(sfd, IPPROTO_TCP, TCP_KEEPIDLE, reinterpret_cast<void*>(&value), sizeof(value));
|
if (setsockopt(sfd, IPPROTO_TCP, TCP_KEEPIDLE, reinterpret_cast<void*>(&value), sizeof(value)) != 0) {
|
||||||
|
perror("setsockopt KEEPIDLE");
|
||||||
|
}
|
||||||
value = tcpKeepAliveInterval; // send keepalive in given interval
|
value = tcpKeepAliveInterval; // send keepalive in given interval
|
||||||
setsockopt(sfd, IPPROTO_TCP, TCP_KEEPINTVL, reinterpret_cast<void*>(&value), sizeof(value));
|
if (setsockopt(sfd, IPPROTO_TCP, TCP_KEEPINTVL, reinterpret_cast<void*>(&value), sizeof(value)) != 0) {
|
||||||
|
perror("setsockopt KEEPINTVL");
|
||||||
|
}
|
||||||
value = 2; // drop connection after 2 failed keep alive sends
|
value = 2; // drop connection after 2 failed keep alive sends
|
||||||
setsockopt(sfd, IPPROTO_TCP, TCP_KEEPCNT, reinterpret_cast<void*>(&value), sizeof(value));
|
if (setsockopt(sfd, IPPROTO_TCP, TCP_KEEPCNT, reinterpret_cast<void*>(&value), sizeof(value)) != 0) {
|
||||||
|
perror("setsockopt KEEPCNT");
|
||||||
|
}
|
||||||
|
#ifdef TCP_USER_TIMEOUT
|
||||||
|
value = (2+tcpKeepAliveInterval*3)*1000; // 1 second higher than keepalive timeout
|
||||||
|
if (setsockopt(sfd, IPPROTO_TCP, TCP_USER_TIMEOUT, reinterpret_cast<void*>(&value), sizeof(value)) != 0) {
|
||||||
|
perror("setsockopt USER_TIMEOUT");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifndef HAVE_PPOLL
|
#ifndef HAVE_PPOLL
|
||||||
#ifndef HAVE_PSELECT
|
#ifndef HAVE_PSELECT
|
||||||
|
|||||||
Reference in New Issue
Block a user