![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TServerSocket, как узнать IP клиента при подключении.
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; ?
Anatoly Podgoretsky (2010-09-09 22:49:00) [81]> ZV (09.09.2010 22:17:31) [31]
У цифровых нет никаких точек!!!
Причем тут массив я не пойму.
Сравнение делается операцией =
Хоть с переменной, хоть с константой, хоть с массивом, хоть с записью,
поскольку сранение ведется не с ними, а со значениями.
Anatoly Podgoretsky (2010-09-09 22:47:00) [82]> FireMan_Alexey (09.09.2010 22:15:30) [30]
Address := Cardinal(Socket.RemoteAddr.sin_addr.S_Addr);
Anatoly Podgoretsky (2010-09-09 22:46:00) [83]> 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 битным беззнаковым. :-).
ZV (2010-09-09 22:27:00) [84]сделал так
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:19:00) [85]
> Если переменную сменить на Cardinal то компилятор ругается
> E2010 Incompatible types: 'Cardinal' and 'sockaddr_in'
Сделай или приведение, или смени тип переменной. Только откуда взялся 'sockaddr_in', у меня такого нет.
ZV (2010-09-09 22:17:00) [86]
> У меня статистика Интернета построена на целых адресах,
> никакого выделения
> октетов, только для индикации, а индикация основана на LongRec.
> Bytes как
> самое простое и удобное.
>
Да я не против проверять весь IP , даже за (так все таки будет надежней), но я не пойму как создать массив этих адресов, что делать с этими гребаными точками , и как потом сравнить полученный адрес с массивом
FireMan_Alexey (2010-09-09 22:15:00) [87]Прости забыл...
Address := Cardinal(Socket.RemoteAddr.sin_addr);
Anatoly Podgoretsky (2010-09-09 22:14:00) [88]Разве вариант с ExtractFileExt не изящен, а использование LongRec не изящно
FireMan_Alexey (2010-09-09 22:13:00) [89]Попробуй так :)
Address: Cardinal;
Begin
Address := Cardinal(Socket.RemoteAddr);
FireMan_Alexey (2010-09-09 22:12:00) [90]
> Anatoly Podgoretsky © (09.09.10 22:07) [25]
Так я наоборот Вас поддерживаю... :)
А ТС просил побайтную, ну я и написал побайтную :)
ZV (2010-09-09 22:11:00) [91]Если переменную сменить на
Cardinalто компилятор ругаетсяE2010 Incompatible types: 'Cardinal' and 'sockaddr_in'
Anatoly Podgoretsky (2010-09-09 22:07:00) [92]> FireMan_Alexey (09.09.2010 21:50:16) [16]
У меня статистика Интернета построена на целых адресах, никакого выделения
октетов, только для индикации, а индикация основана на LongRec.Bytes как
самое простое и удобное.
Anatoly Podgoretsky (2010-09-09 22:05:00) [93]> ZV (09.09.2010 21:49:15) [15]
А те решения, что я предложил, разве не изящны?
FireMan_Alexey (2010-09-09 22:05:00) [94]Слушай дядю Толю :) он хорошее советует :)
Anatoly Podgoretsky (2010-09-09 22:04:00) [95]> 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:"
FireMan_Alexey (2010-09-09 22:01:00) [96]Если ты конектишся на 127.0.0.1 но обратный адрес всегда будет 0.0.0.0 ...
По моему так, попробуй конектиться на свой реальный Адрес
FireMan_Alexey (2010-09-09 21:58:00) [97]>ZV ©
Прости за откровенность, но ты сюда пришел для чего?
Я тебе дал самый оптимальный код без строковых преобразований, чего тебе еще нужно? Даже просто скопировать лень?
ZV (2010-09-09 21:56:00) [98]
> Читаем пост [12] :)
> Проще не будет :)
>
Я пока не сравниваю а пытаюсь вывести последнее число , но выводит в Label значение 0
var
Address:Array [0..3] of Byte;
begin
{
Integer(Address):=Socket.RemoteAddr.sin_addr.S_addr;
Label11.Caption := IntToStr(Address[3]);
Что я делаю не так
Anatoly Podgoretsky (2010-09-09 21:55:00) [99]> ZV (09.09.2010 21:04:10) [10]
Я же написал для двух вариантов адресов.
ZV (2010-09-09 21:52:00) [100]
> оттяпаем шматок, преобразуем ,сравним.
Я боюсь что пока это все проделаю ещё с десяток клиентов подключатся