套接字 – 如何使用Winsock api检查互联网连接?
发布时间:2020-12-15 09:41:06 所属栏目:大数据 来源:网络整理
导读:我在下面构建了这个代码(基于 this 示例),使用Winsock api检查是否存在与Internet的连接,并尝试向特定网站发出GET请求(在我的情况下为google.com). 但是WSAGetLastError返回错误代码:10051. 如何修复这个? program Project1;uses Windows,SysUtils,WinSock
我在下面构建了这个代码(基于
this示例),使用Winsock api检查是否存在与Internet的连接,并尝试向特定网站发出GET请求(在我的情况下为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_in的in_addr的行上警告您输入错误:
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之一,如 例如. const FLAG_ICC_FORCE_CONNECTION = 1; begin if not InternetCheckConnection('http://google.com',FLAG_ICC_FORCE_CONNECTION,0) then RaiseLastOSError; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |