Форум: "Начинающим";
Текущий архив: 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 значение 0var
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