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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2009, 20:30   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию о сокете

Я читал, что в получаемом пакете от клиента, уже автоматически содержится IP адрес клиента. Так вот, как мне "вытащить" этот IP адресс из пакета? если я его принимаю путем "recv(connection,a,1000,0);" ?
Артэс вне форума Ответить с цитированием
Старый 06.07.2009, 21:04   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Пакет должен быть структурированный.
Посмотрите про класс _tcp_header, или _udp_header
MaTBeu вне форума Ответить с цитированием
Старый 06.07.2009, 21:22   #3
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Артэс

это делается функцией inet_ntoa. но для начала тебе надо извлечь инфу из сокета. Например, ты сервер, к тебе подключился клиент, ты его сохранил в сокете с именем sClient. Получить его ip можно так:
Код:
sockaddr_in sa;
int s = sizeof(sa);
getpeername(sClient, (struct sockaddr*)&sa, &s);
char *ip = inet_ntoa(sa.sin_addr);
vvviperrr вне форума Ответить с цитированием
Старый 06.07.2009, 21:48   #4
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Спасибо! Но немного не пойму... т.е соединение с клиентом уже установлено будет? мне нужно проверить IP адрес клиента, после чего уже установить связь. Иными словами, я хочу проверить, не совпадает ли этот IP адресс с тем, что будет указан в одной из переменных, а уже потом разрешить установить соединение. (т.е если IP адрес совпадет с указанным, то связи не будет - проще говоря бан)

Последний раз редактировалось Артэс; 06.07.2009 в 22:01.
Артэс вне форума Ответить с цитированием
Старый 06.07.2009, 21:52   #5
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Артэс не используй пожалуйста термин "пакет", это совсем другое. Ты принимаешь набор байт.

Цитата:
А если пакет принимается от браузера? Какой он в таком случае?
кто какой? Сокет? Браузер?
vvviperrr вне форума Ответить с цитированием
Старый 06.07.2009, 22:00   #6
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Артэс accept на клиента тебе все равно сделать придется. если у тебя сервер поддерживает множество клиентов, то скорее всего, этих клиентов ты где то хранишь? например в векторе. так проверь ip, и если он "забанен", не добавляя его в свой вектор, разрывай соединение. если хочешь что нить более профессионального, то и читай соответствующую литературу
vvviperrr вне форума Ответить с цитированием
Старый 06.07.2009, 22:27   #7
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Сервер может принимать лишь одного клиента в один момент времени. Завершив работу с клиентом (приняв и передав данные), сервер готов принять следующего клиента. Но если клиент будет "флудить" и постоянно посылать запросы (аж по несколько штук в секунду), то он практически не даст возможности другим клиентам подключиться к серверу.

Даже если я сделаю поддержку нескольких клиентов, например, если один клиент уже есть, то программа активизурет прием второго клиента. В любом случае, как Вы сказали, мне придется принять клиента, что бы сравнить, заблокирован он или нет... в таком случае соединение будет занято, и сервер будет готов принять второго клиента... но что если и второе соединение будет подвержено "флуду" ? активировать третье? а если флудер и третье соединение займет? и так далее... что делать в таком случае?
Артэс вне форума Ответить с цитированием
Старый 06.07.2009, 22:31   #8
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Артэс ты принял первого клиента, работаешь с ним. в это время еще 10 ломятся. это не флудеры, реальные юзеры. так или иначе, у тебя должна быть очередь обработки. а подключить надо всех. если пишешь под винду, почитай о сетевом i/o, в винде их аж 7 штук, что нить да подыщешь
vvviperrr вне форума Ответить с цитированием
Старый 06.07.2009, 22:36   #9
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Ну речь идет именно о флудерах, которые будут пытаться посылать запросы десятки раз в секунду... что касается реальных юзеров... с этим проблемы не должно возникнуть. Я думаю хватило бы и одного соединения в одно время... принять данные, обработать и передать клиенту, закрыть соккет - на это уйдут доли секунды. Сомневаюсь что в одну секунду ко мне постоянно будут ломиться толпы реальных юзеров. Это какую аудиторию клиентов нужно иметь.
Артэс вне форума Ответить с цитированием
Старый 06.07.2009, 23:03   #10
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Артэс мы помойму друг друга не понимаем) ты хочешь проверить ip адрес вновь подключившегося клиента, не извекая данных о нем функцией accept? ну чтож, медицина бессильна. говорю еще раз (кстате последний), нужна очередь как минимум. вот те пример подключений:
fake-fake-fake-fake-fake-user-fake-fake-user-fake-fake
кто есть кто, думаю ясно. самое простое решение. создаешь поток на accept, и кидаешь всех потенциальных юзеров в очередь. как только кто нить пришел, отправляешь событие (event) второму потоку, который обрабатывает, то есть кто. те, кто забанены сразу закрываешь соединение, которые нет - пересылаешь на обработку третьему потоку. можно сделать мультиплексирование (функциями poll/select), что значительно повысит скорость работы, ибо сетевые функции будут моментально возвращать управление... да много чего можно сделать.
vvviperrr вне форума Ответить с цитированием
Ответ


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

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

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