Russian Qt Forum
Октябрь 01, 2024, 02:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpServer - программа завершается после listen  (Прочитано 2630 раз)
awfun
Гость
« : Июль 04, 2013, 14:17 »

Добрый день.
У меня возникла необходимость в простейшем клиент-серверном приложении, использующем протокол tcp. До этого с Qt дела не имел, про механизм сигналов и слотов прочитал.
Повторяю за автором ролика на ютуб.

Проблема в том, что после успешного вызова метода listen() программа завершает выполнение. Соответственно, клиент не успевает подключиться. У автора ролика такого не происходит, хотя я не вижу существенных различий в коде. Подскажите, в чем может быть проблема, и как ее исправить?

server.pro
Код:
QT       += core network
QT       -= gui

TARGET = server
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    myserver.cpp

HEADERS += \
    myserver.h
myserver.h
Код:
#ifndef MYSERVER_H
#define MYSERVER_H

#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>

class MyServer : public QObject
{
    Q_OBJECT
public:
    explicit MyServer(QObject *parent = 0);
    
signals:
    
public slots:
    void acceptConnection();

private:
    QTcpServer *server;
    
};

#endif // MYSERVER_H
myserver.cpp
Код:
#include "myserver.h"

MyServer::MyServer(QObject *parent) :
    QObject(parent)
{
    server = new QTcpServer(this);

    connect(server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));

    if( !server->listen(QHostAddress::Any,1234))
        printf("Server could not start\r\n");
    else
        printf("Server started\r\n");
}

void MyServer::acceptConnection()
{
    QTcpSocket *socket = server->nextPendingConnection();

    socket->write("hello client\r\n");
    socket->flush();

    socket->waitForBytesWritten(3000);

    socket->close();

}
main.cpp
Код:
#include <QCoreApplication>
#include <stdio.h>
#include "myserver.h"

int main(int argc, char * argv[])
{
    QCoreApplication a(argc, argv);
    MyServer mServer;
    printf( "finished" );
    return a.exec();
}
telnet.exe
Код:
open 127.0.0.1 1234
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июль 04, 2013, 14:36 »

Завершает выполнение или просто печатает finished?
Записан
awfun
Гость
« Ответ #2 : Июль 04, 2013, 14:41 »

Печатает finished
Записан
awfun
Гость
« Ответ #3 : Июль 04, 2013, 14:46 »

Проблема неожиданно решилась. Не знаю как, я ничего не сделал
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июль 04, 2013, 14:47 »

Проблема неожиданно решилась. Не знаю как, я ничего не сделал
Ее и до этого не было. Улыбающийся
По настоящему программа начинает работать во время a.exec(), т.е. у вас после вывода "finished".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 22.