PC の 2 つの空き TCP ポートで実行する必要がある 2 つのプロセスがあります。これは、ユーザーにとって簡単ですぐに使えるプロセスである必要があります。競合を回避するために空きポートを自動検出し、これらのポート番号をこれら 2 つのプロセスに適用したいと考えています。
これを実現するために、空きポートを検出する関数 (スレッドでも実行される) を作成しましたが、空きポートは見つかりません。誰かが私のコードの何が問題なのか説明できますか?
編集:「@ 500-error etc」によって提供される解決策がコードに適用されます。機能は正常に動作しています。
ここにあります:
uses
winsock;
type
TAvailablePortArray = array of Word;
function findAvailableTCPPort( ipAddressStr : String; portStart : Word = 8080; portEnd : Word = 8084; findCount : Byte = 2 ) : TAvailablePortArray;
var
client : sockaddr_in;
sock : Integer;
ret : Integer;
wsdata : WSAData;
dwPort : Word;
iFound : Byte;
bResult : Boolean;
bAllFound : Boolean;
dns : PHostEnt;
status : LongInt;
begin
setLength( Result, 0 );
if( portStart > portEnd ) or ( portStart = 0 ) or ( findCount = 0 ) then
Exit;
try
ret := WSAStartup($0002, wsdata); //initiates use of the Winsock DLL
except
ret:=-1;
end;
if( ret <> 0 ) then
Exit;
dns:=getHostByName( PChar(ipAddressStr) );
if( NOT Assigned( dns )) then
Exit;
bResult:=TRUE;
try
fillChar( client, sizeOf( client ), 0 );
client.sin_family := AF_INET; //Set the protocol to use , in this case (IPv4)
client.sin_addr.s_addr :=LongInt(PLongInt(dns^.h_addr_list^)^);
//inet_addr(PAnsiChar(ipAddressStr)); //convert to IN_ADDR structure
except
bResult:=FALSE;
end;
if( bResult ) then
begin
dwPort:=portStart;
setLength( Result, findCount );
bAllFound:=FALSE;
iFound:=0;
while( NOT bAllFound ) and ( dwPort <= portEnd ) do
begin
try
client.sin_port:=htons(dwPort); //convert to TCP/IP network byte order (big-endian)
sock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP ); //creates a socket
Application.processMessages();
status:=connect(sock,client,sizeOf(client));
bResult:=(status <> 0); //establishes a connection to a specified socket, less than zero is NOT in use
except
bResult:=FALSE;
end;
if( sock <> 0 ) then
begin
closesocket(sock);
sock:=0;
end;
if( bResult ) then
begin
Result[iFound]:=dwPort;
inc( iFound );
bAllFound:=( iFound = findCount );
end;
inc(dwPort);
end;
end;
if( NOT bAllFound ) then
setLength( Result, 0 );
try
WSACleanup();
except;
end;
end;
上記の関数を呼び出すコード:
procedure TForm1.btStartClick(Sender: TObject);
begin
addLogMsg( 'Starting service ...' );
FPorts:=findAvailableTCPPort( '127.0.0.1' );
FPortCount:=Length( FPorts );
addLogMsg( 'Available ports found: '+strToInt( FPortCount ));
if( FPortCount < 2 ) then
begin
addLogMsg( 'ERROR: Cannot start service(s), insufficient free ports!' );
Exit;
end;
................
................
................
end;
私が間違っていることは何ですか?
注:コードをデバッグしました。プロセスは問題ないようです(テストを試みますが、例外はありません)。また、他のアプリでテストして、指定されたポートが使用されていないことを確認しました。