Russian Qt Forum

Qt => Работа с сетью => Тема начата: Примерный ученик от Март 24, 2013, 16:30



Название: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 24, 2013, 16:30
QTcpServer создает по мере подключения массив наследников QTcpSocket. Как отслеживать завершившие работу подключения, что бы на их место размещать новые?


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: gil9red от Март 24, 2013, 23:44
отлавливайте сигналы)

сигналы:
void   connected ()
void   disconnected ()


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 09:02
если соединить disconnected() QTcpSocket cо слотом QTcpServer, то как передать НОМЕР именно этого сокета? Сигнал disconnected() не передает параметров слоту ???


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: RedDog от Март 25, 2013, 09:04
Хранить массив подконнекченных сокетов (в мапе - ключ- указатель на сокет, значение - номер или адрес) а в слоте по sendr()-у из мапы доставать.


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 09:15
спасибо, понял, то что надо


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 09:35
Код:
connect( myClient[j], SIGNAL( disconnected()), this, SLOT(clientDisconnect()));

что то не понял, как мне в clientDisconnect() определить указатель на отправитель сигнала, если нет передаваемого параметра?


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: RedDog от Март 25, 2013, 09:44
ну sender() же (выше писалось), выдает указатель на QObject и через qobject_cast привести его к QTcpSocket*
хотя последнее возможно и лишнее


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 09:49
Код:
void loadServer::clientDisconnect()
{

}

как там sender определить? Ну не понимаю ???


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: RedDog от Март 25, 2013, 09:52
Код:
void loadServer::clientDisconnect()
{
    QTcpSocket *senderSocket = qobject_cast<QTcpSocket *>(sener());
}


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 09:58
спасибо, не знал ::)


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 12:30
Код:
void loadServer::clientDisconnect()
{
serverClient *senderSocket = qobject_cast<serverClient *>(sender());
for (int i=0;i<maxClient;i++) // удаляем подключения
if (myClient[i]==senderSocket)
{
delete myClient[i];
myClient[i]=0;
break;
}
}

Идентифицирует правильно, но после удаления подключения валится на

Код:
void QHostAddressPrivate::clear()
{
    a = 0;
    protocol = QAbstractSocket::UnknownNetworkLayerProtocol;
    isParsed = true;
    memset(&a6, 0, sizeof(a6));
}

Чего я не учитываю?


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: RedDog от Март 25, 2013, 12:33
Код:
myClient[i]->deleteLater();


Название: Re: Как отследить, какй QTcpSocket закрылся?
Отправлено: Примерный ученик от Март 25, 2013, 12:52
спасибо, помогло ::)