Problema de reutilización del puerto QT QTcpserver

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

#include <QNetworkInterface>
#include "IMsgInterface.h"

servidor de clase: QObject público
{     Q_OBJECT público:     servidor explícito (QObject *parent = 0);     ~Servidor();



    void init(IMsgInterface * pMsgHandler, puerto int);
    void sendData(IP de QString, datos de QString);
    void sendData(QString ip, uchar *rawData);
señales:


tragamonedas privadas:

    void nuevoConexiónSlot();
    void leerMensaje();
    void removeUserFormList();
privado:
    QTcpServer *m_tcpServer;
    QMap<QString, QTcpSocket *> m_mapClient;

    InterfazIMsg *m_pMsgHandler;
};

No llame directamente a la escucha de QTcpServer, cree un socket a través de la API del sistema, establezca el atributo SO_REUSEADDR y establezca el socket en el socket que QTcpServer necesita escuchar a través de QTcpServer::setSocketDescriptor. el código se muestra a continuación:

    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);

Supongo que te gusta

Origin blog.csdn.net/lvmengzou/article/details/120408713
Recomendado
Clasificación