Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.12;
Скачать: CL | DM;

Вниз

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

 
ZV ©   (2010-09-09 18:21) [0]

Хочу в событии 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; ?


 
ZV ©   (2010-09-09 18:43) [1]

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

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


 
Anatoly Podgoretsky ©   (2010-09-09 19:31) [2]

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

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


 
Anatoly Podgoretsky ©   (2010-09-09 19:37) [3]

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

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

Label10.Caption := Socket.RemoteAddress;

ExtractFileExt


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


 
ZV ©   (2010-09-09 19:50) [4]


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

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


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


 
ZV ©   (2010-09-09 19:51) [5]


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

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


 
ZV ©   (2010-09-09 20:05) [6]


> Label10.Caption := Socket.RemoteAddress;

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


 
Anatoly Podgoretsky ©   (2010-09-09 20:05) [7]

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

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

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

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


 
ZV ©   (2010-09-09 20:30) [8]


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

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

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


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


 
Anatoly Podgoretsky ©   (2010-09-09 20:56) [9]

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


 
ZV ©   (2010-09-09 21:04) [10]

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

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


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


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


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


 
FireMan_Alexey ©   (2010-09-09 21:38) [12]

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


 
ZV ©   (2010-09-09 21:40) [13]


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

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


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


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


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


 
ZV ©   (2010-09-09 21:49) [15]

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


 
FireMan_Alexey ©   (2010-09-09 21:50) [16]

>ZV ©

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

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


 
ZV ©   (2010-09-09 21:52) [17]


> оттяпаем шматок, преобразуем ,сравним.

Я боюсь что пока  это все проделаю ещё с десяток клиентов подключатся


 
Anatoly Podgoretsky ©   (2010-09-09 21:55) [18]

> ZV  (09.09.2010 21:04:10)  [10]

Я же написал для двух вариантов адресов.


 
ZV ©   (2010-09-09 21:56) [19]


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

Я пока не сравниваю а пытаюсь вывести последнее число , но выводит в Label значение  0
var

 Address:Array [0..3] of Byte;
begin
{

Integer(Address):=Socket.RemoteAddr.sin_addr.S_addr;
 Label11.Caption := IntToStr(Address[3]);

Что я делаю не так


 
FireMan_Alexey ©   (2010-09-09 21:58) [20]

>ZV ©

Прости за откровенность, но ты сюда пришел для чего?
Я тебе дал самый оптимальный код без строковых преобразований, чего тебе еще нужно? Даже просто скопировать лень?


 
FireMan_Alexey ©   (2010-09-09 22:01) [21]

Если ты конектишся  на 127.0.0.1 но обратный адрес всегда будет 0.0.0.0 ...
По моему так, попробуй конектиться на свой реальный Адрес


 
Anatoly Podgoretsky ©   (2010-09-09 22:04) [22]

> FireMan_Alexey  (09.09.2010 21:38:12)  [12]

Немного не так, а так

  Address: Cardinal;
Begin
  Address := Socket.RemoteAddr;
  If LongRec(Address).Bytes[3] = 2 Then "Format C:"
 ...
End;

Но сама идея работать только с последней частью, мне очень не нравится,
усложнение и замедление
Гораздо лучше

if Address  = Field.Value Then "Format C:"


 
Anatoly Podgoretsky ©   (2010-09-09 22:05) [23]

> ZV  (09.09.2010 21:49:15)  [15]

А те решения, что я предложил, разве не изящны?


 
FireMan_Alexey ©   (2010-09-09 22:05) [24]

Слушай дядю Толю :) он хорошее советует :)


 
Anatoly Podgoretsky ©   (2010-09-09 22:07) [25]

> FireMan_Alexey  (09.09.2010 21:50:16)  [16]

У меня статистика Интернета построена на целых адресах, никакого выделения
октетов, только для индикации, а индикация основана на LongRec.Bytes как
самое простое и удобное.


 
ZV ©   (2010-09-09 22:11) [26]

Если переменную сменить на   Cardinal то компилятор ругается  E2010 Incompatible types: "Cardinal" and "sockaddr_in"


 
FireMan_Alexey ©   (2010-09-09 22:12) [27]


> Anatoly Podgoretsky ©   (09.09.10 22:07) [25]

Так я наоборот Вас поддерживаю... :)
А ТС просил побайтную, ну я и написал побайтную :)


 
FireMan_Alexey ©   (2010-09-09 22:13) [28]

Попробуй так :)
Address: Cardinal;
Begin
 Address := Cardinal(Socket.RemoteAddr);


 
Anatoly Podgoretsky ©   (2010-09-09 22:14) [29]

Разве вариант с ExtractFileExt не изящен, а использование LongRec не изящно


 
FireMan_Alexey ©   (2010-09-09 22:15) [30]

Прости забыл...

Address := Cardinal(Socket.RemoteAddr.sin_addr);


 
ZV ©   (2010-09-09 22:17) [31]


> У меня статистика Интернета построена на целых адресах,
> никакого выделения
> октетов, только для индикации, а индикация основана на LongRec.
> Bytes как
> самое простое и удобное.
>

Да я не против проверять весь IP , даже за (так все таки будет надежней), но я не пойму  как создать массив этих адресов, что делать с этими гребаными точками , и как потом сравнить полученный адрес с массивом


 
Anatoly Podgoretsky ©   (2010-09-09 22:19) [32]


> Если переменную сменить на   Cardinal то компилятор ругается
>  E2010 Incompatible types: "Cardinal" and "sockaddr_in"

Сделай или приведение, или смени тип переменной. Только откуда взялся "sockaddr_in", у меня такого нет.


 
ZV ©   (2010-09-09 22:27) [33]

сделал так
Address: Cardinal;
begin
{

 Label10.Caption := Socket.RemoteAddress;
Address := Cardinal(Socket.RemoteAddr.sin_addr);

label11.Caption:= IntToStr(LongRec(Address).Bytes[3]) ;

В результате в label10 выводится IP 172.17.228.200 (соответствует действительности)
в label11 опять 0


 
Anatoly Podgoretsky ©   (2010-09-09 22:46) [34]

> FireMan_Alexey  (09.09.2010 22:13:28)  [28]

Можно указать Address: LongInt;
Но все равно придется в других местах приводить к Cardinal, а ведь адрес по
сути это Cardinal - 32 битное беззнаковое.
Я же говорил, что я писал аналогичное по сути приложение, чтл не выбери, но
все равно придется приводить.
Мой опыт подсказал, что меньше всего проблем при реальном Cardinal, и в
модулях s_addr указан как U_Long, что и есть cardinal, но Борланд описал как
LongInt, не удивительно учитывая беды Борланда с cardinal, им потребовалось
много лет, что бы понять, что Cardinal это 32 битное беззнаковое, а он у них
побывал и Integer, и LongInt, только потом стал 32 битным беззнаковым. :-).


 
Anatoly Podgoretsky ©   (2010-09-09 22:47) [35]

> FireMan_Alexey  (09.09.2010 22:15:30)  [30]

Address := Cardinal(Socket.RemoteAddr.sin_addr.S_Addr);


 
Anatoly Podgoretsky ©   (2010-09-09 22:49) [36]

> ZV  (09.09.2010 22:17:31)  [31]

У цифровых нет никаких точек!!!
Причем тут массив я не пойму.
Сравнение делается операцией =
Хоть с переменной, хоть с константой, хоть с массивом, хоть с записью,
поскольку сранение ведется не с ними, а со значениями.


 
Anatoly Podgoretsky ©   (2010-09-09 22:50) [37]

> ZV  (09.09.2010 22:27:33)  [33]

Тут слишком много написано ерунды.


 
ZV ©   (2010-09-09 23:08) [38]

А воз и нынче там, вот это жесть. 3 часа прошло а как извлечь значения из Socket.RemoteAddress; так и не ясно


 
Anatoly Podgoretsky ©   (2010-09-09 23:20) [39]

> ZV  (09.09.2010 23:08:38)  [38]

Ладно не хочешь ExtractFileExt, то тогда LastDelimiter + Copy


 
ZV ©   (2010-09-13 23:20) [40]

Спасибо всем за советы.  Я все таки сделал определение всего IP а не последней цифры , преобразовать в цифровой  формат  Socket.RemoteAddress; у меня не получилось  по этому создал массив IP адресов в текстовом формате и сравниваю. В принципе работает меня пока устраивает , но возникла  новая проблема. В обработчике ServerSocket1ClientConnect   я определи IP клиента , выяснил, что клиенту доступ закрыт, теперь мне нужно его отключить через ServerSocket.Socket.Connections[?].Close . А   как я его отключу? Я знаю только его  IP но не номер его подключения. Как узнать какой номер подключения ?



Страницы: 1 2 3 вся ветка

Текущий архив: 2010.12.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.009 c
2-1285073326
Jason Bobs
2010-09-21 16:48
2010.12.12
Из строки выудить число


2-1285047334
classclass
2010-09-21 09:35
2010.12.12
Простой вопрос по классам


15-1283511204
DVM
2010-09-03 14:53
2010.12.12
Помогите с переводом на английский одного слова


2-1284966047
istok
2010-09-20 11:00
2010.12.12
узнать время начала сессии пользователя..


2-1284466539
faiwer
2010-09-14 16:15
2010.12.12
Горячие клавиши