Метод TCsSocket SetAsyncHostName
procedure TCsSocket.SetAsyncHostName (ReqdHostName : String);
var IPAddress : TInaddr; SAddress: array[0..31] of char; begin FillChar(FAsyncBuff, SizeOf(FAsyncBuff), #0);
FAsyncRemoteName := ReqdHostName; StrPcopy(SAddress, FAsyncRemoteName);
IPAddress.s_addr := inet_addr(SAddress);
if IPAddress.s_addr <>
INADDR_NONE then { Это IP-адрес } begin FAddress := IPAddr; FAsyncType := AsyncAddr; if IPAddress.s_addr <>
0 then FTaskHandle := WSAAsyncGetHostByAddr(FAsyncHWND, ASYNC_EVENT, pChar(@IPAddress), 4, PF_INET, @FAsyncBuff[0], SizeOf(FAsyncBuff));
if FTaskHandle = 0 then begin if FNoOfBlockingTasks >
0 then dec(FNoOfBlockingTasks);
FStatus := Failure; ErrorEvent(FStatus,WSAErrorMsg);
if FOKToDisplayErrors then raise ECsSocketError.create(WSAErrorMsg);
Exit; end else FStatus := Success; end else { Нет, это больше похоже на символьное имя хоста } begin FAddress := HostAddr; FAsyncType := AsyncName; Inc(FNoOfBlockingTasks);
FTaskHandle := WSAAsyncGetHostByName (FAsyncHWND, ASYNC_EVENT, @FpHostName[0], @FAsyncBuff[0], MAXGETHOSTSTRUCT);
if FTaskHandle = 0 then begin FStatus := Failure; if FNoOfBlockingTasks >
0 then dec(FNoOfBlockingTasks);
ErrorEvent(FStatus,WSAErrorMsg);
if FOKToDisplayErrors then raise ECsSocketError.create(WSAErrorMsg);
Exit; end else FStatus := Success; end; end;
SetAsyncHostName вызывает процедуру WSAAsyncGetHostByName с пятью важными аргументами. FASyncHWND — логический номер окна, которому асинхронная функция должна отправить сообщение о завершении операции просмотра. Он инициализируется в конструкторе TCsSocket.Create вызовом AllocateHWND с параметром-процедурой AsyncOperation. ASYNC_EVENT — константа события, используемая в WSAAsyncGetHostByName. Символьный массив FAsyncBuff содержит результат выполнения операции. Наконец, MAXGETHOSTSTRUCT — константа Winsock, определяющая максимальный размер буфера FAsyncBuff. Процедура WSAAsyncGet HostByName возвращает номер задачи в виде значения типа TaskHandle, которое затем присваивается полю FTaskHandle.
WSAAsyncGetHostByName немедленно завершает работу с нулевым кодом, если вызов был неудачным; в случае удачного вызова она возвращает положительное число. Тем не менее отличное от 0 значение FTaskHandle свидетель ствует лишь об успешном вызове WSAAsyncGetHostByName, но не гарантирует успех последующей операции просмотра (которая продолжает выполняться в фоновом режиме).
После завершения просмотра Winsock DLL инициирует событие ASYNC_EVENT, сообщая процедуре AsyncOperation о том, что она должна обработать сообщение ASYNC_EVENT (см. листинг 5.10).