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; ?


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]


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

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


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

Наверх

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