6

I need to check some port is usable or not? How can do that in Inno Setup? Is there any way to use socket in to Inno Setup? Is there any library for this? If there how can import it and use it?

Thank you for your answers.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
user3222643
  • 121
  • 1
  • 8
  • I wrote a solution with WinSock but someone deleted the question. There's a lot of same questions here btw. – TLama Feb 11 '14 at 12:37
  • What is the solution ? should I use winsock.dll ? – user3222643 Feb 12 '14 at 08:31
  • The best way would be to attempt to bind a socket with Winsock. All the other ways I've seen were not much reliable. – TLama Feb 12 '14 at 08:35
  • Possible duplicates of [Check on avaiable port using wmi win32 class?](http://stackoverflow.com/q/13295277/588306) and [Check for available port when installing using inno setup](http://stackoverflow.com/q/17485317/588306). – Deanna Feb 13 '14 at 15:34

2 Answers2

4

You can use my function to check, if a port is available:

function CheckPortOccupied(Port:String):Boolean;
var
  ResultCode: Integer;
begin
  Exec(ExpandConstant('{cmd}'), '/C netstat -na | findstr'+' /C:":'+Port+' "', '', 0,
       ewWaitUntilTerminated, ResultCode);
  if ResultCode <> 1 then 
  begin
    Log('this port('+Port+') is occupied');
    Result := True; 
  end
    else
  begin
    Result := False;
  end;
end;
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
LEo
  • 442
  • 5
  • 21
  • 2
    Avoid using command line tools as much as you can. Always prefer native Windows API solutions. In this case you could e.g. attempt to bind to a socket of the given port and see if it fails. – TLama Jul 23 '14 at 07:31
  • 1
    It is true. I solved problem 4 months ago. Your answer is correct. – user3222643 Jul 23 '14 at 08:41
1

Function to return (in MsgBox) service or program that use port 80. MsgBox will not shown if output is empty.

function NextButtonClick(CurPage: Integer): Boolean;
var
  TmpFileName, ExecStdout: string;
  ResultCode: integer;
begin
  if CurPage = wpWelcome then
  begin
    TmpFileName := ExpandConstant('{tmp}') + '\~pid.txt';
    Exec('cmd.exe',
         '/C FOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|find "0.0:80"`) DO '
           + '@tasklist /fi "pid eq %i" | find "%i" > "' + TmpFileName + '"', '', SW_HIDE,
         ewWaitUntilTerminated, ResultCode);
    if LoadStringFromFile(TmpFileName, ExecStdout) then
    begin
      MsgBox('Port 80 is used by '#13 + ExecStdout, mbInformation, MB_OK);
    end;
    DeleteFile(TmpFileName);
  end;
  Result := True;
end;        
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992