Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.051 c
9-2736
Baradoo
2002-12-21 20:39
2003.06.02
Распространяю Свои Игры! Нужна помощь!


4-3220
Porolonchick
2003-04-05 00:53
2003.06.02
Текст из TList чужой программы.


14-3125
Skier
2003-05-12 16:42
2003.06.02
---|Ветка была без названия|---


1-2947
alords
2003-05-20 12:09
2003.06.02
Как узнать завершение другой проги (DOS или Win)


4-3225
Igor
2003-04-03 09:58
2003.06.02
Перехват процесса.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский