setsockopt
setsockopt()设置socket描述符的选项
SO_REUSEADDR为1,表示允许创建端口号相同但IP地址不同的多个socket描述符。
getsockopt,setsockopt - get and set options on sockets
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
1)服务器端允许占用尚未完全释放的端口:服务器进程关闭后,再启动bind错误,因占用同一端口(与连接socket)需等待2MSL时间。修改该选项,可立即重启服务器程序。
int opt=1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
2)检测连接状态,在tcp连接的一瞬间可检测到。
int check_tcp_connect(int sd, int sec) { int error = -1, len; int ret = 0; struct timeval tm; len = sizeof(int); fd_set set; tm.tv_sec = sec; tm.tv_usec = 0; FD_ZERO(&set); FD_SET(sd, &set); if(select(sd + 1, NULL, &set, NULL, &tm) > 0) { getsockopt(sd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); if(error == 0) { ret = 1; } else { printf( "Warnning: Tcp connect error:%d ", error); ret = 0; } } else { printf("Warnning: Wait TCP connect timeout! "); ret = 0; } return ret; }