0

UDP で PC にデータを送信する電子デバイスからデータを読み取りたいと考えています。Delphi で UDP サーバーをプログラムしました。クラス EIdSocketError で例外が発生します (Failure #10049)。これが私のコードです:

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdUDPServer1.Bindings.add.IP := '192.168.1.1';  //Electronic device ip
   IdUDPServer1.Bindings.add.Port:= 49152;         //Electronic device port   
   IdUDPServer1.OnUDPRead:= UDPRead;
   IdUDPServer1.Active:=True;

end;

procedure TForm1.UDPRead (Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
   bytes_received: integer;
begin
   bytes_received:=AData.size;
end;

私は何を間違っていますか?

前もって感謝します

4

1 に答える 1

8

キースミラーが述べたように、あなたは財産を悪用していBindingsます。サーバーに2つのバインディングを追加しています。1つは192.168.1.1オンポート0用、もう1つはオン0.0.0.0ポート用です49152Bindings.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に属するTIdUDPServerIP(デバイスが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;
于 2012-05-14T20:05:10.473 に答える