QT QTcpserver 端口可重用问题?

用QTcpserver建立了服务器,然后客户端也连接成功了。但是客户端如果断开重连,却需要等待很久才能连上。我知道在linux里,利用setsocko…
关注者
7
被浏览
2,792

1 个回答

不要直接调用QTcpServer的listen,通过系统api创建socket,设置SO_REUSEADDR属性,通过QTcpServer::setSocketDescriptor将该socket设置成QTcpServer需要监听的套接字。代码如下:

    SOCKET sockfd = 0;
    struct sockaddr_in servAddr;
    sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        logError("can't open socket");
        return false;
    }

    int flag = 1;
    if (::setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag)) != 0) {
        logError("can't set SO_REUSEADDR");
        return false;
    }

    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = INADDR_ANY;
    servAddr.sin_port = htons(port);

    if (::bind(sockfd, (struct sockaddr*)&servAddr, sizeof(sockaddr_in)) != 0) {
        logError("can't bind socket");
        return false;
    }

    if (::listen(sockfd, SOMAXCONN) != 0) {
        logError("can't listen on port");
        return false;
    }

    setSocketDescriptor(sockfd);