端口被占用BUG

sghall自从加了5997端口监听后,每次kill掉该进程再马上重启总是提示端口被占用,当时5997端口连接的socket处于TIME_WAIT状态,必须等超时后才会释放该端口。

一般的做法都是

    int iOpt;
    socklen_t iLen;
    iOpt = 1;
    iLen = sizeof(iOpt);
    //port reuse
    setsockopt(sock_id, SOL_SOCKET, SO_REUSEADDR, (void *)&iOpt, iLen);

,当时不知道。一直以为必须设置一个选项让他close后没有TIME_WAIT状态,也想过要加这个,因为代码中有加。

后来才仔细看了代码是这样的

#ifdef LINUX
    int iOpt;
    socklen_t iLen;
    iOpt = 1;
    iLen = sizeof(iOpt);
    //port reuse
    setsockopt(sock_id, SOL_SOCKET, SO_REUSEADDR, (void *)&iOpt, iLen);
#endif

尼玛,加了个ifdef,然后LINUX又是没有定义的宏所以写了也执行不到。

具体例子可以参照《UNIX环境高级编程》 464页

原文地址:https://www.cnblogs.com/vanishfan/p/2865201.html