2017-02-03 16 views
3

私は、NOTIFYやSEARCHのようなSSDPマルチキャストメッセージを聞いてみようとしています。RebolのSSDPマルチキャストグループに参加するにはどうすればよいですか?

これは私のコードですが、wiresharkが見てもこれらのメッセージは表示されません。では、SSDPマルチキャストグループに参加してメッセージを受信するにはどうすればいいですか?

Rebol [] 

attempt [close ssdp] 
local-ip: read join dns:// read dns:// 

ssdp: open/binary udp://:8000 
probe group: compose/deep [multicast-groups: [[235.255.255.250 (local-ip)]]] 
set-modes ssdp group 

forever [ 
    port: wait [ssdp] 
    probe data: copy port 
] 
+0

SSDPはUDPポート1900を使用していませんか。 – endo64

+0

@ endo64はいそうです。私はすべてのデバイスがマルチキャストメッセージを受信するために使用される1900年にサーバポートを開く必要があり、ネットワーク上の他のデバイスからUDPユニキャストメッセージを受信するために異なるアドレスを使用することを認識しませんでした。 –

答えて

1

次のコードは、まずSSDP SEARCHコマンドを送信して、ネットワーク上のすべてのデバイスをピックアップし、他のデバイスからSEARCHコマンドをリッスンします。

REBOL [ 
    Notes: {to listen for SSDP messages. Works on Rebol2} 
] 

local-ip: read join dns:// read dns:// 

probe local-ip 

attempt [close odata] 
attempt [close idata] 

odata: open/binary udp://239.255.255.250:1900 ; SSDP multicast port address 
set-modes odata [multicast-ttl: 10] 
; next line seems unnecessary 
; set-modes odata compose/deep [multicast-interface: (local-ip)] 

idata: open/binary udp://:1900 
set-modes idata compose/deep [multicast-groups: [[239.255.255.250 (local-ip)]]] 

ST: "ssdp:all" 
MX: 3 

insert odata rejoin [ 
     {M-SEARCH * HTTP/1.1} crlf 
     {HOST: 239.255.255.250:1900} crlf 
     {MAN: "ssdp:discover"} crlf 
     {MX: } MX crlf 
     {ST: } ST crlf 
     crlf 
] 

forever [ 
    port: wait [odata idata] 
    data: copy port 
    if find/part data {M-SEARCH} 8 [ 
     print "SSDP search issued from:" 
     print [ "Address: " port/remote-ip] 
     print [ "On port: " port/remote-port] 
    ] 
    probe data 
] 
関連する問題