Socket ReceiveAsync支持UDP吗?

3

我看过TCP的ReceiveAsync的例子,但没有看过UDP的。ReceiveAsync是否适用于UDP?如果是,你有看过任何例子吗?

谢谢。

1个回答

7

UDP是一种报文导向的协议,所以您需要使用Socket.ReceiveFromAsync方法

示例:

var s = new Socket(SocketType.Dgram, ProtocolType.Udp);
s.Bind(localEP);

var e = new SocketAsyncEventArgs();
e.Completed += OnReceive;
e.RemoteEndPoint = new IPEndPoint(IPAddress.IPv6Any, 0);
e.SetBuffer(new byte[BufferSize], 0, BufferSize);

if (!s.ReceiveFromAsync(e)) OnReceive(s, e);

e的RemoteEndPoint也应该分配给localEP吗?否则,它们将接受来自不同连接的消息(例如SAEA中的IPAddress.IPv6Any和localEP中的IPAddress.IPv6None),并且只应用最严格的设置。 - HaMster
2
@HaMster:当接收UDP数据报时,localEP是接收数据报的端点(数据报的目标),而e.RemoteEndPoint指定了允许接受数据报的端点(数据报的来源)。e.RemoteEndPoint = new IPEndPoint(IPAddress.IPv6Any, 0);表示接受来自任何来源的数据报;e.RemoteEndPoint = localEP则表示仅接受从相同端点发送的数据报。 - dtb
那完全有道理,我想下次写代码之前再好好思考一下^^ - HaMster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接