Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

Сокеты... ошибка 11001 и пр. Что с ними делать?   Найти похожие ветки 

 
SergP   (2003-09-28 13:23) [0]

Что можно сделать чтобы избавится от "выскакивания" окна с сообщением об ошибке 11001 и других ошибок, которые не устраняются с помощью:

procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
...
ErrorCode:=0;
...
end;

И вообще как эти ошибки можно обработать програмно?


 
Анатолий   (2003-09-28 20:32) [1]

если знаешь часть кода на которой бывает ошибка попробуй заключить ее в try ... except


 
SergP   (2003-09-28 20:54) [2]

Ошибка 11001 возникает при попытке конекта клиентсокета когда у меня инет отключен. Но что заключать в try..except..end;?
Clientsocket.open пробовал заключать - не помогает.


 
Sergp   (2003-09-29 14:01) [3]

Ну что? Никто не подскажет?
Дело в том что как-то некрасиво когда в проге выскакивают сообщения об ошибках, пусть даже и в тот момент когда ее нельзя использовать...


 
Анатолий   (2003-09-29 14:04) [4]

найди отладчиком момент возникновения ошибки, может это не cs.open а где то в другом месте ? пройди по проге пошагам и найди...


 
Polevi   (2003-09-29 14:05) [5]

Application.OnException поймает все не обработанные исключения


 
Sergp   (2003-09-29 14:24) [6]


> Анатолий (29.09.03 14:04) [4]
> найди отладчиком момент возникновения ошибки, может это
> не cs.open а где то в другом месте ? пройди по проге пошагам
> и найди...


В хелпе написано :
11001 Authoritative answer: Host not found.
У меня так оно и есть... Неподключен к инету - возникают такие ошибки при попытке сокета сконектиться. Так что имхо однозначно в этом виноват clientsocket при попытке сделать ему open...
насчет отладчика попытаюсь...

> Polevi © (29.09.03 14:05) [5]
> Application.OnException поймает все не обработанные исключения


Можно подробнее с небольшим примерчиком?
Да и кстати, у меня иногда (очень редко при работе проги вылезает окно с ошибкой вроде External exception 80000003 (точно не помню) , что это такое? И можно ли с помощью Application.OnException и ее тоже устранить?


 
Sergp   (2003-09-29 14:24) [7]


> Анатолий (29.09.03 14:04) [4]
> найди отладчиком момент возникновения ошибки, может это
> не cs.open а где то в другом месте ? пройди по проге пошагам
> и найди...


В хелпе написано :
11001 Authoritative answer: Host not found.
У меня так оно и есть... Неподключен к инету - возникают такие ошибки при попытке сокета сконектиться. Так что имхо однозначно в этом виноват clientsocket при попытке сделать ему open...
насчет отладчика попытаюсь...

> Polevi © (29.09.03 14:05) [5]
> Application.OnException поймает все не обработанные исключения


Можно подробнее с небольшим примерчиком?
Да и кстати, у меня иногда (очень редко при работе проги вылезает окно с ошибкой вроде External exception 80000003 (точно не помню) , что это такое? И можно ли с помощью Application.OnException и ее тоже устранить?


 
Polevi   (2003-09-29 14:51) [8]

окно можно устранить, но ты лучше устрани причину


 
nikkie   (2003-09-29 16:18) [9]

а почему ты думаешь, что ошибку вызывает серверный сокет? скорее клиентский - и обрабатывать ошибку надо в СlientSocket.OnError.


 
Sergp   (2003-09-29 19:38) [10]

Хм... Опять как оказалось не тот кусок кода написал. Просто обработчики у меня почти одинаковые...
Вот точная копия обоих обработчиков. В обоих я Errorcode устанавливаю в 0, но это не помогает. И по всей видимости при ошибке 11001 OnError не вызывается...

procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo1.lines.add("CSError "+inttostr(ErrorCode)+" "+inttostr(integer(sender)));
TCustomWinSocket(socket.data).free;
ErrorCode:=0;
PostMessage(Form1.Handle, KILL_SOCKET, 0,integer(Sender));
end;

procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo1.lines.add("SSError "+inttostr(ErrorCode)+" "+inttostr(integer(socket.data)));
KSocket(socket.data).free;
ErrorCode:=0;
Postmessage(Form1.Handle, KILL_SOCKET, integer(socket),0);
end;

А насчет второй ошибки, я даже не могу понять от чего она возникает, причем очень редко. Вроде бы уже принял все меры против этого...


 
aprm_85   (2003-09-30 22:52) [11]

А может прежде чем коннектится к хосту, проверить, есть ли Инет?
Если dial-up, все просто: TMagRAs (компонент для работы с dialup)
С выделенкой - сложнее. там возможгы варианты


 
SergP   (2003-10-01 07:21) [12]


> aprm_85 © (30.09.03 22:52) [11]
> А может прежде чем коннектится к хосту, проверить, есть
> ли Инет?
> Если dial-up, все просто: TMagRAs (компонент для работы
> с dialup)
> С выделенкой - сложнее. там возможгы варианты


Это ИМХО излишне. Да и как оказалось эта ошибка ловится Application.OnException как советовал Polevi. Просто я этой штукой никогда не пользовался раньше и сначала не пользовался потому, что хотел бы иметь сначала пример прежде чем использовать, но в связи с тем что примера так и никто не дал, пришлось самому экспериментировать.


 
nikkie   (2003-10-01 13:44) [13]

Application.OnException - это, конечно, лом, против которого нет приема. Только прибегать к нему стоит, если ты совсем сдался сделать по нормальному.

Я только что попробовал - 11001, "Windows socket error: No such host is known (11001), on API "ASync Lookup"" прекрасно ловится и гасится в OnError (по-крайней мере в D6). Ты пробовал это в тестовом приложении - один клиентский сокет на форме? Попробуй. И покажи, как ты создаешь сокет в приложении, где у тебя проблема.


 
SergP   (2003-10-02 08:56) [14]

2 nikkie У меня D5... Да и переходить на D6 почему-то не очень хочется. Хотя возможно что придется... Не знаю почему оно у Вас ловится в onError, но у меня ловятся там все остальные ошибки кроме 11001.

А насчет того чтобы показать как что и где я создаю - может лучше я скину исходник на мыло? А то много постить тут нужно...


 
Digitman   (2003-10-02 09:15) [15]


> SergP


по кр.мере в D5 отказ с кодом WSAHOST_NOT_FOUND = 11001 не может быт перехвачен в событии OnError, только - в App.OnException

этому есть вполне четкое объяснение, достаточно взглянуть в исх.текст компонента


procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then
begin
Disconnect(FSocket);
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError),
Message.ASyncError, "ASync Lookup"]);
end;
.....................
end;
end;


 
Digitman   (2003-10-02 09:29) [16]

> SergP

для того чтобы избавиться от вынужденной обработки отказа в App.OnException, необходимо явно св-ва Address и Port (т.е. явный IP-адрес и явный номер порта), оставляя св-ва Host и Service пустыми

в этом случае не будут задействованы службы, разрешающие имя хоста в его адрес и имя сервиса в номер соотв.порта

как раз эти службы, будучи задействованными при неуказании явно адреса и порта, вызывают внутри компонента ф-ции [WSAAsync]GetHostByName (хост -> адрес) и [WSAASync]GetServByName (имя сервиса -> номер порта) ... именно эти ф-ции генерируют отказ с упомянутым кодом, и отказ этот обрабатывается компонентом столь нецдобно, по твоему мнению.

есть другие варианты - работать либо с блок.гнездом (тогда исключения во всех методах компонента "ловятся" банальным try..except) либо работать с неблок.гнездом, но указывать адрес+порт явно, проводя перед коннектом разрешение имен самостоятельно явными вызовами вышеупомянутых Winsock-ф-ций.


 
nikkie   (2003-10-02 13:46) [17]

что ж, значит, в D5 действительно нужен лом. а в D6 код такой:
procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
var
ErrorCode: Integer;
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then
begin
ErrorCode := Message.AsyncError;
Error(Self, eeLookup, ErrorCode);
Disconnect(FSocket);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]);
Exit;
end;
...
end;
end;


 
Digitman   (2003-10-02 14:09) [18]


> nikkie


скорее всего это был маленький недосмотр со стороны Борланда

в 6-ке его исправили



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
3-89768
Blondin
2003-11-07 12:28
2003.11.27
Клиентская прога на сервере - <Просто путь> или localhost:путь


14-90121
Agent[007]
2003-11-02 12:53
2003.11.27
Точка и треугольник. (В ПРОСтРАНСТВЕ)


14-90072
velial
2003-11-05 12:19
2003.11.27
Team Source или создание приложения в команде


1-89983
Radik
2003-11-17 13:58
2003.11.27
Временные интервалы


1-89933
.alex
2003-11-18 16:55
2003.11.27
TDateTimePicker





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский