2015-06-25 9 views
0

Я пытаюсь установить соединение QTcpSocket. Я работаю над простым приложением, которое включает двунаправленную связь через один TCP-сокет.QTcpSocket Not Connecting

Я тестирую свой код, запустив два экземпляра одного приложения и подключившись как к QHostAddress :: Broadcast. Когда я запускаю мой код, я получаю следующую последовательность состояний:

  1. QAbstractSocket :: HostLookupState - «Гнездо выполняет поиск имени хоста.»
  2. QAbstractSocket :: ConnectionState - «Розетка начала устанавливать соединение».
  3. QAbstractSocket :: UnconnectedState - «Сокет не подключен».
  4. QAbstractSocket :: SocketError - «Разрешение отказано».

EDIT: После некоторой дальнейшей отладки, я обнаружил, что пункт # 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 и в сети, поэтому может быть что-то довольно очевидное, что мне не хватает.

Заранее благодарен!

ответ

0

На самом деле есть основная вещь, что вам не хватает: чтобы иметь возможность подключения к розетке нужно есть процесс, который прослушивает что адрес и порт. Итак, вы можете использовать два экземпляра одного и того же программного обеспечения для соединения, но один из двух экземпляров должен действовать как сервер (и слушать), а второй экземпляр должен попытаться выполнить соединение. До сих пор вы реализовали только вторую часть.

Таким образом, вы должны добавить что-то вроде:

void Widget::on_listen_clicked() 
{ 
    if (!m_socket->listen()) { 
     QMessageBox::information(this, tr("Tcp Server"),tr("Error listening!")); 
    } 
} 

И, конечно, нужно иметь кнопку прослушивания на виджете и использовать его на одном из ваших запущенных экземпляров.

0

Вы не можете использовать широковещательный адрес с TCP. Таким образом, вы можете выбрать одноадресный адрес (адрес, указывающий на один пункт назначения), или использовать QUdpSocket.

Вы можете найти примеры в документации для обоих случаев: http://doc.qt.io/qt-5/examples-network.html

+0

Я пробовал QHostAddress :: LocalHost (который, как я считаю, одноадресный), и у меня такая же проблема. Возможно, что-то еще мне не хватает? Благодаря! – mtwister

+0

Я попытался подключить два компьютера через кабель Ethernet и ввел соответствующие IP-адреса. У меня все еще такая же проблема. Поэтому я предполагаю, что в моем коде есть что-то еще ... – mtwister

+0

Вы открыли порт, который вы пытаетесь подключить локально (для локального хоста) или на другом компьютере (например, с 'QTcpServer' и его функцией' listen', или любое другое серверное программное обеспечение)? – alexisdm

Смежные вопросы