![]() |
| ||
|
|
Новости |
Поиск |
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; ?
Сергей М. (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]
> Это тоже можно трактовать двояко.
Короче, отключение питания девайса (обесточивание).Но это сейчас не главное.
Вопрос стоит в том что делать с моей проблемой? Как устранять ошибку?