Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
1

QTcpSocket узнать какой именно клиент отключился

02.02.2013, 14:55. Просмотров 3463. Ответов 12
Метки нет (Все метки)

У меня есть 2 программы на клиент-серверной связке
Мне важно на сервера знать IP клиентов и их состояния(подключены/отключены)
С подключением всё просто, как только клиент запускается, я могу узнать IP прямо в нём и отправить его по сети

Проблема в том, что я не могу придумать, как определить IP отключившегося клиента, так как не обязательно завершение будет корректным и деструктор выполнит все действия корректно(например успеет отослать сообщение с IP)

пока что я могу только увидеть сообщение "HERE"

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void MainWindow::slotNewConnection()
{
    QTcpSocket* pClientSocket = ptcpServer->nextPendingConnection();
    connect(pClientSocket, SIGNAL(disconnected()), this, SLOT(disconnectedEvent()));
    connect(pClientSocket, SIGNAL(disconnected()), pClientSocket, SLOT(deleteLater()));
    connect(pClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadClient()));
 
    sendToClient(pClientSocket, tr("<font color=green>Соединение с сервером успешно установлено</font>"));
}
 
void MainWindow::disconnectedEvent()
{
    qDebug() << "HERE";
}
Заранее огромное спасибо за любые идеи
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2013, 14:55
Ответы с готовыми решениями:

QTcpSocket клиент
Пишу приложение для отправки запросов серверу и считывание их. Отправка происходит, но нет сигнала...

Клиент QTcpSocket
Все привет.Помогите разобраться,пожалуйста. Работаю с Cisco. Коннекчусь через телнет, отправляю...

QTcpSocket узнать IP хоста
Есть клиент и есть сервер. На сервере if (!SERVER-&gt;listen(QHostAddress::Broadcast,4444)) // все...

Как узнать что удаленный клиент отключился
Здравствуйте. При подключение клиента создается список клиентов NetworkStream networkStream =...

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...

12
Чистый
Автор FAQ
2722 / 1418 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
02.02.2013, 16:15 2
опрашивать все ранее подключившиеся ПК ?
0
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
02.02.2013, 16:28  [ТС] 3
Цитата Сообщение от Чистый Посмотреть сообщение
опрашивать все ранее подключившиеся ПК ?
Разве с сервера можно послать запрос клиенту(не ответ, а именно запрос)?
Если да, то как?
0
Maxim Prishchepa
Эксперт С++
1929 / 1041 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.02.2013, 18:03 4
у TcpSоcket-а есть сигнал disconnected (), когда клиент соединяется с сервером, сервер формирует сокет, в этот момент нужно сдеать коннект этого сигнала от сокета со слотом к примеру onSocketDisconnected() и в этом сокете с помощью sender() узнать, кто сгенерировал этот сигнал, преобразовать к сокету и из него достать IP. Вроде ничего сложного
1
Чистый
Автор FAQ
2722 / 1418 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
02.02.2013, 18:21 5
а если клиент умрет не послав ничего ?
0
Maxim Prishchepa
Эксперт С++
1929 / 1041 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.02.2013, 18:30 6
и чо? ну умер... ну и пусть покоется с миром... это же TCP, поставьте keepAlive в true и все правда там таймаут по умолчанию вроде большой...
0
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
02.02.2013, 18:54  [ТС] 7
Цитата Сообщение от l_a_m Посмотреть сообщение
у TcpSоcket-а есть сигнал disconnected (), когда клиент соединяется с сервером, сервер формирует сокет, в этот момент нужно сдеать коннект этого сигнала от сокета со слотом к примеру onSocketDisconnected() и в этом сокете с помощью sender() узнать, кто сгенерировал этот сигнал, преобразовать к сокету и из него достать IP. Вроде ничего сложного
спасибо, как Вы могли заметить, у меня есть этот слот
connect(pClientSocket, SIGNAL(disconnected()), this, SLOT(disconnectedEvent()));

сейчас попробую разобраться с sender

Добавлено через 8 минут
Начал пробовать

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void MainWindow::slotNewConnection()
{
    QTcpSocket* pClientSocket = ptcpServer->nextPendingConnection();
    connect(pClientSocket, SIGNAL(disconnected()), this, SLOT(disconnectedEvent(pClientSocket)));
    connect(pClientSocket, SIGNAL(disconnected()), pClientSocket, SLOT(deleteLater()));
    connect(pClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadClient()));
 
    sendToClient(pClientSocket, tr("<font color=green>Соединение с сервером успешно установлено</font>"));
}
 
void MainWindow::disconnectedEvent(QTcpSocket* pClientSocket)
{
    //qDebug() << pClientSocket->sender()
    qDebug() << "HERE";
}
Во-первых sender() защищён, во-вторых я не представляю, как IP вытаскивать таким образом
0
Maxim Prishchepa
Эксперт С++
1929 / 1041 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.02.2013, 19:00 8
C++ (Qt)
1
2
3
4
5
6
7
8
9
void MainWindow::disconnectedEvent(QTcpSocket* pClientSocket)
{
QTcpSocket * sock = qobject_cast<QTcpSocket *>(sender());
if (NULL == sock) {
   return;
}
//qDebug() << pClientSocket->sender()
    qDebug() << "HERE";
}
Дальше думаю сами разберетесь...
0
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
02.02.2013, 19:44  [ТС] 9
Цитата Сообщение от l_a_m Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
8
9
void MainWindow::disconnectedEvent(QTcpSocket* pClientSocket)
{
QTcpSocket * sock = qobject_cast<QTcpSocket *>(sender());
if (NULL == sock) {
   return;
}
//qDebug() << pClientSocket->sender()
    qDebug() << "HERE";
}
Дальше думаю сами разберетесь...
если честно, то теперь уж точно ничего не понимаю, я в сети новичок
0
Humanoid
Почетный модератор
10138 / 3995 / 379
Регистрация: 12.06.2008
Сообщений: 11,642
02.02.2013, 23:35 10
Цитата Сообщение от Zeka13 Посмотреть сообщение
если честно, то теперь уж точно ничего не понимаю, я в сети новичок
Всё просто. sender() возвращает какой-то указатель. В третьей строчке мы указываем, что считаем этот указатель на объект QTcpSocket. 4-6 строки просто проверяют, вдруг этот указатель на NULL, тогда ничего анализировать нельзя... ну а дальше просто проверяем sock->peerAddress() и sock->peerPort()... т.е., sock теперь указывает на конкретного клиента, с которым связано событие.
0
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
02.02.2013, 23:47  [ТС] 11
Цитата Сообщение от Humanoid Посмотреть сообщение
Всё просто. sender() возвращает какой-то указатель. В третьей строчке мы указываем, что считаем этот указатель на объект QTcpSocket. 4-6 строки просто проверяют, вдруг этот указатель на NULL, тогда ничего анализировать нельзя... ну а дальше просто проверяем sock->peerAddress() и sock->peerPort()... т.е., sock теперь указывает на конкретного клиента, с которым связано событие.
да уж, страдают мои ++, надо срочно учить!

спасибо, теперь работает!


только вот QTcpSocket* pClientSocket теперь ни к чему в параметрах
0
khrisanfov
1 / 1 / 0
Регистрация: 10.04.2012
Сообщений: 10
02.02.2013, 23:48 12
Попробуй использовать ещё UDP сокет для отправки запросов от сервера типа "кто в сети". Затем через 10 секунд к примеру проверь кто ответил, а кто нет.
0
Zeka13
4 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
02.02.2013, 23:51  [ТС] 13
Цитата Сообщение от khrisanfov Посмотреть сообщение
Попробуй использовать ещё UDP сокет для отправки запросов от сервера типа "кто в сети". Затем через 10 секунд к примеру проверь кто ответил, а кто нет.
будет более серьёзная программа, воспользуюсь, спасибо!
0
02.02.2013, 23:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2013, 23:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как узнать, какой именно из установленных браузеров выбирает пользователь
Здравствуйте. Подскажите, пожалуйста, как программно узнать, какой браузер выбирает пользователь....

Как узнать какой именно ресурс был присоединен к заявке?
Добрый вечер. Не могу решить проблему: в модели имеется блок Seize, который захватывает ресурсы из...

Как узнать на какой именно машине в сети происходит блокировка юзера AD
Добрый день. Столкнулся со следующей проблемой. В нашем домене куча серверов (около сотни), и я при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.