キースミラーが述べたように、あなたは財産を悪用していBindings
ます。サーバーに2つのバインディングを追加しています。1つは192.168.1.1
オンポート0
用、もう1つはオン0.0.0.0
ポート用です49152
。Bindings.Add()
バインドするIP/ポートペアごとに1回だけ呼び出す必要があります。例:
var
Binding: TIdSocketHandle
Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
Binding.Port := ...;
または:
with IdUDPServer1.Bindings.Add do
begin
IP := ...;
Port := ...;
end;
事前にプロパティを設定してDefaultPort
おくと、上記を次のように簡略化できます。
IdUDPServer1.DefaultPort := ...;
IdUDPServer1.Bindings.Add.IP := ...;
そうは言っても、ソケットエラー10049はですWSAEADDRNOTAVAIL
。これは、そもそも間違ったIPアドレスを使用していることを意味します。実行中のPCに属するTIdUDPServer
IP(デバイスがUDPパケットを送信するIP)を指定する必要があります。単一のワイルドカードIP 0.0.0.0
(または単に空白の文字列'')にバインドすることができます。これはTIdUDPServer
、使用可能なすべてのローカルIPにバインドするように指示します。
IdUDPServer1.DefaultPort := ...;
IdUDPServer1.Bindings.Add.IP := ''; // or: '0.0.0.0'
または、IndyのGStack.LocalAddresses
プロパティを使用して、ローカルで使用可能なIPを判別し、Bindings
必要に応じてそれらを個別に作成することもできます。
IdUDPServer1.Bindings.Clear;
IdUDPServer1.DefaultPort := ...;
with GStack.LocalAddresses do
begin
for I := 0 to Count-1 do
IdUDPServer1.Bindings.Add.IP := Strings[I];
end;
更新:TIdSocketHandle.Port
サーバーをポート0にバインドして、OSにポートを選択させる場合、サーバーがアクティブ化された後にプロパティを確認することで、選択されたポートを見つけることができます。
var
Binding: TIdSocketHandle
ListeningPort: TIdPort;
IdUDPServer1.Bindings.Clear;
Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
Binding.Port := 0;
{
or:
IdUDPServer1.DefaultPort := 0;
Binding := IdUDPServer1.Bindings.Add;
Binding.IP := ...;
}
IdUDPServer1.Active := True;
ListeningPort := Binding.Port;