C# 获取异步接收的远程端点

C# 获取异步接收的远程端点,c#,network-programming,C#,Network Programming,当我想异步接收UDP数据报时,我会编写一个调用BeginReceiveFrom,该调用来自System.Net.Sockets.Socket类。BeginReceiveFrom方法需要一个端点作为remoteEP参数 public IAsyncResult BeginReceiveFrom ( byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP, Async

当我想异步接收UDP数据报时,我会编写一个调用BeginReceiveFrom,该调用来自System.Net.Sockets.Socket类。BeginReceiveFrom方法需要一个端点作为remoteEP参数

public IAsyncResult BeginReceiveFrom (
  byte[] buffer,
  int offset,
  int size,
  SocketFlags socketFlags,
  ref EndPoint remoteEP,
  AsyncCallback callback,
  Object state
)
public int EndReceiveFrom (
  IAsyncResult asyncResult,
  ref EndPoint endPoint
)
此方法启动异步接收,无法在remoteEP中返回任何结果,因为它会立即返回。此参数是用于某种过滤,还是在接收完成时修改

在接收处理程序中,我调用EndReceiveFrom,其中我还必须将对Enpoint对象的引用作为端点参数传递

public IAsyncResult BeginReceiveFrom (
  byte[] buffer,
  int offset,
  int size,
  SocketFlags socketFlags,
  ref EndPoint remoteEP,
  AsyncCallback callback,
  Object state
)
public int EndReceiveFrom (
  IAsyncResult asyncResult,
  ref EndPoint endPoint
)

EndReceiveFrom使用此端点对象指示UDP帧的发送方。为什么我必须将remoteEP传递给BeginReceiveFrom,我可以避免吗?

没有不需要端点的重载,但这并不意味着您必须指定特定的端点。您可以将任何ip地址指定为remoteEP

EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
EndReceiveFrom需要一个pass by ref变量,该变量将由方法调用本身填充。您可以类似地实例化端点

EndPoint receivedFromEP = new IPEndPoint(IPAddress.Any, 0);

调用后,如果不需要ReceivedFromp的值,只需忽略它。

没有不需要端点的重载,但这并不意味着您必须指定特定的端点。您可以将任何ip地址指定为remoteEP

EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
EndReceiveFrom需要一个pass by ref变量,该变量将由方法调用本身填充。您可以类似地实例化端点

EndPoint receivedFromEP = new IPEndPoint(IPAddress.Any, 0);

调用后,如果不需要ReceivedFromp的值,只需忽略它。

那么BeginReceiveFrom中的remoteEP参数是什么?为什么我要创建一个被忽略的IPEndPoint?我没有任何文档可以为您的问题提供明确的答案,也许其他人有。我的猜测是,它与绑定到网络接口、安全性和约定有关。通常应用程序双向发送数据,因此了解数据来自何处是有意义的。您可能也会有多个客户端,因此可能需要对数据进行分离,甚至对数据包进行排序(TCP功能的子集)。我认为不需要任何客户信息更是规则的例外。因此,默认情况下填充端点是有意义的。那么BeginReceiveFrom中的remoteEP参数是什么?为什么我要创建一个被忽略的IPEndPoint?我没有任何文档可以为您的问题提供明确的答案,也许其他人有。我的猜测是,它与绑定到网络接口、安全性和约定有关。通常应用程序双向发送数据,因此了解数据来自何处是有意义的。您可能也会有多个客户端,因此可能需要对数据进行分离,甚至对数据包进行排序(TCP功能的子集)。我认为不需要任何客户信息更是规则的例外。因此,默认情况下填充端点是有意义的。