2012-01-19 205 views
1

我正在製作一個需要始終監聽UDP數據的程序。使用C#UDP客戶端

我目前的想法是有這個方法不斷運行在一個線程偵聽數據包,然後將它們添加到列表準備在其他線程處理。主要的問題是我還想將收到的IP添加到列表中,以便其他線程可以處理它,但是我不知道如果程序在處理過程中會丟失接收的數據包,程序是否暫時停止使用Receive方法數據或者是否仍然可以從隊列中抓取它們。

public void listen() 
{ 
    try 
    { 
     packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint)); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
} 

回答

1

網絡流量應緩衝在您的網卡上,因此即使您不一致地收聽數據,數據也應保持一致。作爲IP,你可以從端點得到它,所以你需要傳遞,以及:

public void listen() 
    { 
     try 
     { 
      packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint), RemoteIpEndPoint); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

如果你想在接收之間儘可能短的時間錯過儘可能我建議你使用BeginReceive和啓動在回調中處理接收到的數據之前,在回調中新建BeginReceive。但這會增加一些同步複雜性。

+0

最後一部分是一個非常好的主意,我想我會這樣做,謝謝 – Joel

1

我知道沒有辦法從Udp數據包中獲取IP。你需要得到它形成的端點:

byte[] receivedBytes = oClientListener.Receive(ref endPoint); 
IPAddress = endPoint.Address; 
PackQueue.Add(new PacketOfSomeType(receivedBytes, IPAdress)); 

而且,你的程序將需要運行非常緩慢地開始丟失任何數據包 - 窗口將緩衝區的你,只要你有你的客戶端監聽器設置!

+0

你確定這只是Windows緩衝嗎?我以爲網卡緩衝區 – mtijn

+0

啊,是的,我重讀你的問題,並編輯我的答案。不,只要UdpClient處於活動狀態,您的流量就會被緩衝。 – DanTheMan

+0

我不會淡化性能方面。由於缺乏連接,UDP數據包可能會進入快速和激烈的狀態(思考SQL Slammer)。只是爲了保持實物。 –