qt c语言socket,c – 如何使用QTcpSocket实例多次使用几秒间...

您所要做的就是connectToHost(),使用连接,然后使用disconnectFromHost().而已.没有更多,没有更少.

以下示例说明了客户端和服务器套接字实例的重用.服务器实例保存在仅在必要时增长的池中.它是为Qt 5编写的并使用C 11.

// https://github.com/KubaO/stackoverflown/tree/master/questions/multisocket-22726075

#include

class EchoServer : public QTcpServer

{

QStack m_pool;

void incomingConnection(qintptr descr) Q_DECL_OVERRIDE {

if (m_pool.isEmpty()) {

auto s = new QTcpSocket(this);

QObject::connect(s, &QTcpSocket::readyRead, s, [s]{

s->write(s->readAll());

});

QObject::connect(s, &QTcpSocket::disconnected, this, [this, s]{

m_pool.push(s);

});

m_pool.push(s);

}

m_pool.pop()->setSocketDescriptor(descr, QTcpSocket::ConnectedState);

}

public:

~EchoServer() { qDebug() << "pool size:" << m_pool.size(); }

};

void setupEchoClient(QTcpSocket & sock)

{

static const char kByteCount[] = "byteCount";

QObject::connect(&sock, &QTcpSocket::connected, [&sock]{

auto byteCount = 64 + qrand() % 65536;

sock.setProperty(kByteCount, byteCount);

sock.write(QByteArray(byteCount, '\x2A'));

});

QObject::connect(&sock, &QTcpSocket::readyRead, [&sock]{

auto byteCount = sock.property(kByteCount).toInt();

if (byteCount) {

auto read = sock.read(sock.bytesAvailable()).size();

byteCount -= read;

}

if (byteCount <= 0) sock.disconnectFromHost();

sock.setProperty(kByteCount, byteCount);

});

}

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

QHostAddress addr("127.0.0.1");

quint16 port = 5050;

EchoServer server;

if (! server.listen(addr, port)) qFatal("can't listen");

QTcpSocket clientSocket;

setupEchoClient(clientSocket);

auto connectsLeft = 20;

auto connector = [&clientSocket, &addr, port, &connectsLeft]{

if (connectsLeft--) {

qDebug() << "connecting" << connectsLeft;

clientSocket.connectToHost(addr, port);

} else

qApp->quit();

};

// reconnect upon disconnection

QObject::connect(&clientSocket, &QTcpSocket::disconnected, connector);

// initiate first connection

connector();

return a.exec();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值