Add uc_set_tcp_keepalive_cfg too set keepalive options

This commit is contained in:
Nils O. Selåsdal
2013-07-08 22:15:56 +02:00
parent e1f16b3603
commit b475fae56b
2 changed files with 71 additions and 15 deletions
+31 -7
View File
@@ -10,42 +10,66 @@ extern "C" {
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_nonblocking(int fd); int uc_set_nonblocking(int fd);
/** /**
* set the file descriptor to blocking * set the file descriptor to blocking
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_blocking(int fd); int uc_set_blocking(int fd);
/** /**
* set the socket file descriptor to SO_REUSEADDR * set the socket file descriptor to SO_REUSEADDR
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_reuseaddr(int sockfd); int uc_set_reuseaddr(int sockfd);
/** /**
* enable TCP keepalive on the socket * enable TCP keepalive on the socket
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_tcp_keepalive(int sockfd); int uc_set_tcp_keepalive(int sockfd);
struct UCKeepConfig {
/** The maximum number of keepalive probes TCP should
* send before dropping the connection. (TCP_KEEPCNT socket option)
*/
int keepcnt;
/** The time (in seconds) the connection needs to remain
* idle before TCP starts sending keepalive probes (TCP_KEEPIDLE socket option)
*/
int keepidle;
/** The time (in seconds) between individual keepalive probes.
* (TCP_KEEPINTVL socket option)
*/
int keepintvl;
};
/** Set the keepalive options on the socket
* This also enables TCP keepalive on the socket
*
* @param fd file descriptor
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int uc_set_tcp_keepalive_cfg(int sockfd, const struct UCKeepConfig *cfg);
/** /**
* Set the socket send timeout, in miliseconds * Set the socket send timeout, in miliseconds
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_send_timeout(int sockfd,long timeoutms); int uc_set_send_timeout(int sockfd,long timeoutms);
/** /**
* Set the socket receive timeout, in miliseconds * Set the socket receive timeout, in miliseconds
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_receive_timeout(int sockfd,long timeoutms); int uc_set_receive_timeout(int sockfd,long timeoutms);
/* /*
* Set the IP DSCP (differnetiated services code point) header value * Set the IP DSCP (differnetiated services code point) header value
@@ -53,7 +77,7 @@ int set_receive_timeout(int sockfd,long timeoutms);
* @param fd file descriptor * @param fd file descriptor
* @return 0 on success -1 on failure * @return 0 on success -1 on failure
*/ */
int set_ip_dscp(int fd, unsigned int dscp); int uc_set_ip_dscp(int fd, unsigned int dscp);
#ifdef __cplusplus #ifdef __cplusplus
+40 -8
View File
@@ -2,11 +2,12 @@
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include "ucore/fd_utils.h" #include "ucore/fd_utils.h"
int set_nonblocking(int fd) int uc_set_nonblocking(int fd)
{ {
int flags = fcntl(fd,F_GETFL,NULL); int flags = fcntl(fd,F_GETFL,NULL);
if(flags < 0 ) { if(flags < 0 ) {
@@ -15,7 +16,7 @@ int set_nonblocking(int fd)
return fcntl(fd,F_SETFL,flags | O_NONBLOCK); return fcntl(fd,F_SETFL,flags | O_NONBLOCK);
} }
int set_blocking(int fd) int uc_set_blocking(int fd)
{ {
int flags = fcntl(fd,F_GETFL,NULL); int flags = fcntl(fd,F_GETFL,NULL);
if(flags < 0 ) { if(flags < 0 ) {
@@ -25,35 +26,66 @@ int set_blocking(int fd)
return fcntl(fd,F_SETFL,flags&~O_NONBLOCK); return fcntl(fd,F_SETFL,flags&~O_NONBLOCK);
} }
int set_reuseaddr(int sockfd) int uc_set_reuseaddr(int sockfd)
{ {
int opt = 1; int opt = 1;
return setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)); return setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
} }
int set_tcp_keepalive(int sockfd) int uc_set_tcp_keepalive(int sockfd)
{ {
int optval = 1; int optval = 1;
return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
} }
int uc_set_tcp_keepalive_cfg(int sockfd, const struct UCKeepConfig *cfg)
{
int rc;
int set_send_timeout(int sockfd,long timeoutms) //first turn on keepalive
rc = uc_set_tcp_keepalive(sockfd);
if (rc != 0) {
return rc;
}
//set the keepalive options
rc = setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &cfg->keepcnt, sizeof cfg->keepcnt);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &cfg->keepidle, sizeof cfg->keepintvl);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &cfg->keepintvl, sizeof cfg->keepintvl);
if (rc != 0) {
return rc;
}
return 0;
}
int uc_set_send_timeout(int sockfd,long timeoutms)
{ {
struct timeval so_sndtimeo = {timeoutms/1000,(timeoutms%1000)*1000}; struct timeval so_sndtimeo = {timeoutms/1000,(timeoutms%1000)*1000};
return setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &so_sndtimeo, sizeof(so_sndtimeo)); return setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &so_sndtimeo, sizeof(so_sndtimeo));
} }
int set_receive_timeout(int sockfd,long timeoutms) int uc_set_receive_timeout(int sockfd,long timeoutms)
{ {
struct timeval so_sndtimeo = {timeoutms/1000,(timeoutms%1000)*1000}; struct timeval so_sndtimeo = {timeoutms/1000,(timeoutms%1000)*1000};
return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &so_sndtimeo, sizeof(so_sndtimeo)); return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &so_sndtimeo, sizeof(so_sndtimeo));
} }
int
set_ip_dscp(int fd, unsigned int dscp) { int uc_set_ip_dscp(int fd, unsigned int dscp) {
int val; int val;
if (dscp > 63) { if (dscp > 63) {