2012-11-06 31 views
3

我連接到發送UDP數據包,既作爲響應(發送到特定的IP地址)和廣播系統(DEST 255.255.255.255,根據的是Wireshark)如何使用Indy10 TIdUDPClient接收廣播數據包?

我可以接受「直接」包正確,但我無法弄清楚如何獲得廣播節目。我想我需要第二個具有不同綁定的TIdUDPClient,但是我一直無法使它工作。

TIdUDPClient *reader(new TIdUDPClient(NULL)); 
TIdUDPClient *broadcastReader(new TIdUDPClient(NULL)); 

reader->Port = 2000; 
reader->Host = "192.168.0.1"; 
reader->Connect(); 

broadcastReader->Port = 2000; 
// broadcastReader->Host = "0.0.0.0"; // This doesn't work, but is here as an example 
broadcastReader->BroadcastEnabled = true; 
broadcastReader->Connect(); 

然後我有其他幾乎相同的線程調用reader/broadcastReader->ReceiveBuffer()。該reader一個工作正常,但broadcastReader->receiveBuffer()不會返回......

道歉C++代碼和德爾福標籤;-)

+0

如果目標是接收未經請求的數據包,是不是需要* server *組件而不是*客戶端*? –

+0

@RobKennedy - 看起來似乎 - 但是,我只對接收來自一個特定主機IP的廣播感興趣。不過,使用UDP等無連接協議的客戶端和服務器之間的區別似乎有點奇怪。 – Roddy

回答

5

TIdUDPClient並非設計用於接收廣播。改爲使用TIdUDPServer

+0

謝謝。我正在想這個結論。從Indy9開始,這似乎已經發生了變化,因爲我確信以前我能夠使用UDPClient接收廣播。 – Roddy

+0

另外一點 - 對於服務器,我通常會從該端口上發送的所有主機接收廣播 - 我是否可以自動將其限制爲單個主機,還是應該檢查每個數據包的發送方? – Roddy

+0

「TIdUDPClient」根本不能接收廣播。它只是像「TIdUDPServer」那樣不能自動接收。 'TIdUDPServer'有一個'OnUDPRead'事件,每當新數據到達時觸發。您必須手動調用TIdUDPClient.Receive ...()方法之一,例如在計時器或線程中完成相同的操作。不過,您在處理廣播數據時確實不應該使用Connect()。 Connect()在IP/Port對之間建立一個靜態鏈接,所以它可能會在OS層過濾你的廣播數據包。 –