2012-11-26 31 views
6

Làm thế nào để bạn nhận được IP của người gửi gói Multicast UDP? Mã hiện tại được thiết lập theo cách đồng bộ/chặn (xem lưu ý bên dưới). Đây là mã:Nhận người gửi ip từ gói multicast

private void receive() 
    { 
     string mcastGroup = SetMcastGroup(); 
     s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     s.EnableBroadcast = true; 
     IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); 
     s.Bind(ipep); 
     IPAddress ip = IPAddress.Parse(mcastGroup); 
     s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any)); 

     while (true) 
     { 
      try 
      { 
       byte[] b = new byte[4096]; 
       s.Receive(b); 
       string str = Encoding.ASCII.GetString(b, 0, b.Length); 
       //this.SetText(ipep.Address + ": " + str.Trim()); 
       this.SetText(senderIP() + ": " + str.Trim()); 
      } 
      catch{} 
     } 
    } 

Lưu ý: Câu hỏi này xuất phát từ trò chuyện, như vậy không phải là mã của tôi. Tôi chỉ hỏi vì tôi hiểu vấn đề.

+0

Xin đừng bao giờ sử dụng một sản phẩm nào 'catch {} '. Nó chỉ đơn giản là mặt nạ lỗi ra và làm cho vấn đề khó khăn hơn để nhận ra. Nếu bạn đang cố gắng bỏ qua một ngoại lệ cụ thể, hãy làm như vậy cho loại cụ thể đó (ví dụ: 'catch FileNotFoundExcetion {}') –

+2

@JonathonReinhart bạn đã đọc nhận xét về tôi không phải mã của tôi * sigh * –

+4

Tôi xin lỗi vì đã bỏ lỡ điều đó . Tuy nhiên, tôi sẽ không gọi nó là "lửa", tôi sẽ gọi nó là "đưa ra một gợi ý mang tính xây dựng". –

Trả lời

3

Vì bạn đang sử dụng UDP, bạn không thiết lập kết nối với điểm cuối từ xa (không giống TCP, nơi bạn sẽ có một ổ cắm cho mỗi kết nối). Vì vậy, bạn phải lấy địa chỉ của điểm cuối từ xa khi bạn nhận được datagram. Để thực hiện điều này gọi receiveFrom thay vì

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receivefrom.aspx

Các vấn đề liên quan