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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: TCP. отключение от сервера.  (Прочитано 16752 раз)
garryHotDog
Гость
« Ответ #15 : Май 01, 2010, 23:11 »

что то я не понял до конца!?

как я понимаю есть 2 варианта обработки подключения к серверу
   1. обрабатывать сигнал сервера newConnection() и получать указатель на сокет с помощью nextPendingConnection ()
   2. переписать виртуальную функцию сервера incomingConnection(int), тем самым будем иметь дескриптор сокета.

Лично я использую 2, так как вывожу обработки клиента в поток.....и хранить список подключенных можно в след виде:
Код
C++ (Qt)
QList<int>
, где int - дескриптор сокета.....это я к тому что ты можешь добавить слот к клиенту, который по отключению будет слать свой дескриптор серверу, а тот в свою очередь удалять его из списка (именно списка!!! - потому что добавление и удаление в нем быстрее чем в векторе)...вот как то так
Записан
garryHotDog
Гость
« Ответ #16 : Май 01, 2010, 23:37 »

только что накидал небольшую прогу - пробовал получить socketDesck после отключения сокета - выдавал -1....единственное что могу посоветовать хранить не дескриптор сокета ,а например ip+port:
Код
C++ (Qt)
struct SClientID
{
quint32 ip;
quint16 port
}
QList<SClientID> m_clientsList;
 

когда клиент отключается он посылает сигнал - disconnected(), лови этот сигнал у удаляй его данные из списка.
Записан
meandnano
Гость
« Ответ #17 : Май 02, 2010, 00:08 »

я использую вариант 1 (дескриптов сокеты и так получишь). вопрос, как реализовать рассылку сообщений все клиентам, имея только их ip+port.
я вот думаю, может как-то организовать таймер на клиенте, который будет каждые n секунд посылать сообщения серверу - но пока хз как это устроить.
Записан
garryHotDog
Гость
« Ответ #18 : Май 02, 2010, 09:41 »

если клиент будет слать сообщения серваку - это будет лишней нагрузкой на сеть!! Если тебя это устроит?? а как тебе вариант сделать на серваке таймер, который через n секунд будет проверять список(вектор) с клиентами и смотрел кто отключился? этот вариант менее ресурсоемкий....можешь сделать данную проверку когда клиент шлет сигнал disconnected()!

p.s. А чем тебя не устроил вариант ?? у меня он работает!
Цитировать
когда клиент отключается он посылает сигнал - disconnected(), лови этот сигнал у удаляй его данные из списка.
Записан
meandnano
Гость
« Ответ #19 : Май 02, 2010, 17:21 »

а как тебе вариант сделать на серваке таймер, который через n секунд будет проверять список(вектор) с клиентами и смотрел кто отключился? этот вариант менее ресурсоемкий....можешь сделать данную проверку когда клиент шлет сигнал disconnected()!

такой вариант меня очень даже устроит, единственный вопрос - как проверить подключен ли клиент из моего списка (вектора) к моему серверу? данные о нем вроде как в полной мере сохранены (т.е. например socketID соответствует тому, что был выдан сервером при коннекте).
Записан
garryHotDog
Гость
« Ответ #20 : Май 02, 2010, 18:47 »

Цитировать
как проверить подключен ли клиент из моего списка (вектора) к моему серверу?
ты при подключении будешь добавлять в список данные о клиенте, а при его дисконнекте будешь удалять!!!
Записан
meandnano
Гость
« Ответ #21 : Май 02, 2010, 23:40 »

остановился на работе с айпишником вместо socketID. все работает. всем спасибо
Записан
garryHotDog
Гость
« Ответ #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
Гость
« Ответ #23 : Май 03, 2010, 00:11 »

не пойму - у меня же сервер слушает один порт, через него все и подключаются. зачем хранить его для каждого клиента отдельно?
Записан
garryHotDog
Гость
« Ответ #24 : Май 03, 2010, 00:18 »

а ну да...что то я загнался совсем...это немного из других дебрей, тогда тебе хватит просто quint32
Записан
SABROG
Гость
« Ответ #25 : Май 03, 2010, 23:45 »

ну я предполагал, что так и будет, но вся соль то как раз в том, что мне надо socketID получить от уходящего клиента.

Его конечно можно задублировать в отдельное поле, но зачем это надо? У тебя должен быть один идентификатор - указатель на класс. Мертвые дескрипторы разве что для отладочных целей, в логи выводить, хотя какую дополнительную информацию может нести номер дескриптора для человека открывшего логи? Можно конечно использовать, чтобы сопоставлять с другими записями, типа вот в 10:00 он подключился, а в 10:02 он отключился, но тут любой порядковый номер сойдет (1, 2, 3, 4). Даже будет информативнее, так как сможешь узнать общее количество активных соединений к тому времени. Ну или просто выводить hex представление адреса в указателе на QTcpSocket.
Записан
ритт
Гость
« Ответ #26 : Май 11, 2010, 14:52 »

не понимаю зачем вообще нужен SID=Client->socketDescriptor()
у тебя есть адрес сокета - за время жизни сокета его адрес не изменится - вот и используй его в качестве ключа...
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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