#include #include #include #include #include #include #include #include "ucore/fd_utils.h" int uc_set_nonblocking(int fd) { int flags = fcntl(fd,F_GETFL,NULL); if(flags < 0 ) { return flags; } return fcntl(fd,F_SETFL,flags | O_NONBLOCK); } int uc_set_blocking(int fd) { int flags = fcntl(fd,F_GETFL,NULL); if(flags < 0 ) { return flags; } return fcntl(fd,F_SETFL,flags&~O_NONBLOCK); } int uc_set_reuseaddr(int sockfd) { int opt = 1; return setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)); } int uc_set_tcp_keepalive(int sockfd) { int optval = 1; return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); } int uc_set_tcp_keepalive_cfg(int sockfd, const struct UCKeepConfig *cfg) { int rc; //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}; return setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &so_sndtimeo, sizeof(so_sndtimeo)); } int uc_set_receive_timeout(int sockfd,long timeoutms) { struct timeval so_sndtimeo = {timeoutms/1000,(timeoutms%1000)*1000}; return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &so_sndtimeo, sizeof(so_sndtimeo)); } int uc_set_ip_dscp(int fd, unsigned int dscp) { int val; //only 6 bits for dscp if (dscp > 63) { errno = EINVAL; return -1; } val = dscp << 2; return setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val); }