Folgenden Code habe ich bisher verwendet um den nächsten freien Port zu ermitteln:
Delphi-Quellcode:
function TfrmMain.GetFreePort(ABeginPort: Integer;
const ATCP: Boolean = false): Integer;
var
Wsd: TWSAData;
S: Integer;
SockAddr: TSockAddrIn;
begin
Result := ABeginPort;
if WSAStartup(MAKEWORD(2, 2), Wsd) <> 0 then
Exit;
try
if ATCP then
S := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
else
S := Socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if S = SOCKET_ERROR then
Exit;
SockAddr.sin_family := AF_INET;
SockAddr.sin_addr.S_addr := inet_addr(pchar('127.0.0.1'));
SockAddr.sin_port := htons(ABeginPort);
while bind(S, SockAddr, SizeOf(SockAddr)) = SOCKET_ERROR do
begin
inc(ABeginPort);
SockAddr.sin_port := htons(ABeginPort);
end;
closesocket(S);
finally
Result := ABeginPort;
end;
end;
Leider funktioniert dies unter Vista nicht mehr wies scheint. Die Rückkabe von Bind ist immer 0, egal ob der Port belegt ist oder nicht ..
Hat jemand eine Idee?