UDP多播和单播的问题

cc_net 2012-02-23 12:05:47
最近在做有关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();
...全文
728 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cc_net 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sp1234 的回复:]
你的“回应”本来就写明了 RemoteEndPoint。
[/Quote]

对。我想问的是,D并没有bind一个端口,那我server应该如何去回应他呢? 还是说D必须bind一个端口,server向这个端口发数据?

如果是这样,为什么D向一个Group发送数据,却能receive到呢?
  • 打赏
  • 举报
回复
你的“回应”本来就写明了 RemoteEndPoint。
cc_net 2012-02-23
  • 打赏
  • 举报
回复
顶一下

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧