setsockopt

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;
}
原文地址:https://www.cnblogs.com/embedded-linux/p/5003651.html