Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2014, 20:43   #1
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
Лампочка Распознавание(идентификация) клиентов

Доброго времени.
Ситуация: много клиентов одновременно подключены к серверу.
Проблема: идёт много сообщений, в реалтайме, нужно определить, чьи они(как можно быстрее), чтобы обработать пакет соответствующим образом.

Варианты решения:
  • select() - до 64 потенциально мало
  • connect() - придётся неблокирующимися проходить циклом (проверять, есть ли сообщения от каждого)
  • if(IP==IP_msg && port==port_msg) - думаю тоже довольно-таки затратно /* на данный момент использую именно это */

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

Последний раз редактировалось .AJIADb9; 10.10.2014 в 22:37. Причина: выделил основную проблему жирным
.AJIADb9 вне форума Ответить с цитированием
Старый 10.10.2014, 21:32   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Все три решения, что вы предложили решают разные проблемы.
Чем отличается обработка одного клиента от обработки другого клиента?
Может обработка одна и та же а вам нужно найти клиента, который прислал сообщение?

Какой язык - С или С++?
waleri вне форума Ответить с цитированием
Старый 10.10.2014, 22:25   #3
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Все три решения, что вы предложили решают разные проблемы.
Чем отличается обработка одного клиента от обработки другого клиента?
Может обработка одна и та же а вам нужно найти клиента, который прислал сообщение?

Какой язык - С или С++?
Язык C++.
Обработка зависит от пришедшего пакета(по факту одна и та же), и да, мне лишь нужно как можно быстрее принять пакет и понять, от кого он, впоследствии обработав.

Последний раз редактировалось .AJIADb9; 10.10.2014 в 22:27. Причина: уточнение
.AJIADb9 вне форума Ответить с цитированием
Старый 10.10.2014, 22:43   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

При первоначальном подключении клиента создайте к нему объект-обработчик и потом сохраните привязку сокета к этому объекту через std::map.
Потом когда прочитаете данные из сокета в map найдете объект обработчик.
waleri вне форума Ответить с цитированием
Старый 10.10.2014, 22:47   #5
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
При первоначальном подключении клиента создайте к нему объект-обработчик и потом сохраните привязку сокета к этому объекту через std::map.
Потом когда прочитаете данные из сокета в map найдете объект обработчик.
такс...очень интересно, спасибо.
что-то я маленько подтупливаю, но всё же, что будет являться объектом-обработчиком?
или просто сделать client[ip][port] в котором как раз-таки хранится, например, идентификатор пользователя?
.AJIADb9 вне форума Ответить с цитированием
Старый 10.10.2014, 23:07   #6
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
По умолчанию

получится что-то типа если мы запрашиваем client[wrongIP][wrongPort] тогда регистрируем, иначе просто получаем ид клиента
З.Ы. если и выглядит велосипедисто или просто плохо, зато поиск существующего работает (кажется) за хотябы логарифмическую зависимость, нежели сравнение IP и port в лоб (или даже супер-пупер самописным или не очень алгоритмом)
.AJIADb9 вне форума Ответить с цитированием
Старый 11.10.2014, 08:11   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
за хотябы логарифмическую зависимость
хотя бы?

Цитата:
или даже супер-пупер самописным или не очень алгоритмом
Что за алгоритм, расскажи нам.
rrrFer вне форума Ответить с цитированием
Старый 11.10.2014, 09:03   #8
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
хотя бы?


Что за алгоритм, расскажи нам.
Ох, да, я понимаю, что логарифмическая зависимость это одна из самых быстрых, просто спрашиваю совета, можно ли извернуться, сделав быстрее.
Так бы и сказали: "нет, данный способ самый быстрый из всех, что я знаю и не думаю, что тебе удастся как-то ещё это ускорить"
Зачем сразу палками кидаться?
Хотя я, кажется, придумал, как это сделать за "единичку" (правда я потеряю немного в памяти, пойду попробую)
.AJIADb9 вне форума Ответить с цитированием
Старый 11.10.2014, 09:34   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Хотя я, кажется, придумал, как это сделать за "единичку" (правда я потеряю немного в памяти, пойду попробую)
никак и незачем.
Бьюсь об заклад, на твой сервер не войдет никогда 9999999999999 юзеров (ну потому што это больше населения планеты в дохрена раз). Но двоичный логарифм этого числа равен 43. Т.е. плясать с бубном тут незачем - даже если твой сервер - это вконтакт или гугл.

Цитата:
нежели сравнение IP и port в лоб (или даже супер-пупер самописным или не очень алгоритмом)
Дак што за "супер-пупер самописный" алгоритм ты там придумал?

Последний раз редактировалось rrrFer; 11.10.2014 в 09:36.
rrrFer вне форума Ответить с цитированием
Старый 11.10.2014, 09:52   #10
.AJIADb9
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Дак што за "супер-пупер самописный" алгоритм ты там придумал?
Да там всё просто, лисапед, он и в африке лисапед:
if( user[127][0][0][1][333] == NULL )

Цитата:
Сообщение от rrrFer Посмотреть сообщение
никак и незачем.
Бьюсь об заклад, на твой сервер не войдет никогда 9999999999999 юзеров (ну потому што это больше населения планеты в дохрена раз). Но двоичный логарифм этого числа равен 43. Т.е. плясать с бубном тут незачем - даже если твой сервер - это вконтакт или гугл.
Ну...да, спасибо, впредь буду считать
.AJIADb9 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База клиентов Eangwar Свободное общение 1 17.05.2013 22:48
TServerSocket - количество клиентов Don Karleone Работа с сетью в Delphi 10 15.02.2012 00:43
Идентификация клиентов TClientSockets ArtGrek Работа с сетью в Delphi 2 28.02.2011 13:36
Запрос активных клиентов mavlon_m SQL, базы данных 4 23.02.2011 11:13