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

Вниз

Как заставить TCustomWinSocket не генерить исключения?   Найти похожие ветки 

 
Unknown user ©   (2007-10-24 10:34) [0]

Например вот здесь



unit ScktComp;
.
.
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;
.
.


установка ErrorCode в 0 в OnErrorEvent не помогает. Также не везде срабатывает SocketErrorProc, в приведенной выше процедуре она и не вызывается.


 
Сергей М. ©   (2007-10-24 11:13) [1]

Никак.

А чем оно тебе помешало ?


 
icWasya ©   (2007-10-24 11:31) [2]

В последующих версиях Дельфи эта ошибка исправлена
А для D5 в модуле ScktComp нужно сделать такие исправления

раз

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;
   if FLookupState = lsLookupAddress then
   begin
     FAddr.sin_addr.S_addr := Integer(Pointer(PHostEnt(FGetHostData).h_addr^)^);
     ASyncInitSocket("", "", FService, FPort, FQueueSize, FClient);
   end else if FLookupState = lsLookupService then
   begin
     FAddr.sin_port := PServEnt(FGetHostData).s_port;
     FPort := 0;
     FService := "";
     ASyncInitSocket("", "", "", 0, FQueueSize, FClient);
   end;
 end;
end;


и два


procedure TCustomWinSocket.AsyncInitSocket(const Name, Address,
 Service: string; Port: Word; QueueSize: Integer; Client: Boolean);
var                                                //
 ErrorCode: Integer;                              //
begin
 try
   case FLookupState of
     lsIdle:
       begin
         if not Client then
         begin
           FLookupState := lsLookupAddress;
           FAddr.sin_addr.S_addr := INADDR_ANY;
         end else if Name <> "" then
         begin
           if FGetHostData = nil then
             FGetHostData := AllocMem(MAXGETHOSTSTRUCT);
           FLookupHandle := WSAAsyncGetHostByName(Handle, CM_LOOKUPCOMPLETE,
             PChar(Name), FGetHostData, MAXGETHOSTSTRUCT);
           CheckSocketResult(Ord(FLookupHandle = 0), "WSAASyncGetHostByName");
           FService := Service;
           FPort := Port;
           FQueueSize := QueueSize;
           FClient := Client;
           FLookupState := lsLookupAddress;
           Exit;
         end else if Address <> "" then
         begin
           FLookupState := lsLookupAddress;
           FAddr.sin_addr.S_addr := inet_addr(PChar(Address));
         end else// raise ESocketError.CreateRes(@sNoAddress);
         begin                                           //
           ErrorCode := 1110;                            //
           Error(Self, eeLookup, ErrorCode);             //
           Disconnect(FSocket);                          //
           if ErrorCode <> 0 then                        //
             raise ESocketError.CreateRes(@sNoAddress);  //
           Exit;                                         //
         end;                                            //
       end;
     lsLookupAddress:
       begin
         if Service <> "" then
         begin
           if FGetHostData = nil then
             FGetHostData := AllocMem(MAXGETHOSTSTRUCT);
           FLookupHandle := WSAASyncGetServByName(Handle, CM_LOOKUPCOMPLETE,
             PChar(Service), "tcp" , FGetHostData, MAXGETHOSTSTRUCT);
           CheckSocketResult(Ord(FLookupHandle = 0), "WSAASyncGetServByName");
           FLookupState := lsLookupService;
           Exit;
         end else
         begin
           FLookupState := lsLookupService;
           FAddr.sin_port := htons(Port);
         end;
       end;
     lsLookupService:
       begin
         FLookupState := lsIdle;
         if Client then
           DoOpen
         else DoListen(QueueSize);
       end;
   end;
   if FLookupState <> lsIdle then
     ASyncInitSocket(Name, Address, Service, Port, QueueSize, Client);
 except
   Disconnect(FSocket);
   raise;
 end;
end;


 
Unknown user ©   (2007-10-24 11:34) [3]

> А чем оно тебе помешало ?

Хочу чтобы и в оффлайне работало, а TCustomWinSocket.CMLookupComplete вызывает исключение если возвращается ошибка. Не понимаю почему программисты из Borland объявили SocketErrorProc, которая вроде как должна обрабатывать все исключения, если назначена, но CheckSocketResult вызывается не во всех случаях, зачастую напрямую просто генерится исключение ESocketError.


 
Unknown user ©   (2007-10-24 11:38) [4]

icWasya спасибо.


 
Сергей М. ©   (2007-10-24 11:40) [5]


> Хочу чтобы и в оффлайне работало


А причем здесь оффлайн ?

Ты логику лукапа себе представляешь ?


 
Unknown user ©   (2007-10-24 11:42) [6]

Посоветуйте еще со следующим траблом. Использую асинхронные сокеты, но обнаружил что даже в асинхронном режиме работы используется синхронная команда gethostbyname, которая при отсутствии связи вызывает подвисание программы. Как правильно заменить следующий код на код использующий асинхронную команду WSAAsyncGetHostByName?


unit ScktComp;
.
.
function TCustomWinSocket.LookupName(const Name: string): TInAddr;
var
 HostEnt: PHostEnt;
 InAddr: TInAddr;
begin
 HostEnt := gethostbyname(PChar(Name));
 FillChar(InAddr, SizeOf(InAddr), 0);
 if HostEnt <> nil then
 begin
   with InAddr, HostEnt^ do
   begin
     S_un_b.s_b1 := h_addr^[0];
     S_un_b.s_b2 := h_addr^[1];
     S_un_b.s_b3 := h_addr^[2];
     S_un_b.s_b4 := h_addr^[3];
   end;
 end;
 Result := InAddr;
end;


 
Unknown user ©   (2007-10-24 11:45) [7]

> Ты логику лукапа себе представляешь ?

Нет, расскажите.


 
Сергей М. ©   (2007-10-24 11:46) [8]


> Как правильно заменить следующий код


Не надо его менять.
Или переходи на более поздние версии Делфи или разработай свою ф-цию асинхронного разрешения имени, результат которой прямиком пиши в св-во Address (всесто Host)


 
Сергей М. ©   (2007-10-24 11:48) [9]


> Unknown user ©   (24.10.07 11:45) [7]


Любая версия GetHostByName, хоть синхронная хоть асинхронная, сначала обращается к файлу hosts, и лишь потом, если в файле отсутствует искомая строка, лезет в сетевой интерфейс.


 
Unknown user ©   (2007-10-24 11:50) [10]

> Не надо его менять.

Ну а если я уже взялся править Borland"овский модуль а перейти на более поздние версии Делфи нет возможности? Можно пример функции асинхронного разрешения имени?


 
Unknown user ©   (2007-10-24 11:53) [11]

>Любая версия GetHostByName, хоть синхронная хоть асинхронная, сначала >обращается к файлу hosts, и лишь потом, если в файле отсутствует искомая >строка, лезет в сетевой интерфейс.

Поиск в hosts на мой взгляд не главная причина задержки. Вот все содержимое файла hosts на моей машине:

127.0.0.1       localhost

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


 
Сергей М. ©   (2007-10-24 11:54) [12]

В Д7:

procedure TCustomWinSocket.AsyncInitSocket(const Name, Address,
 Service: string; Port: Word; QueueSize: Integer; Client: Boolean);
var
 ErrorCode: Integer;
begin
 try
   case FLookupState of
     lsIdle:
       begin
         if not Client then
         begin
           FLookupState := lsLookupAddress;
           FAddr.sin_addr.S_addr := INADDR_ANY;
         end else if Name <> "" then
         begin
           if FGetHostData = nil then
             FGetHostData := AllocMem(MAXGETHOSTSTRUCT);
           FLookupHandle := WSAAsyncGetHostByName(Handle, CM_LOOKUPCOMPLETE,
             PChar(Name), FGetHostData, MAXGETHOSTSTRUCT);
           CheckSocketResult(Ord(FLookupHandle = 0), "WSAASyncGetHostByName");
           FService := Service;
           FPort := Port;
           FQueueSize := QueueSize;
           FClient := Client;
           FLookupState := lsLookupAddress;
           Exit;
         end else if Address <> "" then
         begin
           FLookupState := lsLookupAddress;
           FAddr.sin_addr.S_addr := inet_addr(PChar(Address));
         end else
         begin
           ErrorCode := 1110;
           Error(Self, eeLookup, ErrorCode);
           Disconnect(FSocket);
           if ErrorCode <> 0 then
             raise ESocketError.CreateRes(@sNoAddress);
           Exit;
         end;
       end;
     lsLookupAddress:
       begin
         if Service <> "" then
         begin
           if FGetHostData = nil then
             FGetHostData := AllocMem(MAXGETHOSTSTRUCT);
           FLookupHandle := WSAASyncGetServByName(Handle, CM_LOOKUPCOMPLETE,
             PChar(Service), "tcp" , FGetHostData, MAXGETHOSTSTRUCT);
           CheckSocketResult(Ord(FLookupHandle = 0), "WSAASyncGetServByName");
           FLookupState := lsLookupService;
           Exit;
         end else
         begin
           FLookupState := lsLookupService;
           FAddr.sin_port := htons(Port);
         end;
       end;
     lsLookupService:
       begin
         FLookupState := lsIdle;
         if Client then
           DoOpen
         else DoListen(QueueSize);
       end;
   end;
   if FLookupState <> lsIdle then
     ASyncInitSocket(Name, Address, Service, Port, QueueSize, Client);
 except
   Disconnect(FSocket);
   raise;
 end;
end;


 
Сергей М. ©   (2007-10-24 11:56) [13]


> Поиск в hosts на мой взгляд не главная причина задержки


Естественно.


> аймауты в сетевом интерфейсе, это сильно влияет на скорость
> выполнения команды, на мой взгляд


В данном случае это не так.



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

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

Наверх





Память: 0.51 MB
Время: 0.008 c
15-1198397361
Evanescence
2007-12-23 11:09
2008.01.27
Помогите выбрать сервер для сайта


3-1190274164
thely
2007-09-20 11:42
2008.01.27
Бесплатные утилиты для ремонта GDB?


2-1198773700
art36
2007-12-27 19:41
2008.01.27
Перенос в TreeView


2-1198847106
paul
2007-12-28 16:05
2008.01.27
FindKey


2-1198825368
Ega23
2007-12-28 10:02
2008.01.27
TExcelWorkbook.Disconnect





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