QT tcpSocket 报错The proxy type is invalid for this operation

最近在使用QT tcpclient, 发现连接tcpserver失败,错误信息为:the proxy type is invalid for this operation。
2年前用QT写过一版网络调试助手拿过来重新编译,同样出现该错误。这就奇怪了,唯一的区别就是版本问题了,之前使用Qt5.9.6,现在使用Qt5.14.2。
网上搜罗了一番,问题得到解决:原来调用connectToHost时会先检查代理情况。Qt 程序默认使用系统的代理设置会导致这个问题导致,只要关闭系统的代理设置就可以解决这个问题:
(1)添加头文件:#include <QNetworkProxy>
(2)添加:QNetworkProxyFactory::setUseSystemConfiguration(false); // 静态函数
或者添加: tcpSocket->setProxy(QNetworkProxy::NoProxy);

参考链接:https://www.cnblogs.com/cppskill/p/11730452.html

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Qt中可以使用QTcpServer和QTcpSocket实现TCP代理,具体步骤如下: 1. 创建一个QTcpServer实例并监听指定端口。 2. 当有客户端连接时,创建一个QTcpSocket实例并连接到目标服务器。 3. 将QTcpServer的newConnection()信号与槽函数连接,当有新的客户端连接时,获取客户端的QTcpSocket实例,并将其与目标服务器的QTcpSocket实例进行数据传输。 4. 在数据传输的过程中,需要分别处理客户端和目标服务器的QTcpSocket实例的readyRead()信号,以及对应的槽函数。 5. 在数据传输结束后,需要关闭和释放所有的QTcpServer和QTcpSocket实例。 下面是一个简单的TCP代理的示例代码: ``` #include <QTcpServer> #include <QTcpSocket> class TcpProxy : public QTcpServer { Q_OBJECT public: TcpProxy(QObject *parent = nullptr) : QTcpServer(parent) {} protected: void incomingConnection(qintptr socketDescriptor) override { QTcpSocket *clientSocket = new QTcpSocket(this); clientSocket->setSocketDescriptor(socketDescriptor); QTcpSocket *serverSocket = new QTcpSocket(this); serverSocket->connectToHost("target_host", target_port); connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onClientReadyRead())); connect(serverSocket, SIGNAL(readyRead()), this, SLOT(onServerReadyRead())); connect(clientSocket, SIGNAL(disconnected()), this, SLOT(onClientDisconnected())); connect(serverSocket, SIGNAL(disconnected()), this, SLOT(onServerDisconnected())); m_clientSockets.insert(clientSocket, serverSocket); m_serverSockets.insert(serverSocket, clientSocket); } private slots: void onClientReadyRead() { QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender()); QTcpSocket *serverSocket = m_clientSockets.value(clientSocket); QByteArray data = clientSocket->readAll(); serverSocket->write(data); } void onServerReadyRead() { QTcpSocket *serverSocket = qobject_cast<QTcpSocket *>(sender()); QTcpSocket *clientSocket = m_serverSockets.value(serverSocket); QByteArray data = serverSocket->readAll(); clientSocket->write(data); } void onClientDisconnected() { QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender()); QTcpSocket *serverSocket = m_clientSockets.value(clientSocket); m_clientSockets.remove(clientSocket); m_serverSockets.remove(serverSocket); clientSocket->deleteLater(); serverSocket->deleteLater(); } void onServerDisconnected() { QTcpSocket *serverSocket = qobject_cast<QTcpSocket *>(sender()); QTcpSocket *clientSocket = m_serverSockets.value(serverSocket); m_serverSockets.remove(serverSocket); m_clientSockets.remove(clientSocket); serverSocket->deleteLater(); clientSocket->deleteLater(); } private: QMap<QTcpSocket *, QTcpSocket *> m_clientSockets; QMap<QTcpSocket *, QTcpSocket *> m_serverSockets; }; ``` 在上述代码中,QTcpServer的incomingConnection()函数会在有新的客户端连接时被调用。在该函数中,我们创建了客户端的QTcpSocket实例和目标服务器的QTcpSocket实例,并将其连接起来,同时将两个QTcpSocket实例的readyRead()信号与对应的槽函数相连接。此外,我们还需要处理QTcpSocket实例的disconnected()信号。 注意:上述示例代码中的target_host和target_port需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值