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

发布于 2022-09-11 23:05:23 字数 2673 浏览 20 评论 0

用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;
    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

阳光的暖冬 2022-09-18 23:05:23
int port=8888;

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

抚笙 2022-09-18 23:05:23

楼主,打扰了,请问一下,您这个问题是怎么解决的,我也遇到这个问题了,我是new两个socket类作为两个客户端分别去连接两个服务器,结果就是最后我这两个客户端线程都是对第二个服务器进行操作,比如给服务器发数据,就是这两个线程把数据都发给了第二个服务器,按理来说,我第一个客户端线程应该是发给第一个服务器的,感觉跟您这提的问题很像,所以想请问一下,您之后是怎么解决的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文