【问题标题】:MySQL server discovery on LAN by listening port (Inno Setup)通过侦听端口在 LAN 上发现 MySQL 服务器 (Inno Setup)
【发布时间】:2017-05-18 21:08:26
【问题描述】:

我需要搜索IP addressListening Port 以查找局域网上的其他PC(尝试发现MySQL 服务器)并获得IP 的结果,该端口正在侦听。

类似于此代码的测试套接字但在 Inno Setup 中工作的代码:

program pfinger;

uses sockets,errors;

Var
  Addr : TInetSockAddr;
  S : Longint;
  Sin,Sout : Text;
  Line : string;

begin
  Addr.sin_family:=AF_INET;
  { port 79 in network order }
  Addr.sin_port:=79 shl 8;
  { localhost : 127.0.0.1 in network order }
  Addr.sin_addr.s_addr:=((1 shl 24) or 127);
  S:=fpSocket(AF_INET,SOCK_STREAM,0);
  If Not Connect (S,ADDR,SIN,SOUT) Then
    begin
    Writeln ('Couldn''t connect to localhost');
    Writeln ('Socket error : ',strerror(SocketError));
    halt(1);
    end;
  rewrite (sout);
  reset(sin);
  writeln (sout,paramstr(1));
  flush(sout);
  while not eof(sin) do
    begin
    readln (Sin,line);
    writeln (line);
    end;
  fpShutdown(s,2);
  close (sin);
  close (sout);
end.

我已经尝试过其他方式(Java 代码)。但是安装程序启动很慢,当我需要解压缩 JRE 来运行 Java jar 时。我尝试包装我的 Java 代码,但不知道在哪里/如何找到类似于 Java 的 Pascal 函数。

【问题讨论】:

    标签: mysql tcp inno-setup tcplistener pascalscript


    【解决方案1】:

    要检查服务器是否正在侦听端口,您可以使用Winsock OLE control

    type
      TSocketState =
        (sckClosed, sckOpen, sckListening, sckConnectionPending, sckResolvingHost,
         sckHostResolved, sckConnecting, sckConnected, sckClosing, sckError);
    
    type
      TMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
      end;
    
    const
      PM_REMOVE = 1;
    
    function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax,
      wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
    function TranslateMessage(const lpMsg: TMsg): BOOL;
      external 'TranslateMessage@user32.dll stdcall';
    function DispatchMessage(const lpMsg: TMsg): Longint;
      external 'DispatchMessageA@user32.dll stdcall';
    
    procedure AppProcessMessage;
    var
      Msg: TMsg;
    begin
      while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
    
    function CheckPort(Host: string; Port: Integer): Boolean;
    var
      Socket: Variant;
    begin
      Socket := CreateOleObject('MSWinsock.Winsock');
      Socket.RemoteHost := Host;
      Socket.RemotePort := Port;
      Socket.Connect;
    
      { Winsock requires message pumping }
      while not (Socket.State in [sckConnected, sckError]) do 
      begin
        AppProcessMessage;
      end;
    
      Result := (Socket.State = sckConnected);
    
      if Result then
      begin
        Log(Format('Port %d on %s is open', [Port, Host]));
      end
        else
      begin
        Log(Format('Port %d on %s is NOT open', [Port, Host]));
      end;
      Socket.Close;
    end;
    

    请注意,Winsock 控件需要消息队列泵送。因此,您可能需要在运行检查之前禁用向导,以防止用户弄乱表单。


    致谢:AppProcessMessage 来自 How to execute 7zip without blocking the InnoSetup UI?

    【讨论】:

      【解决方案2】:

      我检查开放端口的首选是 Nmap 程序。

      在 TCP 端口 3306 上探测地址 192.168.200.133 的示例命令如下:

      nmap -sT -sV -Pn -n -p 3306 192.168.200.133
      

      您还可以通过提供 CIDR 范围而不是 IP 来扫描整个子网。例如,要扫描 192.168.200.1 - 192.168.200.254 上的 MySQL 实例(TCP 端口 3306),您可以这样做:

      nmap -sT -sV -Pn -n -p 3306 192.168.200.0/24
      

      ^^ 这些例子直接取自https://securityblog.gr/1549/discover-open-mysql-ports/

      Nmap 在 Unix/Linux 上非常常用,但在 2000 年首次移植到 Windows,目前在 Win 7 或更高版本(包括 Server 2008)上支持。见https://nmap.org/book/inst-windows.html

      【讨论】:

        猜你喜欢
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 2012-03-30
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        相关资源
        最近更新 更多