加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

套接字 – 如何使用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的行上警告您输入错误:

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,或InternetGetConnectedStateINetworkListManager界面(Vista和更高版本).

例如.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读