【计算机网络】解决bind error

时间:2024-11-26 21:15:25

服务器有时可以立即重启,有时候无法立即重启 — bind error

首先要知道:四次挥手动作完成之后,主动断开连接的一方要维持一段时间的TIME_WAIT

bind error原因:因为是服务器主动断开的,所以服务器要去维持TIME_WAIT状态,维持该状态期间,该端口依旧被占用,所以就无法绑定成功

解决方案:使用setsockopt() 设置地址复用

void initServer()
{
    // 1.1创建socket文件套接字对象
    _listensock = socket(AF_INET, SOCK_STREAM, 0);
    if (_listensock < 0)
    {
        exit(SOCKET_ERR);
    }
    // 1.2设置地址复用
    int opt = 1;
    setsockopt(_listensock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    // 2.bind绑定自己的网络信息
    struct sockaddr_in local;
    memset(&local, 0, sizeof(local));
    local.sin_family = AF_INET;
    local.sin_port = htons(_port);
    local.sin_addr.s_addr = INADDR_ANY;
    if (bind(_listensock, (struct sockaddr *)&local, sizeof(local)) < 0)
    {
        exit(BIND_ERR);
    }

    // 3.设置socket 为监听状态
    if (listen(_listensock, gbacklog) < 0) // listen第二个参数以后在讲
    {
        exit(LISTEN_ERR);
    }
}