2017-05-18 4 views
2

Je dois rechercher un IP address avec Listening Port pour rechercher d'autres PC sur le réseau local (essayez de découvrir le serveur MySQL) et obtenir les résultats IP qui a ce port écoute .Mon SQL Server découverte sur le port LAN par le port d'écoute (Inno Setup)

Quelque chose de semblable à ce code pour tester les sockets mais travaillant dans 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. 

Je l'ai déjà essayé d'autres moyens (code Java). Mais l'installateur commence lentement, quand j'ai besoin de décompresser JRE pour exécuter Java jar. J'essaie d'enrouler mon code Java, mais je ne sais pas où/comment trouver Pascal fonctionne comme Java.

+0

oui (désolé par mon anglais), je n'ai pas une idée de la façon de demander la bonne façon, suis déjà éditer ma question. –

+0

Serveur MySQL sur un autre PC sur le LAN. –

+0

D'abord, votre question aurait dû mentionner MySQL dès le premier moment. + Vous devriez probablement d'abord poser une question à MySQL sur la découverte automatique du serveur. Et une fois que vous obtenez une réponse (si c'est possible), vous pouvez poser une question sur l'implémentation dans Inno Setup. - Avec votre question actuelle, vous avez besoin de quelqu'un avec les connaissances MySQL et Inno Setup pour y répondre. Vous aurez du mal à trouver quelqu'un. En particulier, si vous n'avez même pas mentionné (laissez seulement marqué) [tag: mysql]. –

Répondre

2

Pour vérifier si un serveur est à l'écoute sur un port, vous pouvez utiliser 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 '[email protected] stdcall'; 
function TranslateMessage(const lpMsg: TMsg): BOOL; 
    external '[email protected] stdcall'; 
function DispatchMessage(const lpMsg: TMsg): Longint; 
    external '[email protected] 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; 

Notez que le contrôle Winsock nécessite le pompage de file d'attente de messages. Il se peut donc que vous deviez désactiver l'assistant avant d'exécuter la vérification, pour empêcher l'utilisateur de jouer avec le formulaire.


Crédits: Le AppProcessMessage vient de How to execute 7zip without blocking the InnoSetup UI?

2

Mon go-to pour le contrôle des ports ouverts est le programme Nmap.

Un exemple de commande pour sonder l'adresse 192.168.200.133 sur le port TCP 3306 serait ceci:

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

Vous pouvez également numériser un sous-réseau entier en donnant une plage de CIDR au lieu d'une adresse IP. A titre d'exemple, pour rechercher les instances de MySQL (port TCP 3306) sur 192.168.200.1 - 192.168.200.254, vous pouvez faire:

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

^^ Ces exemples ont été pris directement à partir https://securityblog.gr/1549/discover-open-mysql-ports/

Nmap est très souvent utilisé sur Unix/Linux, mais a été porté sur Windows, d'abord en l'an 2000, actuellement pris en charge sur Win 7 ou plus récent (y compris Server 2008). Voir https://nmap.org/book/inst-windows.html