QTcpSocket Not Connecting
QTcpSocket Not Connecting
我正在尝试设置QTcpSocket连接。我正在开发一个简单的应用程序,该应用程序涉及通过单个TCP套接字进行双向通信。
我通过运行同一应用程序的两个实例并将两者连接到QHostAddress::Broadcast来测试我的代码。当我运行代码时,我得到以下状态序列:
- QAbstractSocket::HostLookupState--"套接字正在执行主机名查找。"
- QAbstractSocket::ConnectingState--"套接字已开始建立连接。"
- QAbstractSocket::UnconnectedState--"套接字未连接。"
- QAbstractSocket::SocketError--"权限被拒绝。"
编辑:经过进一步的调试,我发现第4项实际上是一个连接拒绝错误。
以下是我的代码:
#include "widget.h"
#include "ui_widget.h"
#include <string>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_connect_clicked()
{
if (!m_socket)
{
m_socket = new QTcpSocket(this);
m_socket->setSocketOption(QAbstractSocket::KeepAliveOption,1);
}
connect(m_socket, SIGNAL(readyRead()), SLOT(readSocketData()), Qt::UniqueConnection);
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(connectionError(QAbstractSocket::SocketError)), Qt::UniqueConnection);
connect(m_socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SLOT(tcpSocketState(QAbstractSocket::SocketState)), Qt::UniqueConnection);
connect(m_socket, SIGNAL(disconnected()), SLOT(onConnectionTerminated()), Qt::UniqueConnection);
connect(m_socket, SIGNAL(connected()), SLOT(onConnectionEstablished()), Qt::UniqueConnection);
if(!(QAbstractSocket::ConnectedState == m_socket->state()))
{
m_socket->connectToHost(QHostAddress::Broadcast, ui->port->value(), QIODevice::ReadWrite);
}
}
void Widget::readSocketData()
{
while(m_socket->bytesAvailable())
{
QTextStream T(m_socket);
ui->incoming->addItem(T.readAll());
}
}
void Widget::on_send_clicked()
{
sendMessage(ui->message->text());
}
void Widget::sendMessage(QString msg)
{
QByteArray dataSend;
QDataStream dataStream(&dataSend, QIODevice::WriteOnly);
dataStream.setByteOrder(QDataStream::LittleEndian);
dataStream << msg.length();
dataSend.append(msg);
m_socket->write(dataSend, dataSend.length());
}
void Widget::connectionError(QAbstractSocket::SocketError socketError)
{
std::string errorStr = "ERROR: " + m_socket->errorString().toStdString();
QMessageBox::information(this, tr("Tcp Server Client"), tr(errorStr.c_str()));
}
void Widget::tcpSocketState(QAbstractSocket::SocketState socketState)
{
switch (socketState) {
case QAbstractSocket::UnconnectedState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket is not connected."));
break;
case QAbstractSocket::HostLookupState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket is performing a hostname lookup."));
break;
case QAbstractSocket::ConnectedState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("A connection is established."));
break;
case QAbstractSocket::ConnectingState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket has started establishing a connection."));
break;
case QAbstractSocket::BoundState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket is bound to an address and port."));
break;
case QAbstractSocket::ClosingState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket is about to close."));
break;
case QAbstractSocket::ListeningState:
QMessageBox::information(this, tr("Tcp Server Client"), tr("The socket is listening."));
break;
default:
QMessageBox::information(this, tr("Tcp Server Client"), tr("Unknown State."));
}
}
void Widget::onConnectionTerminated()
{
QMessageBox::information(this, tr("Tcp Server Client"), tr("Disconnected."));
}
void Widget::onConnectionEstablished()
{
QMessageBox::information(this, tr("Tcp Server Client"), tr("Connected!"));
}
如果有人能帮我确定为什么会出现这个错误,我将不胜感激。我是Qt和网络的新手,所以可能有一些很明显的东西我错过了。
提前感谢!
事实上,您缺少一件基本的事情:为了能够连接到套接字,您需要有一个侦听该地址和端口的进程。因此,您实际上可以使用同一软件的两个实例来建立连接,但这两个实例中的一个必须充当服务器(并侦听),第二个实例必须尝试进行连接。到目前为止,您只实现了第二部分。
所以你应该添加一些类似的东西:
void Widget::on_listen_clicked()
{
if (!m_socket->listen()) {
QMessageBox::information(this, tr("Tcp Server"),tr("Error listening!"));
}
}
当然,你需要在你的小部件上有一个监听按钮,并在你的一个运行实例上使用它。
您不能将广播地址与TCP一起使用。因此,您可以选择单播地址(指向单个目的地的地址),也可以使用QUdpSocket
。
您可以在文档中找到这两种情况的示例:http://doc.qt.io/qt-5/examples-network.html
相关文章:
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- OpenCV Android C++ imwrite not found
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 使用单词"not"作为C ++类的名称会导致VS2019错误
- 错误"Could not find Boost"(缺少:上下文标头)
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- Is !NaN not a NaN?
- 为什么我会" void value not ignored as it ought to be"?
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- Directx 11 - CompileFromFile() is not compiling
- 方法错误"not all control paths return a value"和方法不返回值
- Centos7 g++ "to_string is not in a member of std"
- 将系数存储在头文件的数组中("does not name a type"错误)
- QGraphicsItems not showing up QGraphicsScene
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- QObject::connect not connecting signal to slot
- QTcpSocket Not Connecting