Форум: "Сети";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизЛюди поможите с ошибкой сокета.... Найти похожие ветки
← →
TankMan (2003-03-01 15:00) [0]Скорее всего уже был такой вопрос, но всеже... в прожке стоит ClientSocket, на OnConnect, стоит послать текст, на Disconnect, ничего такого, просто индикатор типа булеан ставится в true, на OnError стоит просто зануление ошибки, также таймер, с интервалом ~1 секунду, который обрабатывает индикатор с OnDisconnect-a и если он равен true Client.Active:=true... вобщем я думаю ничего такого нету... видимых ошибок не видать, к серверу подключается отлично, и отключается тоже :), но вот стоит серверу не быть доступным, минут так эдак 30... а может даже меньше, на клиенте вылетает ошибка что-то типа WinSock error 10055... а что эта ошибка означает даже не представляю :(, может поможете...
А может даже и примерчик скинете, самого "правильного" варианта поддерживания стабильного (постоянного) подключения к сереверу... а то ОЧЕНЬ нужно, дипломная горит.... не буду же я руководителю ее в течении 10 минут показывать :)...
← →
Digitman (2003-03-03 08:37) [1]в OnError(), кр.всего прочего, выполняй :
Socket.Disconnect(Socket.SocketHandle);
и не имей прывычку в событии OnConnect() посылать что-то.
готовность передатчика - это событие OnWrite()
← →
BorisUK (2003-03-03 09:47) [2]WinSock error 10055...
На борланд сокет сервер ты не смотрел?
Скорее всего у него стоит параметр убивать неактивную сессию как раз через это время...
Если я оказался прав.. и ты на него не смотрел, то
вот вдогонку... Будешь тестировать количество сессий, тоже удивишся... "Как так больше девяти нельзя..." Сразу отвечу...
Тоже такой параметр есть :)
Предустановки смотри кароче.
← →
Digitman (2003-03-03 10:32) [3]
> BorisUK
BSS здесь совершенно ни при чем
← →
Polevi (2003-03-03 13:47) [4]10055 - WSAENOBUFS
Свободное место в буфере закончилось
← →
nikb (2003-03-03 19:51) [5]A gde mojno podrobnee prochitat o WSABASEERR+xx errors?
← →
Digitman (2003-03-04 08:50) [6]
> nikb
MSDN + хэлп + http://book.itep.ru
← →
TankMan (2003-03-04 19:00) [7]Так всетаки? Кого мне слушать то? :)... Я сейчас не из дома в инете, поэтому попробую потом совет Digitman-а и BorisUK, а если мне это не поможет? Что мне тогда делать с этим переполнением буфера?
← →
TankMan (2003-03-05 03:13) [8]>>BorisUK
А где эти все параметры смотреть?
← →
Digitman (2003-03-05 08:29) [9]
> TankMan
Пойми, что для связи с BSS используется отнюдь не TClientSocket, а TSocketConnection ! У тебя конкретно - TClientSocket, следовательно, ни о каких BSS речи идти не может, и, значит, советы от <BorisUK> на эту тему уводят тебя в сторону от сути проблемы.
Правильное же решение я тебе уже дал
см. <Digitman © (03.03.03 08:37)>
← →
TankMan (2003-03-16 23:51) [10]>>Digitman
Правильное решение, ты имеешь ввиду -
"в OnError(), кр.всего прочего, выполняй :
Socket.Disconnect(Socket.SocketHandle);"?
Поставил... если клиент, подлючен к серверу, то все ОК, но если сервер выключить, клиент в этом случае пытается подсоединиться каждые 5 секунд, всеравно, через минут 30-40 клиент вылетает с ошибкой "Программа выполнила недопустимую операцию...."... Почему не пойму... Не могли бы дать исходник (пример) клиент и серевера, которые бы постоянно держали бы соединение между собой...
И еще можно вопрос? Вот соединился у меня клиент с сервером, у сервера появился еще один Connection, потом мы резко (ресетом) перезагружаемя на любой стороне - и в итоге очень часто (почти всегда) один из пары незамечает того, что другой уже отключен, т.е. перезагрузили клиент, и в Connections у сервера этих клиентов уже 2 :(... и обратно тоже самое, серер отключился, а клиент всеравно "думает" что он подключен, и в итоге команды с сервера не воспринимаются из-за того что клиент не подключен, а клиент и не пытается подключится....
Вот такое вот длинное предисловие к вопросу... а вопрос в том, каким наилучшим способом, проверять соединение?
← →
Digitman (2003-03-17 08:34) [11]
> через минут 30-40 клиент вылетает с ошибкой "Программа выполнила
> недопустимую операцию...."
думаю, что сия фатальная ошибка не имеет ничего общего с обработкой ошибок в OnError()
> исходник (пример) клиент и серевера, которые бы постоянно
> держали бы соединение между собой
нет таких исходников... ни у меня ни у кого бы то ни было... и быть не может ... соединение существует до тех пор, пока (при физически существующем соединении) в ответ на SYN-пакет передатчика приемник вовремя отвечает SYN-ACK-пакетом. Это уже - не физический уровень, а уровень протокола TCP/IP.
см. http://book.itep.ru, протокол TCP
> один из пары незамечает того, что другой уже отключен, т.е.
> перезагрузили клиент
это абсолютно нормально... для обнаружения такой ситуации та сторона соединения, которая заинтересована в своевременном определении факта "разрыва", может :
- периодически посылать некое контрольное сообщение; при неполучении от другой стороны ответа на это сообщение "вовремя" считается, что партнерт "отвалился", и соединение с ним принудительно разрывается; в момент посылки сообщения, если соединение физически разорвано, send-метод вернет отказ с возбуждением соотв.исключения, в обработчике которого следует закрыть гнездо
- ожидать в заданные периоды времени прихода от партнера по коннекту некоего контр.сообщения; отсутствие вх.сообщения в заданный период времени расценивается как отсутствие связи и коннект принудительно разрывается закрытием гнезда
Подобная "кухня" достаточно распространена в распределенных сетевых приложениях (например, ICQ-сети) и часто носит название "Keep Alive" (можно примерно перевести как "хочешь быть живым ? позаботься об этом сам - оставайся таковым, вовремя извещая партнера о том, что ты еще жив")
← →
TankMan (2003-03-17 23:34) [12]Digitman
>> через минут 30-40 клиент вылетает с ошибкой "Программа выполнила
>> недопустимую операцию...."
>думаю, что сия фатальная ошибка не имеет ничего общего с обработкой ошибок в OnError()
Не знаю из-за чего, но во всяком случае дело обстоит так, если сервер включен, и клиент удачно подсоединяется к нему, то клиент работает пока его не выключишь сам, а если сервер не доступен, клиент, каждые 10 сек, пытается к нему подключится... в такой ситуации клиент держится примерно минут 30-40 как я уже говорил, а если поставить, чтобы он пытался подключатся каждые 5 секунд, то он вылетает значительно быстрее.... из этого я понял, что что-то не так именно с сокетом , и скорее всего в OnError или onDisconnect... если я отключаю попытки соединения с сервером, ничего такого не происходит, сначало я думал, что это что-то связанное с потерей ресурсов, но проверил прожкой MemProof, ничего такого не происходит.... В чем тогда может быть загвоздка не пойму?...
← →
статик (2003-03-18 02:28) [13]прочитай тут все на пальцах расписанно
http://ganja.loopback.ru/view.php?id=2896
← →
Digitman (2003-03-18 08:22) [14]код приводи
← →
dimich1978 (2003-03-18 11:53) [15]Немного того что может тебе помочь(на основе советов Digitman):
Для сервера:
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
case ErrorCode of
// что за ошибка ?
WSAECONNREFUSED:
begin
Socket.Disconnect(Socket.SocketHandle); // закроем гнездо
ErrorCode:= 0; // сбросим ошибку
showmessage("хост недоступен или порт неактивен");
end;
// хост недоступен или порт неактивен
WSAECONNABORTED:
begin
Socket.Disconnect(Socket.SocketHandle); // закроем гнездо
ErrorCode:= 0; // сбросим ошибку
showmessage("хост прервал предудущий коннект по своей инициативе");
end;
// хост прервал предудущий коннект по своей инициативе
WSAECONNRESET: // коннект разорван по иным причинам
begin
Socket.Disconnect(Socket.SocketHandle); // закроем гнездо
ErrorCode:= 0; // сбросим ошибку
showmessage("коннект разорван по иным причинам");
end;
end;
end;
Для клиента(все практически тоже самое, разница в менее информированности пользовыателя):
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
case ErrorCode of // что за ошибка ?
WSAECONNREFUSED, // хост недоступен или порт неактивен
WSAECONNABORTED, // хост прервал предудущий коннект по своей инициативе
WSAECONNRESET: // коннект разорван по иным причинам
begin
Socket.Disconnect(Socket.SocketHandle); // закроем гнездо
ErrorCode:= 0; // сбросим ошибку
timer2.enabled:=true; // запустим таймер на коннект
end;
end;
end;
← →
TankMan (2003-03-24 00:50) [16]>>dimich1978
Сейчас я не на своем компе в инете,поэтому не могу попробовать код, но вот сейчас я смотрю на твой пример и думаю, что возможно ошибки возникают из-за того, что у меня таймер не зависит от того, подключен или нет клиент, просто у меня "преключатель" стоит в onerror и ondisconnect и просто в одтедльном таймере с интервалом примерно 10 сек. он проверяет включен ли переключатель или нет, и пытается коннетктится соответственно,... я думаю именно из-за этого глюк.. т.е. еще до получения ошибки при попытки подконнекчивания, он еще раз пытается подключится....но вобщем посмотрим....
← →
VID (2003-03-24 02:42) [17]TO TankMan:
dimich1978 прав, за исключением одной детали:
у сервера при onClientError следует писать:
Server.Socket.Disconnect(Socket.SocketHandle);
ErrorCode := 0;
заметь Server.Socket.Disconnect а не Socket.Disconnect - это разные вещи.
ну а для верности можно ещё и добить:
try CloseHandle( Socket.Handle); except end;
try FreeAndNil( Socket); except end;
ну а в случае с клиентом ...
Socket.Disconnect(Socket.SocketHandle) либо Client.Socket.Disconnect...
в данном случае нет разницы, т.к. речь идёт об одном и том же сокете.
ну и не следует забывать про ErrorCode:= 0;
вот и всё.
← →
Digitman (2003-03-24 08:36) [18]
> dimich1978
> VID
WSAECONNREFUSED на серверной стороне никогда не возникнет
WSAECONNABORTED, WSAECONNRESET - ошибки, никогда не возникающие асинхронно (ни на сервере ни на клиенте). Возникают они лишь в моменты вызовов транспортных ф-ций гнезда и немедленно обрабатываются классом TCustomWinSocket с автоматическим вызовом Disconnect() (непосредственно перед возбуждением соотв.искл-я). Так что явный вызов Disconnect() в обработчике OnError() в таких ситуациях - лишний (если не сказать - опасный), ибо при синхронной внутренней обработке таких ошибок принудительный разрыв коннекта (с соотв. освобождением ресурсов и генерацией события OnDisconnect) - вещь очевидная.
← →
TankMan (2003-04-02 00:30) [19]Люди! Спасибо зарботало! Все нормально коннектится... и прожка перестала вылетать без сервера, только вот проблема появилась в другом... если постоянно включать и выключать сервер, клиенты через некоторое время перестают видеть сервер в упор, только после перезагрузки клиент прозревает... в чем может быть проблема? Как-то давно, я слышал уже данную проблему у когото, но я тогда не занимался сетями и сетевым программированием... а щас начал... вот и сразу же и споткнулся...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c