Qt: QTcpServer/QTcpSocket, когда клиент переношу на другой компьютер - не подключается

Привет всем! Первый раз пишу у вас на форуме. Проблема в следующем, Написал 2 небольшие программы сервер - QTcpServer и клиент -QTcpSocket, на локальном компе все соединяется и все работает, но когда я клиент переношу на другой компьютер, он не подключается к серверу, причем если я, запускаю этот же клиент с этим IP, на том же компе где и сервер, все работает. Вот собственно говоря код:
Server.h:

#ifndef MYSERVER_H
#define MYSERVER_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>
#include <QTime>

class MyServer : public QWidget
{
    Q_OBJECT
private:
    QTcpServer* m_ptcpServer;
    quint16     m_nNextBlockSize;

public:
    explicit MyServer( int nPort, QWidget *parent = nullptr);
     void sendToClient(const QString& str);
      QTcpSocket *pClientSocket;

public slots:
    virtual void slotNewConnection();

signals:

};

#endif // MYSERVER_H

Server.cpp

#include "myserver.h"



MyServer::MyServer(int nPort, QWidget *parent)
    : QWidget(parent)
    , m_nNextBlockSize(0)
{
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::AnyIPv4, nPort))
    {
      QMessageBox::critical(0, "Server Error", "Unable to start the server:" + m_ptcpServer->errorString());
      m_ptcpServer->close();
      return;
    }

    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));

}

void MyServer::slotNewConnection()
{
    pClientSocket = m_ptcpServer->nextPendingConnection();
   connect(pClientSocket, SIGNAL(disconnected()),   pClientSocket, SLOT(deleteLater()));
   connect(pClientSocket, SIGNAL(readyRead()),   pClientSocket, SLOT(slotReadClient()));
   sendToClient("Server Response: Connected!");
  
}

void MyServer::sendToClient(const QString &str)
{
    QByteArray arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_9);
    out << quint16(0) << QTime::currentTime() << str;
    out.device()->seek(0);
     out << quint16(arrBlock.size() - sizeof(quint16));
     pClientSocket->write(arrBlock);
}

Client.h

#ifndef MYCLIENT_H
#define MYCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QTime>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QLabel>
#include <QDebug>

class MyClient : public QWidget
{
    Q_OBJECT
public:
    explicit MyClient(const QString& strHost, int nPort, QWidget *parent = nullptr);

private:
     QTcpSocket* m_pTcpSocket;
     quint16     m_nNextBlockSize;
       QTextEdit*  m_ptxtInfo;

private slots:
    void slotReadyRead ();
     void slotConnected ();
     void slotError (QAbstractSocket::SocketError);

signals:

};

#endif // MYCLIENT_H

Client.cpp

#include "myclient.h"

MyClient::MyClient(const QString& strHost, int nPort, QWidget *parent)
    : QWidget(parent) , m_nNextBlockSize(0)
{
    m_pTcpSocket = new QTcpSocket(this);
    m_pTcpSocket->connectToHost(strHost, nPort);
    connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()));
    connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
     connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
      this,  SLOT(slotError(QAbstractSocket::SocketError)));

     m_ptxtInfo  = new QTextEdit;
     m_ptxtInfo->setReadOnly(true);
     QVBoxLayout* pvbxLayout = new QVBoxLayout;
        pvbxLayout->addWidget(new QLabel("<H1>Client</H1>"));
        pvbxLayout->addWidget(m_ptxtInfo);
          setLayout(pvbxLayout);

}

void MyClient::slotReadyRead()
{
    QDataStream in(m_pTcpSocket);
    in.setVersion(QDataStream::Qt_4_2);
    for (;;) {
        if (!m_nNextBlockSize) {
            if (m_pTcpSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> m_nNextBlockSize;
        }

        if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
            break;
        }
        QTime   time;
        QString str;
        in >> time >> str;

        m_ptxtInfo->append(time.toString() + " " + str);
      //  qDebug() << str;
        m_nNextBlockSize = 0;
    }
}

void MyClient::slotError(QAbstractSocket::SocketError err)
{
    QString strError =
        "Error: " + (err == QAbstractSocket::HostNotFoundError ?
                     "The host was not found." :
                     err == QAbstractSocket::RemoteHostClosedError ?
                     "The remote host is closed." :
                     err == QAbstractSocket::ConnectionRefusedError ?
                     "The connection was refused." :
                     QString(m_pTcpSocket->errorString())
                    );
     qDebug() << strError;

    m_ptxtInfo->append(strError);
}

void MyClient::slotConnected()
{
    m_ptxtInfo->append("Received the connected() signal");
   // QString str = "Received the connected() signal";
     //qDebug() << "Received the connected() signal";

}

Какую ошибку выдает?

Он в той же сети? Если нет, то может нужно например настроить port forwarding на роутере.

Нет, они просто подключены к одному Wi-fi, а ошибку выдает такую: “Сonnection timed out

IP точно правильный, он откуда берется?

Вообще я его брал из команды ipconfig, но потом и в инете брал, что бы попробовать, ничего не помогает

Если “в инете”, то это будет внешний, а не локальный, и тогда надо


Может из ipconfig что-то не то взято, там же много чего может выводиться.

Можно например в веб-интерфейсе роутера посмотреть адреса всех компов. И там же настроить статичный локальный IP для компа, чтоб не менялся.

А по внешнему можно подключиться? Просто все таки хотел, что бы к нему многие подключаться смогли и если да, то можно по подробнее про port forwarding? И еще, я могу комп к инету подключить на прямую через кабель, на нем может, тогда получиться еще что то настроить?

У всех компов в сети скорее всего будет один и тот же внешний IP.
Надо указать к какому компу (локальный IP) надо направить запрос когда например обращаются по порту 1234.

Как это сделать зависит от роутера, обычно так и называется в веб-интерфейсе, или гуглить “модель_роутера port forwarding”.

Понял, ладно щас, что-нибудь попробую, а если миновать роутер и комп напрямую через кабель подключить, так не легче или там тоже самое надо настраивать?

Проблема решена, если кому интересно, все оказалось тривиальнее, всего лишь нужно было отключить файрволл на компьютере и все заработало!

Так кабель же видимо тоже в роутер уходит.
Если речь не о соединении двух компов одним кабелем (создание еще одной локальной сети), но непонятно зачем.

хм, странно, по-моему если фаервол блокировал соединение, то должна была выдаваться другая ошибка, а не Сonnection timed out :thinking:

Я тоже так думал, ну у меня антивирус нод 32, может из-за него так, именно на нем я отключил файервол и подключился к компу с телефона (на него клиент установил) по внешнему ip, кабель чисто в комп вставил, минуя роутер.