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


Сергей М.   (2010-09-21 16:31:00) [1]


> KeepAlive , это жестко


Ну сделай "мягко", раз сишный код для тебя новые ворота - по таймеру периодически отправляй своему клиенту какую-нибудь безобидную хрень. Если схлопочешь при  очередной отправке исключение, значит на том конце труп)

Я ж тебе об этом еще в [82] сказал)


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

Да KeepAlive , это жестко, есть описание или для С++ или UNIX , вот все что нашел для Delphi   http://www.delphi-forum.de/topic_Problem+beim+Nutzen+von+Socket+setsockopt+und+SOKEEPALIVE_96953,0.html но что из этого мне нужно я не пойму, подскажите , я сам не разберусь.


ZV   (2010-09-21 14:38:00) [3]


> Сергей М

<Большое спасибо, будем разбираться.


Сергей М.   (2010-09-21 14:33:00) [4]


> ZV ©   (21.09.10 14:09) [112]


http://www.rsdn.ru/article/net/keep_alive.xml
http://www.rsdn.ru/forum/network/2553292.flat.aspx


ZV   (2010-09-21 14:09:00) [5]


> И будут битые соединения висеть мертвым грузом в списке
> активных, пока твой сервер активен и не использует тот или
> иной KeepAlive-механизм для периодического обнаружения клиентских
> трупов)

Получается что сокет будет висеть открытым , потому что клиент отвалился и не дал команду на закрытие, а сервер не в курсе что этот сокет больше не используется и нужно его закрывать. А каким образом делать проверку не используемых сокетов? Может есть какой то параметр у сокета если он не активен определенный промежуток времени то его нужно закрыть ?


Сергей М.   (2010-09-21 13:37:00) [6]


> Почему  тут ни кто не написал чтобы я так сделал?


А тебе тут кто-то чем-то обязан ?)


> Порт один и тот же при каждом коннекте


Ну тогда ситуация с ошибкой 10053 вполне объяснима.
А вот как только клиент будет коннектиться к твоему серверу с разныхпортов, вот тогда ошибку эту с учетом [82] ты никогда не увидишь. И будут битые соединения висеть мертвым грузом в списке активных, пока твой сервер активен и не использует тот или иной KeepAlive-механизм для периодического обнаружения клиентских трупов)


ZV   (2010-09-21 13:28:00) [7]

Прогресс есть, решил проблему таким образом в событии ServerSocket1ClientError

прописал   ErrorCode:=0;
Теперь сообщение об ошибке Socketa не появляется, сервер пока работает нормально, запустил на тест с постоянным отпаданием  клиента и повторным коннектом, уже прошло 200 обрывов, повторный коннект проходит без проблем,сервер работает стабильно

Почему  тут ни кто не написал чтобы я так сделал?
Блин одна строчка кода  и проблема исчезла  .


>
> У сервера номер порт фиксирован, например, 12345.
> А у клиента ?
>
> Что говорит твой сервер в OnClienConnect по поводу Socket.
> RemotePort ?
> Это порт всегда один и тот же или различен при каждом коннекте
> ?

Номер порта что у клиента что у сервера один и тот же, фиксированный. Порт один и тот же при каждом коннекте


Сергей М.   (2010-09-21 11:10:00) [8]


> Справка на английском языке мне много не даст


Как это не даст ? Всем дает, а тебе отказывает ?)
Плохо уговариваешь)


Anatoly Podgoretsky   (2010-09-21 11:06:00) [9]

Я еще в [89] просил дать информацию по сокету и нуль, одна трепология вокруг да около.


Сергей М.   (2010-09-21 10:47:00) [10]


> Подключение всегда по одному порту,этот параметр прошит
> в памяти


Что значит " попорту" ?

У сервера номер порт фиксирован, например, 12345.
А у клиента ?

Что говорит твой сервер в OnClienConnect по поводу Socket.RemotePort ?
Это порт всегда один и тот же или различен при каждом коннекте ?


app   (2010-09-21 09:50:00) [11]

> app  (21.09.2010 09:46:45)  [105]

Прогноз такой - если прогресса ...


app   (2010-09-21 09:46:00) [12]

> Anatoly Podgoretsky  (21.09.2010 09:37:44)  [104]

Если прогноза не будет, то закрою ветку, нельзя же столько времени мусолить
данный вопрос, как бесперспективная тема. Максим еще 5 постов.


Anatoly Podgoretsky   (2010-09-21 09:37:00) [13]

> ZV  (21.09.2010 00:32:43)  [103]

То есть ты хочешь сказать, что ты даже основ не знаешь,
Не умеешь работать с нумероваными типами,
Тогда тебе еще рано программировать сокеты.


ZV   (2010-09-21 00:32:00) [14]


> TErrorEvent описан в справке.

Без примера я не пойму что делать с TErrorEvent . Справка на английском языке мне много не даст. Не ужели тяжело показать пример как работать с TErrorEvent ?
Вы поймите что я не так хорошо владеют Delphi как Вы , и что для Вас очевидно, для меня темный лес.


ZV   (2010-09-20 23:53:00) [15]

Снял лог  обмена пакетами между девайсом и моим сервером и девайсом и чужим сервером при повторном подключение . Пакеты идентичны.
М да легче от этого  не стало, зацепится не зачто.


Anatoly Podgoretsky   (2010-09-20 23:20:00) [16]

> ZV  (20.09.2010 23:08:40)  [100]

TErrorEvent описан в справке.


ZV   (2010-09-20 23:08:00) [17]


>
> А скажи, любезный, эти твои дивайсы коннектятся к серверу
> всегда с одного и того же порта ?
> Или номер порта при каждой попытке коннекта различен ?

Подключение всегда по одному порту,этот параметр прошит в памяти.
Со стороны девайса проблем нет, тестировал на сервере который делаю, запустили на круговой  коннект дисконнект, 20000 подключений и отключений и не одной сбойки не было . Я же выше писал что тестировал и на чужом сервере  при одновременном подключении и отключении 10 девайсов, все работает .

А тут как то не получается,  я полазил по сайтам подобная проблема не только у меня, у создателей чатов тоже выпадает такая ошибка если клиент резко выпадает из сети и опять коннектится. Но они проблему решили проверкой времени между контрольными посылками от клиентов, если прошел таймаут а клиент не прислал контрольный пакет то сервер его отключает.
И ещё пишут о перехвате ошибке сокета и уже на основании её выполнение каких то действий но каких не написано.

Да, такой каки я не ожидал.

> Я такого события для ServerSocket не нашел, или я не правильно
> вас понял

А это что

> procedure TForm6.ServerSocket1ClientError(Sender: TObject;
>
>  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var
> ErrorCode: Integer);

А как обработать ErrorEvent ? Я же не гуру в Delphi а только учусь.

Вы подскажите как а я сделаю что вы скажите, я сам в этой проблеме не разберусь, опыт у меня не тот что у Вас к сожалению.


Сергей М.   (2010-09-20 21:00:00) [18]


> ZV ©   (20.09.10 18:32) [97]


А скажи, любезный, эти твои дивайсы коннектятся к серверу всегда с одного и того же порта ?
Или номер порта при каждой попытке коннекта различен ?


Anatoly Podgoretsky   (2010-09-20 19:29:00) [19]


> > не пытался ли обработать ErrorEvent
> >
>
> Я такого события для ServerSocket не нашел, или я не правильно
> вас понял

А это что

> procedure TForm6.ServerSocket1ClientError(Sender: TObject;
>
>  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var
> ErrorCode: Integer);


ZV   (2010-09-20 18:32:00) [20]


> Это тоже можно трактовать двояко.

Короче, отключение  питания девайса (обесточивание).Но  это  сейчас не главное.

Вопрос стоит в том что делать с моей проблемой? Как устранять ошибку?


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

Наверх

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