Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





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


8-1207933974
DoKi
2008-04-11 21:12
2010.12.12
смешивание 2-х текстур


2-1285150130
картман
2010-09-22 14:08
2010.12.12
работа с файлами


15-1283137842
Ewans
2010-08-30 07:10
2010.12.12
Создание полноценного чата на Flash


15-1282711293
12
2010-08-25 08:41
2010.12.12
Идиотские рекламы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский