QT/C++ Socket如何创建多个连接

用Qt写了一个Tunnel类,每次new这个类,构造函数都会socket连接到服务器,并与服务器保持通讯。

但是现在有个问题:每次new这个类,之前new的类里面的socket就会断开,我new了第一个,是正常的,new第二个,第一个类里面的socket就会断开,以此类推,ne十个,只有最后一个连接会是正常的,求大神帮忙看下,代码如下:

我是这样new的:

for(int i=0;i<=10;i++){
    Tunnel *t=new Tunnel();
    t->init(ExternData::userid,itemData.tunnelid,ExternData::token,itemData.server_ip,itemData.local_port,itemData.client_local);
    t->startTunnel();
}

tunnel.h

#ifndef TUNNEL_H
#define TUNNEL_H

#include <QByteArray>
#include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>
#include <QDebug>
#include <baseutility.h>
#include <packet.h>
#include <readwritetunnel.h>
#include <QMouseEvent>
#include <QObject>

class Tunnel : public QObject
{
    Q_OBJECT
public:
    Tunnel();
    void init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1);

    QByteArray qba;

    bool startTunnel();


private slots:

    void ClientRecvData();

private:
    QTcpSocket* socket;//创建socket对象

};





#endif // TUNNEL_H

tunnel.cpp

#include "tunnel.h"



int userid;
int id;
QString token;
QString server_ip;
int local_port;
QString local_ip;

Packet *p2;



Tunnel::Tunnel(){

}

void::Tunnel::init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1)
{
    userid=userid1;
    id=id1;
    token=token1;
    server_ip=server_ip1;
    local_port=local_port1;
    local_ip=local_ip1;

    p2=new Packet();
    socket=new QTcpSocket(this);
}


bool Tunnel::startTunnel()
{
    socket=new QTcpSocket();
    //QString ip="127.0.0.1";
    int port=8888;

    socket->connectToHost(server_ip,port);

    if(!socket->waitForConnected(3000)){
        //QMessageBox::information(this,"QT网络通信","连接服务器失败");
        return false;
    }
    //QMessageBox::information(this, "QT网络通信", "连接成功");

    QJsonObject json;
    json.insert("userid", userid);
    json.insert("token",token);
    json.insert("id", id);
    json.insert("type", "LOGIN");


    connect(socket,SIGNAL(readyRead()),this,SLOT(ClientRecvData()));


    Packet *p1=new Packet(json,QString("login").toLatin1());
    p1->Send1(socket);

    return true;
}


void Tunnel::ClientRecvData(){

    //这个是我自己写的packet类,用来解析服务器传过来的数据的
    QByteArray data =p2->unPacket(socket,server_ip,local_port,local_ip);

    if(data.isNull()){
        return;
    }

}
阅读 5.2k
2 个回答
int port=8888;

你connect不用指定端口的,多个socket用同一个端口就有问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题