2012-06-06 9 views
5

私のネットワークにはuPNPデバイスがほとんどありません。私はネットワークにM-SEARCH要求を送信しようとしており、そこからいくつかの応答を受け取ることを期待しています。これは私が試しているものです:IdUDPClientを使用してM-SEARCH要求を送信できますか?

var sIP, sOut: string; 
    iPort: Word; 
    S: TStringBuilder; 
begin 
    S := TStringBuilder.Create; 
    try 
    S.Append('M-SEARCH * HTTP/1.1').AppendLine 
    .Append('HOST: 239.255.255.250:1900').AppendLine 
    .Append('MAN: "ssdp:discover"').AppendLine 
    .Append('MX: 10').AppendLine 
    .Append('ST: ssdp:all').AppendLine; 

    IdUDPClient1.ReceiveTimeout := 3000; 
    IdUDPClient1.Broadcast(S.ToString, 1900, '239.255.255.250'); 
    sOut := IdUDPClient1.ReceiveString(sIP, iPort); 
    Memo1.Lines.Add(sIP); 
    Memo1.Lines.Add(IntToStr(iPort)); 
    Memo1.Lines.Add(sOut); 
    finally 
    S.Free; 
    end; 
end; 

私はUDPクライアントから何も受け取りません。私はWiresharkを使ってネットワークトラフィックを監視し、私のホストからのメッセージは送信されませんでした。

アイデア?ありがとうございました。文字列ビルダの終わりに二回

uses 
    System.SysUtils, IdUDPClient, IdStack; 

var S: TStringBuilder; 
    U: TIdUDPClient; 
    iPeerPort: Word; 
    sPeerIP, sResponse: string; 
begin 
    U := TIdUDPClient.Create(nil); 
    S := TStringBuilder.Create; 
    try 
    S.Append('M-SEARCH * HTTP/1.1').AppendLine 
    .Append('HOST: 239.255.255.250:1900').AppendLine 
    .Append('MAN: "ssdp:discover"').AppendLine 
    .Append('MX: 3').AppendLine 
    .Append('ST: ssdp:all').AppendLine 
    .AppendLine; 

    U.BoundIP := GStack.LocalAddress; 
    U.Send('239.255.255.250', 1900, S.ToString); 

    U.ReceiveTimeout := 1000; 
    repeat 
     sResponse := U.ReceiveString(sPeerIP, iPeerPort); 
     if iPeerPort <> 0 then begin 
     WriteLn(Format('%s:%d', [sPeerIP, iPeerPort])); 
     WriteLn(sResponse); 
     end; 
    until iPeerPort = 0; 
    ReadLn; 
    finally 
    S.Free; 
    U.Free; 
    end; 
end. 

答えて

6

コールAppendLine()

は、私は最終的に答えを見つけました。 HTTP要求ヘッダーは2つのCRLFペアで終了しますが、1つのペアを追加するだけなので、不完全な要求が送信されます。

+0

私は新しいAppendLineを追加()をstringbuilderオブジェクトに追加しましたが、何も応答がありませんでした。 WireShark経由でトラフィックを監視しているときに、私のホストから送信されたリクエストに気付かなかった。 –

+0

'239.255.255.250'はあなたのLANの正しいブロードキャストIPですか?あなたのクライアントのPCにはどのようなローカルIPとサブネットが割り当てられていますか? –

+0

239.255.255.255にブロードキャストすると、ホストから送信されたトラフィックが確認できます。しかし、239.255.255.250にブロードキャストされ、トラフィックは検出されなかった。 –

3

TIdUDPServer(Indy 9)を使用したクイックで汚れた解決策。

フォーム上にTIdUDPServerコンポーネントをドロップし、Object Inspector set Bindingsを使用してローカルIPにドロップします。 10.1.0.78:0、BroadcastEnabledとActiveをtrueに設定します。フォームにTMemoとTButtonをドロップします。

次のようにクリック時とUDPReadイベントを完了します。

uses IdSocketHandle; 
... 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    IdUDPServer1.Send('239.255.255.250', 1900, 'M-SEARCH * HTTP/1.1' + #13#10 + 
    'HOST: 239.255.255.250:1900' + #13#10 + 
    'MAN: "ssdp:discover"'+ #13#10 + 
    'MX: 3'+ #13#10 + 
    'ST: ssdp:all'+ #13#10 + 
    #13#10); 
end; 

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); 
var 
    data: string; 
begin 

    setlength(data, Adata.Size - AData.Position); //No fragmentation :)   
    AData.ReadBuffer(data[1], length(data)); 

    memo1.Lines.Add('Read: ' + inttostr(AData.Position) + '/' + inttostr(AData.Size) + ' PeerIP: ' + ABinding.PeerIP);  
    memo1.Lines.Add(data); 
end; 

保存し、ファイル名を指定して実行とボブのあなたの叔父。

0

マルチキャストM-SEARCHの場合、メッセージフォーマットは以下のように定義されます。 * *間の値は、実際の値のプレースホルダです。

M-SEARCH * HTTP/1.1 
HOST: 239.255.255.250:1900 
MAN: "ssdp:discover" 
MX: *seconds to delay response* 
ST: *search target* 
USER-AGENT: *OS/version UPnP/1.1 product/version* 

だから、あなたはあなたのリクエストに遅延に少なくとも等しくなければなりません

U.ReceiveTimeout := 3000; 

へて、ReceiveTimeoutを修正する必要があります(MX:3)3秒= 3000ミリ秒

関連する問題