Russian Qt Forum

Qt => Работа с сетью => Тема начата: vaansk от Октябрь 08, 2013, 15:17



Название: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 15:17
Добрый день, %username%

Код:
tcpServer = new QTcpServer(this);
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newuser()));
tcpServer->listen(QHostAddress::Any, port);
qDebug() << tcpServer->isListening() << "TCPSocket listen on port";

Код выполняется, выводит сообщение "true TCPSocket listen on port"
т.е. все нормально...

Но при соединении клиента, слот не запускается (клиент успешно присоединяется по сокету)

Приведенный выше код - ф-я on_starting()
Все входит в один класс:
Код:
class serv : public QObject
{
  Q_OBJECT
    ...

public slots:
    void on_starting();
    void on_stoping();
    void newuser();
    void slotReadClient();
...
В чем проблема?


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: Bepec от Октябрь 08, 2013, 18:26
Разбавлю тишину - ни в чём. Всё должно работать.
Если не уверен что правильно соединяется - проверяй возвращаемое значение connect. Там буль возвращает.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 21:07
Если имеется ввиду QObject::connect, то там возвращается не буль, а QMetaObject

Кстати, после
Код:
tcpServer->listen(QHostAddress::LocalHost, 7777);
делаю
Код:
tcpServer->isListening()
вот она возвращает true, т.е. все прослушивается

Под дебагом проходил пошагово открытие сокета на клиенте, там socket->connectToHost проходит успешно и все соединяется, но в момент соединения в сервере привязанный метод newuser() не вызывается



Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: kibsoft от Октябрь 08, 2013, 21:53
Я так понял у вас Qt5. Вот из доки:
Цитировать
The function returns a QMetaObject::Connection that represents a handle to a connection if it successfully connects the signal to the slot.
The connection handle will be invalid if it cannot create the connection, for example, if QObject is unable to verify the existence of either signal or method,
or if their signatures aren't compatible. You can check if the handle is valid by casting it to a bool.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: alexandros от Октябрь 08, 2013, 21:58
Код
C++ (Qt)
void CoreServer::newConnection()
{
   if(hasPendingConnections()){
       QTcpSocket *socket = nextPendingConnection();
   }
}
 


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:11
Я так понял у вас Qt5. Вот из доки:
Цитировать
The function returns a QMetaObject::Connection that represents a handle to a connection if it successfully connects the signal to the slot.
The connection handle will be invalid if it cannot create the connection, for example, if QObject is unable to verify the existence of either signal or method,
or if their signatures aren't compatible. You can check if the handle is valid by casting it to a bool.

привел, все ок, true
Однако при новом соединении метод все равно не вызывается


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:14
Код
C++ (Qt)
void CoreServer::newConnection()
{
   if(hasPendingConnections()){
       QTcpSocket *socket = nextPendingConnection();
   }
}
 

что с этим делать?


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: kibsoft от Октябрь 08, 2013, 22:18
Цитировать
socket->connectToHost проходит успешно и все соединяется
Как проверяли, что соединяется?
Сразу после connectToHost поставьте qDebug()<<socket->waitForConnected() в клиенте. Должно возвратить true.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:19
Вот, кстати, сам сервер
https://github.com/farcost/ourtrack/tree/master/ourtrackserv

Клиент: https://github.com/farcost/ourtrack/tree/master/ourtrack


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:20
Цитировать
socket->connectToHost проходит успешно и все соединяется
Как проверяли, что соединяется?
Сразу после connectToHost поставьте qDebug()<<socket->waitForConnected() в клиенте. Должно возвратить true.

так и проверяю:
Код:
socket->connectToHost(host, port);
  if (!socket->waitForConnected())
  {
    return;
  }
 
  ...

успешно минует условие


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: kibsoft от Октябрь 08, 2013, 22:22
Зачем в сервере 29 строка?   tcpServer->newConnection();


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:23
это просто проверял, случайно в коммит попало) в оригинале ее нет)


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: kibsoft от Октябрь 08, 2013, 22:24
Косяк в 57 строке клиента.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:26
в чем состоит косяк,
сокет закрывается просто сразу, метод newConnection то должен вызываться на сервере, или я не прав?


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: kibsoft от Октябрь 08, 2013, 22:27
Цитировать
Reimplemented from QIODevice::close().
Closes the I/O device for the socket, disconnects the socket's connection with the host, closes the socket, and resets the name, address, port number and underlying socket descriptor.
See QIODevice::close() for a description of the actions that occur when an I/O device is closed.
Скорее всего просто не успевает выслать или что-то в этом роде.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:31
убрал, пересобрал, не вызывается.
пойду комп ребутну на всякий случай


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 08, 2013, 22:43
ну точно не клиент, перенес socket->close(), ребутнул комп, пересобрал и тоже самое, newuser() на сервере не запускается


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 09, 2013, 19:31
может еще кто то разбавит тишину?


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 10, 2013, 15:20
Продолжу излагать то, что пытался делать с целью поднять тему и возродить дискуссию актуальной проблемы:

на клиенте после socket->ConnetToHost()

вызываю метод socket->state(), приводя его к bool
результат: возвращает true
т.е. клиент нормально конектится, при этом метод newuser(), привязанный к сигналу newConnection() все также не вызывается(


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: Bepec от Октябрь 10, 2013, 17:33
Хотите помощи и уверены что проблема не в вашем коде - делайте минимальный компилируемый пример вашей неполадки и выкладывайте в архиве. Тогда вам помогут.


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 10, 2013, 19:27
Исходников на гитхабе мало?

Qt последняя версия + Add-In Visual studio
(MS VS 2010)

вот актуальные исходники http://rghost.ru/49294418


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: Bepec от Октябрь 10, 2013, 20:11
Мало. Ибо не люблю гитхаб. Люблю архивы на prog.org.ru или иных ресурсах "в один клик".

Посмотрел ваш проект. Вас не смущает вот этот код?
Код:
    QCoreApplication a(argc, argv);

    ourtrackserv Service;
    QTextStream in(stdin);
    QTextStream out(stdout);
   
    QString command = argv[1];
    do
    {
      command = command.toUpper();

      if (command == "START")
        Service.on_starting();
      else if (command == "STOP")
        Service.on_stoping();
      else if (command == "STATUS")
        Service.on_status();
     
      command = in.readLine();
    }
    while (!command.isNull());

    return a.exec();

Не смущает, видимо.

Суть - асинхронные интерфейсы в Qt используют систему сигнал-слотов.

Краткий экскурс - сигнал слоты работают после a.exec().

Краткое подведение итогов - теперь вы знаете, что вам нужно вызывать exec для работы сигнал слотов.

Окончательное решение проблемы - поменять код ввода команд, задуматься над архитектурой.

PS Базис для раскопок я дал, даже много. Вот работающий сервер -
Код:
#include <QtCore/QCoreApplication>
#include "ourtrackserv.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ourtrackserv Service;
    Service.on_starting();
    return a.exec();
}


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: vaansk от Октябрь 10, 2013, 20:14
благодарю


Название: Re: [socket] Не соединяет SIGNAL(newConnection()) со слотом
Отправлено: Bepec от Октябрь 10, 2013, 20:54
Пожалуйста.
В принципе тему можно или удалить или закрыть. Я склоняюсь к удалить, проблема массовая.

PS решайте сами :) Только вы царь этой темы.