QT QTcpserver 端口可重用问题

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

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

class Server : public QObject
{
    Q_OBJECT
public:
    explicit Server(QObject *parent = 0);
    ~Server();

    void init(IMsgInterface * pMsgHandler, int port);
    void sendData(QString ip, QString data);
    void sendData(QString ip, uchar *rawData);
signals:


private slots:

    void newConnectSlot();
    void readMessage();
    void removeUserFormList();
private:
    QTcpServer *m_tcpServer;
    QMap<QString, QTcpSocket *> m_mapClient;

    IMsgInterface *m_pMsgHandler;
};

不要直接调用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);
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值