最近在做有关udp多播,碰到个问题。一般来说我们使用UDP单播,Bind到一个端口,然后可以接受到其他机器发送来的数据。但是多播的情况下,比如A,B,C 3台机器加入到同一个Group中地址是IP:1900,机器D不属于这个Group。D直接使用UDP象IP:1900这个Group发送数据,这时A,B,C能收到这个消息,并且以单播方式回应的消息D可以收到。 1 为什么D并没有Bind一个端口就能收到数据
2 A,B,C 单播回应的数据是通过那个端口发送给D的?
3 然后我自己在本机写了个Server,端口在20000,让D把消息发到这个Server,这个server接收到之后回应,但是D收不到server返回的信息,可以收到自己发给Server的消息。 
Socket socketClient2 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socketClient2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            SocketAsyncEventArgs sendEvent = new SocketAsyncEventArgs();
            string find = "M-SEARCH * HTTP/1.1\r\n";
            byte[] buffer = Encoding.UTF8.GetBytes(find);
            sendEvent.SetBuffer(buffer, 0, buffer.Length);
            sendEvent.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(GROUP_ADDRESS), GROUP_PORT);
            //sendEvent.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 20000);
            sendEvent.Completed += (s, args) =>
                {
                    if (args.SocketError == SocketError.Success)
                    {
                        if (args.LastOperation == SocketAsyncOperation.SendTo)
                        {
                            //resize the buffer
                            buffer = new byte[1024 * 8];
                            args.SetBuffer(buffer, 0, buffer.Length);
                            //args.RemoteEndPoint = new IPEndPoint(IPAddress.Any, GROUP_PORT);
                            socketClient2.ReceiveFromAsync(args);
                        }
                        else if (args.LastOperation == SocketAsyncOperation.ReceiveFrom)
                        {
                            String ret = Encoding.UTF8.GetString(buffer, 0, args.BytesTransferred);
                            Debug.WriteLine(string.Format("Receive From: {0}", args.RemoteEndPoint.ToString()));
                            Debug.WriteLine(ret);
                            socketClient2.ReceiveFromAsync(args);
                        }
                    }
                    else
                    {
                        MessageBox.Show(args.SocketError.ToString());
                    }
                };
            socketClient2.SendToAsync(sendEvent);
下面是自己写的server代码Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Any, 20000));
            SocketAsyncEventArgs ev = new SocketAsyncEventArgs();
            byte[] buf = new byte[1024];
            ev.SetBuffer(buf, 0, buf.Length);
            ev.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 20000);
            ev.Completed += (s, arg) =>
            {
                if (arg.SocketError == SocketError.Success)
                {
                    if (arg.LastOperation == SocketAsyncOperation.ReceiveFrom)
                    {
                        EndPoint ep = arg.RemoteEndPoint;
                        string ss = Encoding.UTF8.GetString(buf, 0, arg.BytesTransferred);
                        Console.WriteLine(string.Format("Receive from {0}:{1}", ep.ToString(), ss));
                        socket.ReceiveFromAsync(ev);
                        //send
                        byte[] send = Encoding.UTF8.GetBytes("Received!");
                        SocketAsyncEventArgs ev2 = new SocketAsyncEventArgs();
                        ev2.SetBuffer(buf, 0, buf.Length);
                        ev2.RemoteEndPoint = ep;
                        ev2.Completed += (s2, arg2) =>
                            {
                                if (arg.SocketError != SocketError.Success)
                                {
                                    Console.WriteLine(arg.SocketError.ToString());
                                }
                            };
                        socket.SendToAsync(ev2);
                    }
                }
            };
            socket.ReceiveFromAsync(ev);
            Console.ReadKey();