![]() |
| ||
|
|
Новости |
Поиск |
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-15 16:45:00) [41]Разберись, что ошибка 10053 значит.
ZV (2010-09-15 16:41:00) [42]Вот какая складывается ситуация
При повторном подключении клиента у меня выскакивают сообщения
Asynchronous Socket error 10053 я игнорирую сообщение и нажимаю кнопку дальше и смотрю какие сообщения и от каких процедур появилось в поле Мемо
вот что я вижу
Ошибка!!! (1)
[15:09:17]Клиент отключился IP-172.17.226.1 (2)
Ошибка!!! Повторное подключение (3)
[15:09:17]Подключился клиент (4)
1-сообщение от ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
2-сообщение от ServerSocket1ClientDisconnect(Sender: TObject; Socket:TCustomWinSocket);
3-сообщение от ClException(Sender: TObject; Error: Exception);)
4-сообщение от ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
Сергей М. Вы правы клиент все таки подключился , и вроде бы работал.
Но что делать с выпадающим окном с сообщением об ошибке, в чем причина появления этого сообщения
Сергей М. (2010-09-15 15:54:00) [43]
> коннектися к серверу и вот тут сервер дает сбой в виде ошибки
> сокета
Т.е. ты утверждаешь что при этом OnClientConnect не возникает, а вместо него с какого-то перепугу возникает OnClientError ?
Ты готов кровью поклясться в истинности своего утверждения ?)
ZV (2010-09-15 15:31:00) [44]Зачем что то убирать , все нормально работает. Вы наверно не поймете в чем проблема, я постараюсь объяснить. В качестве клиентов выступают микроконтроллеры они коннектятся к серверу и получают от него нужную информацию . Когда микроконтроллеру не нужно получать информацию он отключается от сервера а когда нужно опять подключается. Все это на данный момент работает к сервер одновременно подключено 78 клиентов. Нормально происходит авторизация доступа к серверу и отключение не нужных клиентов.
Но если взять и отключить питание клиенту(микроконтроллеру) подключенному к серверу , то он перезагружается и снова коннектися к серверу и вот тут сервер дает сбой в виде ошибки сокета . Я так думаю это происходит потому что произошел обрыв связи и соединение не было закрыто как положено, и при повторном подключении этого же клиента, сервер падает.
Те клиенты которые отключились самостоятельно нормально подключаются снова и работают с сервером.
Только не надо спрашивать а зачем отключать питание и т.д.
Сергей М. (2010-09-15 14:24:00) [45]
> Я не знаю что где вызывается
Ну вот теперь будешь знать)
> в мемо1 OnClientError надпись выводит
А ты убери полностью всю требуху из OnClientConnect/Disconnect/Read/Write и удивись - никто никакие надписи никуда выводить не будет)
ZV (2010-09-15 14:17:00) [46]Я не знаю что где вызывается. Но в мемо1 OnClientError надпись выводит значит срабатывает так же как и процедура ClException.
Но это все не главное . Вопрос остается открытым - Что делать?
При повторном подключении оборвавшегося клиента сервер падает.
Сергей М. (2010-09-15 13:51:00) [47]
> ZV © (15.09.10 13:01) [68]
Обработчик OnClientError невызывается при копвтке коннекта, не выдумывай небылиц.
Anatoly Podgoretsky (2010-09-15 13:12:00) [48]> Сергей М. (15.09.2010 12:15:07) [67]
Диверсант.
ZV (2010-09-15 13:01:00) [49]Ну так что делать в обработчике ошибок когда клиент пытается подключится после обрыва связи? И почему возникает ошибка .Если бы не эта хрень то все работает нормально.
Сергей М. (2010-09-15 12:15:00) [50]
> отключить того кто пытается подключиться
А чем он провинился ?)
Anatoly Podgoretsky (2010-09-15 12:11:00) [51]Ищем не там где потерял, а там где светло.
Anatoly Podgoretsky (2010-09-15 12:09:00) [52]Я не поленился и просмотре все обсуждение, никто такого не советовал.
ZV (2010-09-15 11:43:00) [53]
> А что это значит [ServerSocket1.Socket.ActiveConnections].
Ну типа отключить того кто пытается подключиться. Что советуют то и делаю
Ну не знаю я что делать в обработчике ошибки.
Только что проверял чужой сервер на резкий обрыв связь и повторное подключения работает безотказно.
Значит можно решить эту проблему, но как?
Anatoly Podgoretsky (2010-09-15 10:06:00) [54]> ZV (15.09.2010 09:23:02) [62]
А что это значит [ServerSocket1.Socket.ActiveConnections].
ZV (2010-09-15 09:23:00) [55]Что то не хрена не получается устранить ошибку при повторном подключении клиента после обрыва связи
Вот что написал в обработчике ошибок
procedure TForm5.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Memo1.Lines.Text:=' Ошибка!!!' ;
ServerSocket1.Socket.Connections[ServerSocket1.Socket.ActiveConnections-1].Close;
end;
И в этом
procedure TForm5.ClException(Sender: TObject; Error: Exception);
begin
If (Error.ClassName = 'ESocketError') then
Begin
Memo1.Lines.Add('Ошибка!!! ');
ServerSocket1.Socket.Connections[ServerSocket1.Socket.ActiveConnections].Close;
end
else Application.ShowException(Error);
end;
Толку нет, сервер вылетает с ошибкой сокета
Как с этим бороться ?
Что делаю не правильно ?
Сергей М. (2010-09-14 21:56:00) [56]
> Сервер закроет сокет с которым возникает конфликт
Ну да, закроет.
Зачем ему нужно несуществующее соединение ?
Не нужно оно ему.
> а клиент все таки подключиться
вот когда он подключится - тогда и разговор будет.
Тогда и новое OnClientConnect будет возбуждено.
ZV (2010-09-14 16:43:00) [57]Получается что если клиент неожиданно разорвал связь и пытается повторить соединение то в этом обработчике нужно закрыть сокет
If (Error.ClassName = 'ESocketError') then
Begin
If (Error.ClassName = 'ESocketError') then
Begin
ServerSocket1.Close.;
end
else Application.ShowException(Error)
Сервер закроет сокет с которым возникает конфликт , а клиент все таки подключиться или ему после этого повторно нужно подключаться?
Сергей М. (2010-09-14 16:09:00) [58]OnClientError может сработать в случае возникновения отказа в ходе выполнения сервером того или иного метода приема или передачи. Параметр ErrorCode укажет причину отказа. Самое простое и надежное - тут же закрыть соединение вызовом Socket.Close.
Если при вызове сервером того или иного метода приема или передачи отказ обнаружен еще доинициации асинхронной соответствующей операции, сервер возбудит исключение ESocketError, которое можно обработать точно так же.
ZV (2010-09-14 15:51:00) [59]
> А где у тебя обработчик OnClientError ?
Нет, его у меня.
А в каком случае он сработает? И что в нем делать?
> Прощай Сеть
:)
Anatoly Podgoretsky (2010-09-14 15:40:00) [60]Прощай Сеть