2012-11-01 21 views
0

你好我得到這個代碼here收到一個多播地址C#的IP組播接收並保存多個包

Socket sock = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
Console.WriteLine("Ready to receive…"); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
EndPoint ep = (EndPoint)iep; 
sock.Bind(iep); 
sock.SetSocketOption(SocketOptionLevel.IP, 
      SocketOptionName.AddMembership, 
      new MulticastOption(IPAddress.Parse("224.100.0.1"))); 
byte[] data = new byte[1024]; 
int recv = sock.ReceiveFrom(data, ref ep); 
string stringData = Encoding.ASCII.GetString(data, 0, recv); 
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); 
sock.Close(); 

現在,當我收到一包這個工程的數據,那麼sock.ReceiveFrom被觸發,但後即接收器關閉(即使我刪除了sock.Close行)。
我想要的是接收機顯示或保存我的數據,但繼續偵聽更多的數據包。

什麼是一個很好的方法來做到這一點?

回答

1

您必須編寫某種循環或使用異步方法BeginReceive/EndReceive。 只要你的本地sock變量超出範圍,它可能會被gc收集並處置掉。

byte[] data = new byte[1024]; 

while (true) { 
    // this blocks until some bytes are received 
    int recv = sock.ReceiveFrom(data, ref ep); 
    string stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); 
} 
+0

因此,當使用while循環,我假設運行它在一個自己的線程,所以也許BeginReceive方法會更好地使用? – Gobliins

+0

這取決於上下文。接收是一項阻止操作。當你必須同時做其他事情時,要麼跨越一個線程並使用阻塞while循環,要麼使用帶有「BeginReceive/EndReceipt」的異步編程模型 – Jan

相關問題