⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usock.pas

📁 一个自动投票的作弊工具。 近日单位服务明星投票
💻 PAS
字号:
unit uSock;

interface

uses Windows, Winsock;
{
 使用到WinSock2。
 这是一个完整的Delphi单元,将它加入到你的工程中,你可以调用:
 EnumInterfaces(var s string): Boolean;
 来返回所有IP地址、网络掩码、广播地址和连接状态。

 此函数列举出所有的TCP/IP连接,并返回一个由回车换行(CRLF)符分隔的字符串,包含以下信息:
 IP, NetMask, BroadCast-Address, Up/Down status,
 Broadcast support, Loopback
 如果你将这个字符串赋给TMemo(它的Memo.Lines.Text属性),你可以看到更清晰的结果。
 使用此函数,你需要Win98/ME/2K, 95 OSR 2 或者NT service pack #3,
 因为程序会使用到WinSock 2(WS2_32.DLL)。}

function EnumInterfaces : Boolean;

{从Winsock 2.0导入函数WSAIOCtl -- 在Win98/ME/2K and 95 OSR2, NT srv pack #3下才有Winsock 2}
function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen: DWORD;
  lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
  lpdwOutBytesReturned: LPDWORD;
  lpOverLapped: POINTER;
  lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';

{Constants taken from C header files}
const
  SIO_GET_INTERFACE_LIST = $4004747F;
  IFF_UP = $00000001;
  IFF_BROADCAST = $00000002;
  IFF_LOOPBACK = $00000004;
  IFF_POINTTOPOINT = $00000008;
  IFF_MULTICAST = $00000010;

type
  sockaddr_gen = packed record
    AddressIn: sockaddr_in;
    filler: packed array[0..7] of char;
  end;

type
  INTERFACE_INFO = packed record
    iiFlags: u_long;                                        // Interface flags
    iiAddress: sockaddr_gen;                                // Interface address
    iiBroadcastAddress: sockaddr_gen;                       // Broadcast address
    iiNetmask: sockaddr_gen;                                // Network mask
  end;

type
  IP_INFO = record
    sIP        : string;
    sMask      : string;
    sBroadcast : string;
    sInterface : string;
    sSupported : string;
    sLoopback  : string;
  end;

var
  g_IPInfo : array of IP_INFO;

implementation

(***************************************************
功能:得到本机的IP、掩码、广播地址、状态等信息
设计:
  1. 打开Winsock
  2. 创建一个socket
  3. 调用WSAIOCtl获取网络连接
  4. 对每个连接,获取它的IP、掩码、广播地址、状态
  5. 将信息填充到g_IPInfo记录数组中
  6. 结束
返回值:true 成功;false失败
****************************************************)
function EnumInterfaces : Boolean;
var
  s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned, SetFlags: u_long;
  pAddrInet: SOCKADDR_IN;
  pAddrString: PCHAR;
  PtrA: pointer;
  Buffer: array[0..20] of INTERFACE_INFO;
  i: Integer;
begin
  result := false;                                          // Initialize
  WSAStartup($0101, wsaD);                                  // Start WinSock

  s := Socket(AF_INET, SOCK_STREAM, 0);                     // Open a socket

  if (s = INVALID_SOCKET) then exit;

  try                                                       // Call WSAIoCtl
    PtrA := @bytesReturned;
    if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil, nil)
      <> SOCKET_ERROR) then
    begin                                                   // If ok, find out how
      NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);

      setlength(g_IPInfo,NumInterfaces);

      for i := 0 to NumInterfaces - 1 do                    // For every interface
      begin
        pAddrInet := Buffer[i].iiAddress.addressIn;         // IP ADDRESS
        pAddrString := inet_ntoa(pAddrInet.sin_addr);

        g_IPInfo[i].sIP := pAddrString;

        pAddrInet := Buffer[i].iiNetMask.addressIn;         // SUBNET MASK
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        g_IPInfo[i].sMask := pAddrString;

        pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        g_IPInfo[i].sBroadcast := pAddrString;

        SetFlags := Buffer[i].iiFlags;
        if (SetFlags and IFF_UP) = IFF_UP then
          g_IPInfo[i].sInterface := 'Interface UP'            // Interface up/down
        else
          g_IPInfo[i].sInterface := 'Interface DOWN';

        if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts
          g_IPInfo[i].sSupported := 'Broadcasts supported'   // supported or
        else                                                // not supported
          g_IPInfo[i].sSupported := 'Broadcasts NOT supported';

        if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then  // Loopback or
          g_IPInfo[i].sLoopback := 'Loopback interface'
        else
          g_IPInfo[i].sLoopback := 'Network interface';     // normal
      end;
    end;
  except

  end;
  CloseSocket(s);
  WSACleanUp;
  result := true;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -