|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.07.2009, 20:30 | #1 |
Форумчанин
Регистрация: 05.06.2007
Сообщений: 529
|
о сокете
Я читал, что в получаемом пакете от клиента, уже автоматически содержится IP адрес клиента. Так вот, как мне "вытащить" этот IP адресс из пакета? если я его принимаю путем "recv(connection,a,1000,0);" ?
|
06.07.2009, 21:04 | #2 |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
Пакет должен быть структурированный.
Посмотрите про класс _tcp_header, или _udp_header |
06.07.2009, 21:22 | #3 |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Артэс
это делается функцией inet_ntoa. но для начала тебе надо извлечь инфу из сокета. Например, ты сервер, к тебе подключился клиент, ты его сохранил в сокете с именем sClient. Получить его ip можно так: Код:
|
06.07.2009, 21:48 | #4 |
Форумчанин
Регистрация: 05.06.2007
Сообщений: 529
|
Спасибо! Но немного не пойму... т.е соединение с клиентом уже установлено будет? мне нужно проверить IP адрес клиента, после чего уже установить связь. Иными словами, я хочу проверить, не совпадает ли этот IP адресс с тем, что будет указан в одной из переменных, а уже потом разрешить установить соединение. (т.е если IP адрес совпадет с указанным, то связи не будет - проще говоря бан)
Последний раз редактировалось Артэс; 06.07.2009 в 22:01. |
06.07.2009, 21:52 | #5 | |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Артэс не используй пожалуйста термин "пакет", это совсем другое. Ты принимаешь набор байт.
Цитата:
|
|
06.07.2009, 22:00 | #6 |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Артэс accept на клиента тебе все равно сделать придется. если у тебя сервер поддерживает множество клиентов, то скорее всего, этих клиентов ты где то хранишь? например в векторе. так проверь ip, и если он "забанен", не добавляя его в свой вектор, разрывай соединение. если хочешь что нить более профессионального, то и читай соответствующую литературу
|
06.07.2009, 22:27 | #7 |
Форумчанин
Регистрация: 05.06.2007
Сообщений: 529
|
Сервер может принимать лишь одного клиента в один момент времени. Завершив работу с клиентом (приняв и передав данные), сервер готов принять следующего клиента. Но если клиент будет "флудить" и постоянно посылать запросы (аж по несколько штук в секунду), то он практически не даст возможности другим клиентам подключиться к серверу.
Даже если я сделаю поддержку нескольких клиентов, например, если один клиент уже есть, то программа активизурет прием второго клиента. В любом случае, как Вы сказали, мне придется принять клиента, что бы сравнить, заблокирован он или нет... в таком случае соединение будет занято, и сервер будет готов принять второго клиента... но что если и второе соединение будет подвержено "флуду" ? активировать третье? а если флудер и третье соединение займет? и так далее... что делать в таком случае? |
06.07.2009, 22:31 | #8 |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Артэс ты принял первого клиента, работаешь с ним. в это время еще 10 ломятся. это не флудеры, реальные юзеры. так или иначе, у тебя должна быть очередь обработки. а подключить надо всех. если пишешь под винду, почитай о сетевом i/o, в винде их аж 7 штук, что нить да подыщешь
|
06.07.2009, 22:36 | #9 |
Форумчанин
Регистрация: 05.06.2007
Сообщений: 529
|
Ну речь идет именно о флудерах, которые будут пытаться посылать запросы десятки раз в секунду... что касается реальных юзеров... с этим проблемы не должно возникнуть. Я думаю хватило бы и одного соединения в одно время... принять данные, обработать и передать клиенту, закрыть соккет - на это уйдут доли секунды. Сомневаюсь что в одну секунду ко мне постоянно будут ломиться толпы реальных юзеров. Это какую аудиторию клиентов нужно иметь.
|
06.07.2009, 23:03 | #10 |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Артэс мы помойму друг друга не понимаем) ты хочешь проверить ip адрес вновь подключившегося клиента, не извекая данных о нем функцией accept? ну чтож, медицина бессильна. говорю еще раз (кстате последний), нужна очередь как минимум. вот те пример подключений:
fake-fake-fake-fake-fake-user-fake-fake-user-fake-fake кто есть кто, думаю ясно. самое простое решение. создаешь поток на accept, и кидаешь всех потенциальных юзеров в очередь. как только кто нить пришел, отправляешь событие (event) второму потоку, который обрабатывает, то есть кто. те, кто забанены сразу закрываешь соединение, которые нет - пересылаешь на обработку третьему потоку. можно сделать мультиплексирование (функциями poll/select), что значительно повысит скорость работы, ибо сетевые функции будут моментально возвращать управление... да много чего можно сделать. |