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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [socket] Не соединяет SIGNAL(newConnection()) со слотом  (Прочитано 11001 раз)
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();
...
В чем проблема?
Записан
Bepec
Гость
« Ответ #1 : Октябрь 08, 2013, 18:26 »

Разбавлю тишину - ни в чём. Всё должно работать.
Если не уверен что правильно соединяется - проверяй возвращаемое значение connect. Там буль возвращает.
Записан
vaansk
Гость
« Ответ #2 : Октябрь 08, 2013, 21:07 »

Если имеется ввиду QObject::connect, то там возвращается не буль, а QMetaObject

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

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

Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Октябрь 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.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
alexandros
Гость
« Ответ #4 : Октябрь 08, 2013, 21:58 »

Код
C++ (Qt)
void CoreServer::newConnection()
{
   if(hasPendingConnections()){
       QTcpSocket *socket = nextPendingConnection();
   }
}
 
Записан
vaansk
Гость
« Ответ #5 : Октябрь 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
Однако при новом соединении метод все равно не вызывается
Записан
vaansk
Гость
« Ответ #6 : Октябрь 08, 2013, 22:14 »

Код
C++ (Qt)
void CoreServer::newConnection()
{
   if(hasPendingConnections()){
       QTcpSocket *socket = nextPendingConnection();
   }
}
 

что с этим делать?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #7 : Октябрь 08, 2013, 22:18 »

Цитировать
socket->connectToHost проходит успешно и все соединяется
Как проверяли, что соединяется?
Сразу после connectToHost поставьте qDebug()<<socket->waitForConnected() в клиенте. Должно возвратить true.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vaansk
Гость
« Ответ #8 : Октябрь 08, 2013, 22:19 »

Вот, кстати, сам сервер
https://github.com/farcost/ourtrack/tree/master/ourtrackserv

Клиент: https://github.com/farcost/ourtrack/tree/master/ourtrack
Записан
vaansk
Гость
« Ответ #9 : Октябрь 08, 2013, 22:20 »

Цитировать
socket->connectToHost проходит успешно и все соединяется
Как проверяли, что соединяется?
Сразу после connectToHost поставьте qDebug()<<socket->waitForConnected() в клиенте. Должно возвратить true.

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

успешно минует условие
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #10 : Октябрь 08, 2013, 22:22 »

Зачем в сервере 29 строка?   tcpServer->newConnection();
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vaansk
Гость
« Ответ #11 : Октябрь 08, 2013, 22:23 »

это просто проверял, случайно в коммит попало) в оригинале ее нет)
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #12 : Октябрь 08, 2013, 22:24 »

Косяк в 57 строке клиента.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vaansk
Гость
« Ответ #13 : Октябрь 08, 2013, 22:26 »

в чем состоит косяк,
сокет закрывается просто сразу, метод newConnection то должен вызываться на сервере, или я не прав?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #14 : Октябрь 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.
Скорее всего просто не успевает выслать или что-то в этом роде.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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