Форум: "Основная";
Текущий архив: 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