2010-07-05 12 views
5

Tôi có một máy tính có nhiều NIC - và phương pháp gửi UDPClient liên tục không thành công. Đây là mã số:UDPClient Multicast nhận không thành công trên máy tính với nhiều NIC

 private static void receiveData() 
    { 
     recvSock = new UdpClient(PORT); 
     //recvSock.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, mainInterface); 
     recvSock.JoinMulticastGroup(IPAddress.Parse(IP), 50); 

     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 

     while (true) 
     { 
      byte[] data = recvSock.Receive(ref iep); 

      // Do not include messages from us 
      if (myIPs.Contains(iep.Address)) 
       continue; 

      string stringData = Encoding.ASCII.GetString(data, 0, data.Length); 
      Console.WriteLine("received: " + stringData); 

     } 
    } 

PORT = 5000 và IP = 224.5.6.7 sao cho phải OK. Vấn đề chính là tôi không thể vượt qua dòng recvSock.Receive(). Tôi thấy các gói dữ liệu đến trên wireshark - nhưng mã sẽ không xử lý chúng ...

Suy nghĩ? Cảm ơn trước!

Dan

EDIT: Tôi có thể xác nhận rằng nhiều NIC đang gây ra sự cố --- mã hoạt động tốt với một NIC duy nhất. Uncommenting dòng SetSocketOption nên cho phép nó làm việc với nhiều NIC, nhưng nó vẫn thất bại .... suy nghĩ?

+0

Để rõ ràng, ứng dụng "ứng dụng khách" này [máy] có nhiều NIC hoặc máy chủ mà bạn kết nối có nhiều NIC? –

+0

Vì tôi gặp vấn đề tương tự, tôi sẵn sàng xác nhận: "ứng dụng máy khách [máy] có nhiều NIC". Thông thường khách hàng quan tâm đến các máy chủ đang ở trên bất kỳ mạng NIC nào. Một máy chủ có nhiều NIC chỉ quan trọng nếu máy khách có thể thấy máy chủ _same_ qua nhiều NIC phía máy khách. –

+0

@Dan Bạn có tìm thấy cách giải quyết không? Tôi gặp vấn đề tương tự – J4N

Trả lời

0

Phần giao diện là một phần quan trọng trong đoạn mã sau:

unsigned long interface; 
ip_mreq mreq; 

_parseHostname(_description->getInterface(), interface); 
mreq.imr_multiaddr.s_addr = _writeAddress.sin_addr.s_addr; 
mreq.imr_interface.s_addr = interface; 

setsockopt(_readFD, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
       (char*)&mreq, sizeof(mreq)); 

Với giao diện là địa chỉ (unicast) chỉ IP của mạng nhận thẻ.

+1

Câu trả lời này _may_ hữu ích. Nhưng vì nó sử dụng thuật ngữ từ một gói ổ cắm hoàn toàn khác với câu hỏi ban đầu, ..., ai có thể nói? –

+1

Sự liên quan duy nhất mà câu trả lời này có cho câu hỏi nhất định là cả hai đều chứa từ "IP". – BTownTKD

1

tôi đã cùng một vấn đề tìm thấy bài này, sau đó tìm ra giải pháp tại địa chỉ: UDP: Read data from all network interfaces

Về cơ bản Bind() để 0.0.0.0 không hoạt động và bạn phải Bind() và JoinMulticastGroup() trên tất cả các Địa chỉ IP cục bộ. Phải yêu Microsoft cho cái này.