gpt4 book ai didi

sockets - 如何使用 Winsock api 检查互联网连接?

转载 作者:行者123 更新时间:2023-12-03 15:19:52 27 4
gpt4 key购买 nike

我在下面构建了此代码(基于 this 示例),以使用 Winsock API 检查是否存在与互联网的连接,并尝试向特定网站 (google.com 就我而言)。

但是WSAGetLastError返回错误代码:10051

如何解决这个问题?

program Project1;

uses
Windows, SysUtils, WinSock;

function GetIPFromHostName(const HostName: string): string;
var
WSAData: TWSAData;
R: PHostEnt;
A: TInAddr;
begin
Result := '0.0.0.0';
WSAStartup($101, WSAData);
R := GetHostByName(PAnsiChar(AnsiString(HostName)));
if Assigned(R) then
begin
A := PInAddr(R^.h_Addr_List^)^;
Result := WinSock.inet_ntoa(A);
end;
end;

function IsConnectedToInternet: Boolean;
var
WSAData1: TWSAData;
SockAddr1: TSockAddr;
Socket1: TSocket;
begin
Result := False;

if WSAStartup(MAKEWORD(2, 2), WSAData1) <> 0 then
begin
Writeln('WinSock error');
Exit;
end;

Socket1 := Socket(AF_INET, SOCK_STREAM, 0);
if Socket1 = INVALID_SOCKET then
begin
Writeln('socket error');
Exit;
end;

SockAddr1.sin_family := AF_INET;
SockAddr1.sin_addr.S_addr := inet_addr(PAnsiChar(GetIPFromHostName('google.com')));
SockAddr1.sin_port := htons(80);

if Connect(Socket1, SockAddr1, SizeOf(SockAddr1)) <> 0 then
begin
Writeln('connection error #', WSAGetLastError);
Exit;
end;

Result := True;

if CloseSocket(Socket1) <> 0 then
Writeln('error closing socket');
end;

begin
IsConnectedToInternet;
readln;

end.

最佳答案

编译器警告您错误,在您填写 sockaddr_inin_addr 的行上:

W1044 Suspicious typecast of string to PAnsiChar

inet_addr 需要 ANSI 字符串。您将 unicode 字符串类型转换为 PAnsiChar,从而传递了格式错误的字符串,导致 connect 无法找到目的地。

替换

SockAddr1.sin_addr.S_addr := inet_addr(PAnsiChar(GetIPFromHostName('google.com')));

SockAddr1.sin_addr.S_addr :=
inet_addr(PAnsiChar(AnsiString(GetIPFromHostName('google.com'))));


您可以使用为此目的设计的 API 之一,例如 InternetCheckConnection ,或InternetGetConnectedState ,或INetworkListManager界面(Vista 及更高版本)。

例如

const
FLAG_ICC_FORCE_CONNECTION = 1;
begin
if not InternetCheckConnection('http://google.com', FLAG_ICC_FORCE_CONNECTION, 0) then
RaiseLastOSError;

关于sockets - 如何使用 Winsock api 检查互联网连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com