Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Авторизация


Автор: Enelar 26.1.2009, 08:33
Вопрос такой. Есть порт например 55555.
Есть миллион клиентов подключенных к этому порту.
На какойто итерации мы вызываем функцию recv().  Получили очередной пакет.
Как нам понять от какого клиента пакет (если никакой информации в пакете о клиенте нет)

Автор: Олег2005 26.1.2009, 11:55
Для каждого отдельного подключившегося клиента функция accept() создает присоединенный сокет, и адрес этого сокета (IP и порт)формируются в структуре адреса клиента
int accept(int sd, struct sockaddr *client_addr, int *addrlen); 
посмотреть можно функцией getpeername()

Автор: Enelar 28.1.2009, 23:18
Вы видимо не совсем верно поняли вопрос.
Вот у нас есть SOCKET local - тот сокет который мы проверяем на входящие сообщения.
SOCKET ClientsSocket[10000];
struct sockaddr ClientsAddr[10000];

Вот, мы поключили 1000 клиентов, получили их данные.
Далее через n секунд пришел пакет на наш порт.
Мы проверили local - пришло сообщение. Вопрос от какого из 1000 клиента.

Автор: Олег2005 29.1.2009, 00:18
Если я неверно понял - значит так объяснили.
У сервера есть слушающий сокет - постоянный на все время работы сервера
Это тот сокет, для которого выполняется listen()
Проверить сразу, при получении заявки на соединение - невозможно - так как вся информация, поступающая во время троекратного рукопожатия, хранится в таблице подключений моуля TCP - и доступ туда с  уровня пользователя невозможен
Скорее всего это и есть ваш local
Но на слушающий сокет СООБЩЕНИЯ НЕ ПРИХОДЯТ - они приходят только на клиентский.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)