Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

Люди поможите с ошибкой сокета....   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
3-2819
wasilla
2003-05-15 13:37
2003.06.02
Перекодировка БД


11-2838
AlbertHakimov
2002-09-07 15:50
2003.06.02
Своиство Align на компоненте Panel-ь


11-2833
antonioxxx
2002-09-04 18:36
2003.06.02
Вопрос про Icon и Label.


1-2983
$Hic0
2003-05-21 13:31
2003.06.02
Странное поведение переменной цикла


14-3051
Денис
2003-05-14 00:42
2003.06.02
Помогите, пожалуйста. Очень надо!!! (диплом)