Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QTcpServer listen QHostAddress::Any network operation timed out
Forum Updated to NodeBB v4.3 + New Features

QTcpServer listen QHostAddress::Any network operation timed out

Scheduled Pinned Locked Moved Solved General and Desktop
11 Posts 4 Posters 5.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M mikelij

    Using Desktop QT 5.9.1 Mingw 32bit, QTcpServer listen on QHostAddress::Any, sometimes it works, sometimes it reports "network operation timed out".
    The OS is windows 10

    Edit:
    There was an error message in the Application out window:
    QSocks5SocketEnginePrivate::_q_controlSocketReadNotification: Unexpectedly received data while in state=10 and mode=2

    This seems to be a bug of QTcpServer.

    Taz742T Offline
    Taz742T Offline
    Taz742
    wrote on last edited by
    #2

    @mikelij
    We need a little more knowledge.
    Can you share full code?
    https://forum.qt.io/topic/54727/solved-network-problems-qtcpsocket-qtcpserver/5

    Do what you want.

    M 2 Replies Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #3

      Does upgrading to Qt 5.9.2 solve the problem?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      M 1 Reply Last reply
      0
      • Taz742T Taz742

        @mikelij
        We need a little more knowledge.
        Can you share full code?
        https://forum.qt.io/topic/54727/solved-network-problems-qtcpsocket-qtcpserver/5

        M Offline
        M Offline
        mikelij
        wrote on last edited by VRonin
        #4

        @Taz742 said in QTcpServer listen QHostAddress::Any network operation timed out:

        @mikelij
        We need a little more knowledge.
        Can you share full code?
        https://forum.qt.io/topic/54727/solved-network-problems-qtcpsocket-qtcpserver/5

        This is my code.

        void ServerSocket::startListening()
        {
            while (!tcpServer.isListening() && !tcpServer.listen(QHostAddress::Any, this->serverPort)) {
                QMessageBox::StandardButton ret = QMessageBox::critical(NULL,
                                                tr("Loopback"),
                                                tr("Unable to start the test: %1.")
                                                .arg(tcpServer.errorString()),
                                                QMessageBox::Retry
                                                | QMessageBox::Cancel);
                if (ret == QMessageBox::Cancel)
                    return;
            }
            connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(acceptConnection()));
        }
        
        1 Reply Last reply
        0
        • VRoninV VRonin

          Does upgrading to Qt 5.9.2 solve the problem?

          M Offline
          M Offline
          mikelij
          wrote on last edited by
          #5

          @VRonin
          Tried 5.9.2. It did not work. Still got the "network operation timed out" error.

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #6

            Ok, let's try not to stop the event loop:

            void ServerSocket::startListening()
            {
                while (!tcpServer.listen(QHostAddress::Any, this->serverPort)) {
                    QMessageBox::StandardButton ret = QMessageBox::critical(NULL,
                                                    tr("Loopback"),
                                                    tr("Unable to start the test: %1.")
                                                    .arg(tcpServer.errorString()),
                                                    QMessageBox::Retry
                                                    | QMessageBox::Cancel);
                    if (ret == QMessageBox::Cancel)
                        return;
                }
                connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(acceptConnection()));
            }
            

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            M 1 Reply Last reply
            0
            • VRoninV VRonin

              Ok, let's try not to stop the event loop:

              void ServerSocket::startListening()
              {
                  while (!tcpServer.listen(QHostAddress::Any, this->serverPort)) {
                      QMessageBox::StandardButton ret = QMessageBox::critical(NULL,
                                                      tr("Loopback"),
                                                      tr("Unable to start the test: %1.")
                                                      .arg(tcpServer.errorString()),
                                                      QMessageBox::Retry
                                                      | QMessageBox::Cancel);
                      if (ret == QMessageBox::Cancel)
                          return;
                  }
                  connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(acceptConnection()));
              }
              
              M Offline
              M Offline
              mikelij
              wrote on last edited by
              #7

              @VRonin
              Did not work. Still the same error.

              1 Reply Last reply
              0
              • Taz742T Taz742

                @mikelij
                We need a little more knowledge.
                Can you share full code?
                https://forum.qt.io/topic/54727/solved-network-problems-qtcpsocket-qtcpserver/5

                M Offline
                M Offline
                mikelij
                wrote on last edited by
                #8

                @Taz742
                My code is copied from the official loopback example.
                //dialog.h
                /****************************************************************************
                **
                ** Copyright (C) 2016 The Qt Company Ltd.
                ** Contact: https://www.qt.io/licensing/
                **
                ** This file is part of the examples of the Qt Toolkit.
                **
                ** $QT_BEGIN_LICENSE:BSD$
                ** Commercial License Usage
                ** Licensees holding valid commercial Qt licenses may use this file in
                ** accordance with the commercial license agreement provided with the
                ** Software or, alternatively, in accordance with the terms contained in
                ** a written agreement between you and The Qt Company. For licensing terms
                ** and conditions see https://www.qt.io/terms-conditions. For further
                ** information use the contact form at https://www.qt.io/contact-us.
                **
                ** BSD License Usage
                ** Alternatively, you may use this file under the terms of the BSD license
                ** as follows:
                **
                ** "Redistribution and use in source and binary forms, with or without
                ** modification, are permitted provided that the following conditions are
                ** met:
                ** * Redistributions of source code must retain the above copyright
                ** notice, this list of conditions and the following disclaimer.
                ** * Redistributions in binary form must reproduce the above copyright
                ** notice, this list of conditions and the following disclaimer in
                ** the documentation and/or other materials provided with the
                ** distribution.
                ** * Neither the name of The Qt Company Ltd nor the names of its
                ** contributors may be used to endorse or promote products derived
                ** from this software without specific prior written permission.
                **
                **
                ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
                ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
                **
                ** $QT_END_LICENSE$
                **
                ****************************************************************************/

                #ifndef DIALOG_H
                #define DIALOG_H

                #include <QDialog>
                #include <QTcpServer>
                #include <QTcpSocket>

                QT_BEGIN_NAMESPACE
                class QDialogButtonBox;
                class QLabel;
                class QProgressBar;
                class QPushButton;
                class QTcpServer;
                class QTcpSocket;
                class QAction;
                QT_END_NAMESPACE

                class Dialog : public QDialog
                {
                Q_OBJECT

                public:
                Dialog(QWidget *parent = 0);

                public slots:
                void start();
                void acceptConnection();
                void startTransfer();
                void updateServerProgress();
                void updateClientProgress(qint64 numBytes);
                void displayError(QAbstractSocket::SocketError socketError);

                private:
                QProgressBar *clientProgressBar;
                QProgressBar *serverProgressBar;
                QLabel *clientStatusLabel;
                QLabel *serverStatusLabel;

                QPushButton *startButton;
                QPushButton *quitButton;
                QDialogButtonBox *buttonBox;
                
                QTcpServer tcpServer;
                QTcpSocket tcpClient;
                QTcpSocket *tcpServerConnection;
                int bytesToWrite;
                int bytesWritten;
                int bytesReceived;
                

                };

                #endif

                //dialog.cpp

                /****************************************************************************
                **
                ** Copyright (C) 2016 The Qt Company Ltd.
                ** Contact: https://www.qt.io/licensing/
                **
                ** This file is part of the examples of the Qt Toolkit.
                **
                ** $QT_BEGIN_LICENSE:BSD$
                ** Commercial License Usage
                ** Licensees holding valid commercial Qt licenses may use this file in
                ** accordance with the commercial license agreement provided with the
                ** Software or, alternatively, in accordance with the terms contained in
                ** a written agreement between you and The Qt Company. For licensing terms
                ** and conditions see https://www.qt.io/terms-conditions. For further
                ** information use the contact form at https://www.qt.io/contact-us.
                **
                ** BSD License Usage
                ** Alternatively, you may use this file under the terms of the BSD license
                ** as follows:
                **
                ** "Redistribution and use in source and binary forms, with or without
                ** modification, are permitted provided that the following conditions are
                ** met:
                ** * Redistributions of source code must retain the above copyright
                ** notice, this list of conditions and the following disclaimer.
                ** * Redistributions in binary form must reproduce the above copyright
                ** notice, this list of conditions and the following disclaimer in
                ** the documentation and/or other materials provided with the
                ** distribution.
                ** * Neither the name of The Qt Company Ltd nor the names of its
                ** contributors may be used to endorse or promote products derived
                ** from this software without specific prior written permission.
                **
                **
                ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
                ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
                **
                ** $QT_END_LICENSE$
                **
                ****************************************************************************/

                #include <QtWidgets>
                #include <QtNetwork>

                #include "dialog.h"

                static const int TotalBytes = 50 * 1024 * 1024;
                static const int PayloadSize = 64 * 1024; // 64 KB

                Dialog::Dialog(QWidget *parent)
                : QDialog(parent)
                {
                clientProgressBar = new QProgressBar;
                clientStatusLabel = new QLabel(tr("Client ready"));
                serverProgressBar = new QProgressBar;
                serverStatusLabel = new QLabel(tr("Server ready"));

                startButton = new QPushButton(tr("&Start"));
                quitButton = new QPushButton(tr("&Quit"));
                
                buttonBox = new QDialogButtonBox;
                buttonBox->addButton(startButton, QDialogButtonBox::ActionRole);
                buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
                
                connect(startButton, SIGNAL(clicked()), this, SLOT(start()));
                connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
                connect(&tcpServer, SIGNAL(newConnection()),
                        this, SLOT(acceptConnection()));
                connect(&tcpClient, SIGNAL(connected()), this, SLOT(startTransfer()));
                connect(&tcpClient, SIGNAL(bytesWritten(qint64)),
                        this, SLOT(updateClientProgress(qint64)));
                connect(&tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),
                        this, SLOT(displayError(QAbstractSocket::SocketError)));
                
                QVBoxLayout *mainLayout = new QVBoxLayout;
                mainLayout->addWidget(clientProgressBar);
                mainLayout->addWidget(clientStatusLabel);
                mainLayout->addWidget(serverProgressBar);
                mainLayout->addWidget(serverStatusLabel);
                mainLayout->addStretch(1);
                mainLayout->addSpacing(10);
                mainLayout->addWidget(buttonBox);
                setLayout(mainLayout);
                
                setWindowTitle(tr("Loopback"));
                

                }

                void Dialog::start()
                {
                startButton->setEnabled(false);

                #ifndef QT_NO_CURSOR
                QApplication::setOverrideCursor(Qt::WaitCursor);
                #endif

                bytesWritten = 0;
                bytesReceived = 0;
                
                while (!tcpServer.isListening() && !tcpServer.listen()) {
                    QMessageBox::StandardButton ret = QMessageBox::critical(this,
                                                    tr("Loopback"),
                                                    tr("Unable to start the test: %1.")
                                                    .arg(tcpServer.errorString()),
                                                    QMessageBox::Retry
                                                    | QMessageBox::Cancel);
                    if (ret == QMessageBox::Cancel)
                        return;
                }
                
                serverStatusLabel->setText(tr("Listening"));
                clientStatusLabel->setText(tr("Connecting"));
                tcpClient.connectToHost(QHostAddress::LocalHost, tcpServer.serverPort());
                

                }

                void Dialog::acceptConnection()
                {
                tcpServerConnection = tcpServer.nextPendingConnection();
                connect(tcpServerConnection, SIGNAL(readyRead()),
                this, SLOT(updateServerProgress()));
                connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)),
                this, SLOT(displayError(QAbstractSocket::SocketError)));

                serverStatusLabel->setText(tr("Accepted connection"));
                tcpServer.close();
                

                }

                void Dialog::startTransfer()
                {
                // called when the TCP client connected to the loopback server
                bytesToWrite = TotalBytes - (int)tcpClient.write(QByteArray(PayloadSize, '@'));
                clientStatusLabel->setText(tr("Connected"));
                }

                void Dialog::updateServerProgress()
                {
                bytesReceived += (int)tcpServerConnection->bytesAvailable();
                tcpServerConnection->readAll();

                serverProgressBar->setMaximum(TotalBytes);
                serverProgressBar->setValue(bytesReceived);
                serverStatusLabel->setText(tr("Received %1MB")
                                           .arg(bytesReceived / (1024 * 1024)));
                
                if (bytesReceived == TotalBytes) {
                    tcpServerConnection->close();
                    startButton->setEnabled(true);
                

                #ifndef QT_NO_CURSOR
                QApplication::restoreOverrideCursor();
                #endif
                }
                }

                void Dialog::updateClientProgress(qint64 numBytes)
                {
                // callen when the TCP client has written some bytes
                bytesWritten += (int)numBytes;

                // only write more if not finished and when the Qt write buffer is below a certain size.
                if (bytesToWrite > 0 && tcpClient.bytesToWrite() <= 4*PayloadSize)
                    bytesToWrite -= (int)tcpClient.write(QByteArray(qMin(bytesToWrite, PayloadSize), '@'));
                
                clientProgressBar->setMaximum(TotalBytes);
                clientProgressBar->setValue(bytesWritten);
                clientStatusLabel->setText(tr("Sent %1MB")
                                           .arg(bytesWritten / (1024 * 1024)));
                

                }

                void Dialog::displayError(QAbstractSocket::SocketError socketError)
                {
                if (socketError == QTcpSocket::RemoteHostClosedError)
                return;

                QMessageBox::information(this, tr("Network error"),
                                         tr("The following error occurred: %1.")
                                         .arg(tcpClient.errorString()));
                
                tcpClient.close();
                tcpServer.close();
                clientProgressBar->reset();
                serverProgressBar->reset();
                clientStatusLabel->setText(tr("Client ready"));
                serverStatusLabel->setText(tr("Server ready"));
                startButton->setEnabled(true);
                

                #ifndef QT_NO_CURSOR
                QApplication::restoreOverrideCursor();
                #endif
                }

                My code is a little different from the example. My code listens on QHostAddress::Any, and a port number. The loopback example, use listern(), without any parameter. The default value of address is QHostAddress::Any, the default port is 0.

                Tried the loopback example again. It failed also.

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  Sunfluxgames
                  wrote on last edited by
                  #9

                  Your firewall or Router is blocking your listen function. Nothing wrong with your code as it works on my machine windows 10 x64.

                  M 1 Reply Last reply
                  2
                  • S Sunfluxgames

                    Your firewall or Router is blocking your listen function. Nothing wrong with your code as it works on my machine windows 10 x64.

                    M Offline
                    M Offline
                    mikelij
                    wrote on last edited by
                    #10

                    @Sunfluxgames
                    No idea now. My Windows 10 firewall is turned off. Regarding Router, no idea about how to do that.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mikelij
                      wrote on last edited by mikelij
                      #11

                      @Global-Moderators @Sunfluxgames @Taz742 @VRonin
                      Finally I found the root cause! I set the global proxy settings in internet options. Go to IE, Tools->Internet options->Connections tab->Lan Settings->Check "use a proxy server for your LAN(These settings will not apply to dial up or VPN connections). And set the proxy server ip address/port for protocols, this settings has impact to the QT server listen functionality, causing the "network operation timed out" error. After I turned off the proxy settings in internet options. the QT server listen functionality worked properly.

                      1 Reply Last reply
                      2

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved