Russian Qt Forum
Ноябрь 24, 2024, 01:20
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
TCP. отключение от сервера.
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: TCP. отключение от сервера. (Прочитано 16750 раз)
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #15 :
Май 01, 2010, 23:11 »
что то я не понял до конца!?
как я понимаю есть 2 варианта обработки подключения к серверу
1. обрабатывать сигнал сервера
newConnection()
и получать указатель на сокет с помощью
nextPendingConnection ()
2. переписать виртуальную функцию сервера
incomingConnection(int)
, тем самым будем иметь дескриптор сокета.
Лично я использую
2
, так как вывожу обработки клиента в поток.....и хранить список подключенных можно в след виде:
Код
C++ (Qt)
QList
<
int
>
, где int - дескриптор сокета.....это я к тому что ты можешь добавить слот к клиенту, который по отключению будет слать свой дескриптор серверу, а тот в свою очередь удалять его из списка (именно списка!!! - потому что добавление и удаление в нем быстрее чем в векторе)...вот как то так
Записан
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #16 :
Май 01, 2010, 23:37 »
только что накидал небольшую прогу - пробовал получить socketDesck после отключения сокета - выдавал
-1
....единственное что могу посоветовать хранить не дескриптор сокета ,а например
ip+port
:
Код
C++ (Qt)
struct
SClientID
{
quint32 ip
;
quint16 port
}
QList
<
SClientID
>
m_clientsList
;
когда клиент отключается он посылает сигнал -
disconnected()
, лови этот сигнал у удаляй его данные из списка.
Записан
meandnano
Гость
Re: TCP. отключение от сервера.
«
Ответ #17 :
Май 02, 2010, 00:08 »
я использую вариант 1 (дескриптов сокеты и так получишь). вопрос, как реализовать рассылку сообщений все клиентам, имея только их ip+port.
я вот думаю, может как-то организовать таймер на клиенте, который будет каждые n секунд посылать сообщения серверу - но пока хз как это устроить.
Записан
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #18 :
Май 02, 2010, 09:41 »
если клиент будет слать сообщения серваку - это будет лишней нагрузкой на сеть!! Если тебя это устроит?? а как тебе вариант сделать на серваке таймер, который через n секунд будет проверять список(вектор) с клиентами и смотрел кто отключился? этот вариант менее ресурсоемкий....можешь сделать данную проверку когда клиент шлет сигнал
disconnected()
!
p.s. А чем тебя не устроил вариант ?? у меня он работает!
Цитировать
когда клиент отключается он посылает сигнал - disconnected(), лови этот сигнал у удаляй его данные из списка.
Записан
meandnano
Гость
Re: TCP. отключение от сервера.
«
Ответ #19 :
Май 02, 2010, 17:21 »
Цитата: garryHotDog от Май 02, 2010, 09:41
а как тебе вариант сделать на серваке таймер, который через n секунд будет проверять список(вектор) с клиентами и смотрел кто отключился? этот вариант менее ресурсоемкий....можешь сделать данную проверку когда клиент шлет сигнал
disconnected()
!
такой вариант меня очень даже устроит, единственный вопрос - как проверить подключен ли клиент из моего списка (вектора) к моему серверу? данные о нем вроде как в полной мере сохранены (т.е. например socketID соответствует тому, что был выдан сервером при коннекте).
Записан
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #20 :
Май 02, 2010, 18:47 »
Цитировать
как проверить подключен ли клиент из моего списка (вектора) к моему серверу?
ты при подключении будешь добавлять в список данные о клиенте, а при его дисконнекте будешь удалять!!!
Записан
meandnano
Гость
Re: TCP. отключение от сервера.
«
Ответ #21 :
Май 02, 2010, 23:40 »
остановился на работе с айпишником вместо socketID. все работает. всем спасибо
Записан
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #22 :
Май 03, 2010, 00:00 »
для более быстрого поиска по списку клиентов - можешь использовать
Qlist<quint64>
, где в quint64(8 байт) можно запихнуть ip клиента(4 байта) и порт (2байта), оставшиеся 2 байта занулить, например
quint64: |109|064|056|045|064|035|000|000|
0 1 2 3 4 5 6 7
|<--- ip адреса --->|<-- порт -->|
сформировать такое число не сложно, а поиск будет быстрее....ну это уже на любителя
Записан
meandnano
Гость
Re: TCP. отключение от сервера.
«
Ответ #23 :
Май 03, 2010, 00:11 »
не пойму - у меня же сервер слушает один порт, через него все и подключаются. зачем хранить его для каждого клиента отдельно?
Записан
garryHotDog
Гость
Re: TCP. отключение от сервера.
«
Ответ #24 :
Май 03, 2010, 00:18 »
а ну да...что то я загнался совсем...это немного из других дебрей, тогда тебе хватит просто quint32
Записан
SABROG
Гость
Re: TCP. отключение от сервера.
«
Ответ #25 :
Май 03, 2010, 23:45 »
Цитата: meandnano от Май 01, 2010, 20:13
ну я предполагал, что так и будет, но вся соль то как раз в том, что мне надо socketID получить от уходящего клиента.
Его конечно можно задублировать в отдельное поле, но зачем это надо? У тебя должен быть один идентификатор - указатель на класс. Мертвые дескрипторы разве что для отладочных целей, в логи выводить, хотя какую дополнительную информацию может нести номер дескриптора для человека открывшего логи? Можно конечно использовать, чтобы сопоставлять с другими записями, типа вот в 10:00 он подключился, а в 10:02 он отключился, но тут любой порядковый номер сойдет (1, 2, 3, 4). Даже будет информативнее, так как сможешь узнать общее количество активных соединений к тому времени. Ну или просто выводить hex представление адреса в указателе на QTcpSocket.
Записан
ритт
Гость
Re: TCP. отключение от сервера.
«
Ответ #26 :
Май 11, 2010, 14:52 »
не понимаю зачем вообще нужен SID=Client->socketDescriptor()
у тебя есть адрес сокета - за время жизни сокета его адрес не изменится - вот и используй его в качестве ключа...
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...