Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TServerSocket, как узнать IP клиента при подключении.


Страницы:   1 2 3 4 5 6

ZV ©   (2010-09-09 18:21:00) 

Хочу в событии ServerSocketClientConnectопределить адрес подключившегося клиента
Сверить его с базой разрешенных IP и если его там нет то отключить
Я так понимаю что для этого надо использовать  функции
ServerSocket.Socket.Connections[].RemonteAddress;
ServerSocket.Socket.Connections[].Close;
Но не пойму как . По идеи в событии ServerSocketClientConnect  я должен узнать  номер подключения  а  уже по номеру подключения  при помощи ServerSocket.Socket.Connections[].RemonteAddress; определить IP.
И ещё мне не понятно какому типу  переменной присваивать значение функции ServerSocket.Socket.Connections[].RemonteAddress;  ведь IP адрес имеет такой формат 172.17.200.2; ?


FireMan_Alexey   (2010-09-09 21:50:00) [101]

>ZV ©

Читаем пост [12] :)
Проще не будет :)

Под вопросом я имел ввиду № октека, который тебе нужен для сравнения
Или вообще сравнивай весь адрес, как сказал Дядя Толя :)
А он плохого не посоветует :)


ZV   (2010-09-09 21:49:00) [102]

Я думал может есть более изящные методы, ну раз так тогда  оттяпаем шматок, преобразуем ,сравним.


Сергей М.   (2010-09-09 21:45:00) [103]


> а проще не как, других вариантов нет?


Тебе шашечки или ехать, я не пойму ?)


ZV   (2010-09-09 21:40:00) [104]


> Ну оттяпай шматок строки после последней точки в адресе,
>  преобразуй его в Integer - вот тебе и "последнее число"
>

Не фига себе метод а проще не как, других вариантов нет?


FireMan_Alexey   (2010-09-09 21:38:00) [105]

Анатолий имел ввиду :)
var
 Address:Array [0..3] of Byte;
Begin
Integer(Address):=Socket.RemoteAddr.sin_addr.S_addr;
If Address[?]=2 Then "Format C:"
...
End;


Сергей М.   (2010-09-09 21:33:00) [106]


> ZV ©   (09.09.10 21:04) [10]


Ну оттяпай шматок строки после последней точки в адресе, преобразуй его в Integer - вот тебе и "последнее число"


ZV   (2010-09-09 21:04:00) [107]

У меня ступор с IP  не пойму как этим  LongRec().Bytes[3] воспользоваться
Весь IP я проверять все таки не буду в моей ситуации это не нужно .
Поэтому для контроля мне нужно последнее число в ip адресе
a:Byte;
a:= Socket.RemoteAddress;

как сделать так чтобы в переменной а оказалось последнее число в IP адреса?


Anatoly Podgoretsky   (2010-09-09 20:56:00) [108]

Хранение полностью цифровых значение благоприятно сказывается на скорости. Сравнение Integer наиболее быстрая операция.


ZV   (2010-09-09 20:30:00) [109]


> Ты два раза повторил ремонтный, это означает, что это не
> опечатка.

Угу
> LongRec().Bytes[3]

не пойму как
> Cледующая ошибка, не надо в базе хранить последний октет
> ИП, храни полность
> или строковое или цифровое представление, цифровое лучше,
>  быстрее и размер
> меньше в три раза.


А время на проверку уйдет больше, то ли  один байт сверит а так весь IP


ZV   (2010-09-09 20:05:00) [110]


> Label10.Caption := Socket.RemoteAddress;

Да так проще. С определением IP, разобрался. А вот как работать с полученным  IP не пойму


Anatoly Podgoretsky   (2010-09-09 20:05:00) [111]

> ZV  (09.09.2010 19:50:04)  [4]

Не надо ничего преобразовывать RemoteAdr уже число, и можно обращаться к
любому байту через приведение LongRec().Bytes[3]
Cледующая ошибка, не надо в базе хранить последний октет ИП, храни полность
или строковое или цифровое представление, цифровое лучше, быстрее и размер
меньше в три раза.

remonte - ремонтный, remote - удаленый

Ты два раза повторил ремонтный, это означает, что это не опечатка.


ZV   (2010-09-09 19:51:00) [112]


> Но ты зря не работаешь с цифровым представлением, там все
> проще.

Да если бы я знал как


ZV   (2010-09-09 19:50:00) [113]


> Не ремонтный адрес, а удаленый.

Не понял
> Это строковый формат адреса, соответсвенно тип нужен STRING
> Также есть и вариант с числом, соответсвенно тип Cardinal


Я не пойму как это 172.17.200.2 преобразовать в число и провести сравнение базы с последней цифрой IP то есть 2 .


Anatoly Podgoretsky   (2010-09-09 19:37:00) [114]

> ZV  (09.09.2010 18:43:01)  [1]

Зачем же так сложно, когда в обработчик передается Socket

Label10.Caption := Socket.RemoteAddress;

ExtractFileExt


Точку вначале сам удалишь?
Но ты зря не работаешь с цифровым представлением, там все проще.


Anatoly Podgoretsky   (2010-09-09 19:31:00) [115]

> ZV  (09.09.2010 18:21:00)  [0]

Не ремонтный адрес, а удаленый.
Это строковый формат адреса, соответсвенно тип нужен STRING
Также есть и вариант с числом, соответсвенно тип Cardinal


ZV   (2010-09-09 18:43:00) [116]

Сделал так
Label10.Caption :=ServerSocket1.Socket.Connections[ServerSocket1.Socket.Act iveConnections-1].RemoteAddress;

В Label10 выводиться IP подключившегося клиента правда клиент только один и будет ли это работать когда подключется ещё один не знаю, теперь не пойму как мне работать с этим IP . мне нужна последняя цифра IP для проверки с базой как её извлечь ?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо