4

Delphi で TUdpSocket を使用しようとしています。私がやりたいことは、UDP サーバーに接続し、データを送信して応答を待つことです。データは正しく送信されますが、コントロールは何も受信しません。どうしてか分かりません。私はこの問題に何時間も苦労してきましたが、あきらめるつもりです:-(。

TIdUDPClient を使ってみましたが、状況は同じです。データは正しく送信されますが、何も受信されません。

TIdUDPServer のみが、データの送受信の両方で多かれ少なかれ適切に機能します。残念ながら、データ受信は別のスレッド (ThreadedEvent プロパティに応じてメインまたはその他) によって処理されるため、同期を使用する必要があり、コード全体が複雑になります。自分のスレッドで UDP 接続を処理したいと思います。データを送信し、WaitForData() を呼び出して応答を待ってから、同じスレッドで処理します。

もし不可能なら、私はサードパーティのコントロールを使いたくありませんが、それが唯一の解決策であるなら、私はそれを受け入れます.

事前にご連絡いただき、誠にありがとうございました。

---- 例 ---

i) TUDPソケット:

var
  lR, lW, lE: boolean;
begin
  UdpSocket1.LocalPort := '1600';

  UdpSocket1.RemotePort := '1600';
  UdpSocket1.RemoteHost := '127.0.0.1';
  UdpSocket1.Connect;

  UdpSocket1.Sendln('test');

  UdpSocket1.Select(@lR, @lW, @lE, 2000);    
  if lR then
    ShowMessage(UdpSocket1.Receiveln());
end;

ご覧のとおり、コントロールは送信したデータを受信する必要があります。Select() メソッドが呼び出された後に lR が true と評価されるため、明らかにそうです。ただし、ReceiveIn() は、ReceiveBuf() と同様に空の文字列を返します。UDP サーバーを起動してデータを送信すると、正しく受信されるので、データが実際に送信されていることは確かです。

4

2 に答える 2

2

これ以上必要なものはありません:

function SayHi(Host: String; Port: Integer): String;
var
  Client: TIdUDPClient;
begin
  Client := TIdUDPClient.Create(nil);
  try
    Client.Host := Host;
    Client.Port := Port;
    Client.Send('Hello');
    Result := Client.ReceiveString(1000);
  finally
    Client.Free;
  end;
end;

同じスレッドで、UDP パケットを送信し、UDP パケットを受信するか、タイムアウト後に例外を発生させます。

上記がうまくいかない場合は、( Wiresharkなどを使用して、クライアントが実際にデータを送信していることを確認します。次に、サーバーが実際にパケットを受信して​​いることを確認します。

Send()最終的に (Windows 上で) は WinSock の を呼び出しsendto()、 と をReceiveString()使用select()recvfrom()ます。TIdUDPServer をシミュレートすることができます

while not Terminated do begin
  S := Client.ReceiveString(1000);
  DoSomething(S);
end;
于 2010-10-15T19:17:44.617 に答える
0

もう 1 つの可能性は、コミュニケーションにSynapseを使用することです。ブロッキング呼び出しを実行する単純な通信ライブラリであるため、イベントの発生に依存するのではなく、データを停止して待機する単一のワーカー スレッドでうまく機能します。SVNの最新バージョンは、Delphi の最新バージョンをサポートしています。

于 2010-10-14T15:58:57.543 に答える