Russian Qt Forum

Qt => Вопросы новичков => Тема начата: awfun от Июль 04, 2013, 14:17



Название: QTcpServer - программа завершается после listen
Отправлено: awfun от Июль 04, 2013, 14:17
Добрый день.
У меня возникла необходимость в простейшем клиент-серверном приложении, использующем протокол tcp. До этого с Qt дела не имел, про механизм сигналов и слотов прочитал.
Повторяю за автором ролика на ютуб (http://www.youtube.com/watch?v=BSdKkZNEKlQ).

Проблема в том, что после успешного вызова метода 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


Название: Re: QTcpServer - программа завершается после listen
Отправлено: Old от Июль 04, 2013, 14:36
Завершает выполнение или просто печатает finished?


Название: Re: QTcpServer - программа завершается после listen
Отправлено: awfun от Июль 04, 2013, 14:41
Печатает finished


Название: Re: QTcpServer - программа завершается после listen
Отправлено: awfun от Июль 04, 2013, 14:46
Проблема неожиданно решилась. Не знаю как, я ничего не сделал


Название: Re: QTcpServer - программа завершается после listen
Отправлено: Old от Июль 04, 2013, 14:47
Проблема неожиданно решилась. Не знаю как, я ничего не сделал
Ее и до этого не было. :)
По настоящему программа начинает работать во время a.exec(), т.е. у вас после вывода "finished".