如何在 .Net Core 中替换 System.Net.IPAddress.Any 并监听所有网络适配器

Posted

技术标签:

【中文标题】如何在 .Net Core 中替换 System.Net.IPAddress.Any 并监听所有网络适配器【英文标题】:how can I replace System.Net.IPAddress.Any in .Net Core and listnen to all network adapters 【发布时间】:2015-11-10 21:54:00 【问题描述】:

我正在尝试将 .net 框架中的 VB .net 项目移植到 .net 核心和新的 Windows 通用平台应用程序中。

在网络代码中,经常使用 .IPAddress.Any 以便能够监听所有网络适配器。有谁知道 .net 核心中的一种方法,我可以使用 DatagramSockets 来监听所有网络适配器?

【问题讨论】:

【参考方案1】:

IPAddress.Any 等价于IPAddress ip = IPAddress.Parse("0.0.0.0")

使用 Windows.Networking.Sockets.DatagramSocket (Windows 8+)

private void Foo()

    datagramSocket = new DatagramSocket();
    datagramSocket.MessageReceived += OnMessageReceived;
    await datagramSocket.BindServiceNameAsync("8081");


private void OnMessageReceived(
    DatagramSocket sender,
    DatagramSocketMessageReceivedEventArgs args)

    // ...

使用 System.Net.Sockets.Socket(.NET Core 和 UWP)

private void Foo()

    Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 8081);

    udpSocket.Bind(remoteEndPoint);

    SocketAsyncEventArgs e = new SocketAsyncEventArgs();
    byte[] buffer = new byte[1024];
    e.SetBuffer(buffer, 0, buffer.Length);
    e.RemoteEndPoint = remoteEndPoint;
    e.Completed += ReceiveFromCallback;

    if (!udpSocket.ReceiveFromAsync(e))
    
        ReceiveFromCallback(udpSocket, e);
    


private void ReceiveFromCallback(object sender, SocketAsyncEventArgs e)

    if (e.SocketError != SocketError.Success)
    
        Debug.WriteLine(e.SocketError);
        return;
    

    Socket udpSocket = sender as Socket;

    byte[] buffer = e.Buffer;
    Debug.WriteLine(Encoding.UTF8.GetString(buffer, 0, e.BytesTransferred));

    if (!udpSocket.ReceiveFromAsync(e))
    
        ReceiveFromCallback(udpSocket, e);
    

【讨论】:

这是否意味着当我想创建新的数据套接字时,我可以使用以下命令创建它:datagramSocket dg = new DataGramSocket(); dg.BindEndpointAsync(new Hostname("0.0.0.0", serverPort); 我的理解是DatagramSocket 不是.NET Core 的一部分。无论如何,我已经用示例更新了我的答案,看看吧。 好吧,自从我开始开发 Windows UWP 应用程序以来,我必须说我发现 msdn 文档非常混乱且难以导航。但从我的角度来看,Datagramsocket 似乎在 .Net 核心和 UWP 应用程序中可用。我在树莓派:s 上的 c# 和 VB 中都使用了它们。但我无法使用 System.Net.Sockets.Socket 命名空间。当我搜索 msdn 时,它说它是 .Net 框架的一部分,与 .Net 核心不同。令人困惑的是 .Net 核心不是 .Net 框架的一部分

以上是关于如何在 .Net Core 中替换 System.Net.IPAddress.Any 并监听所有网络适配器的主要内容,如果未能解决你的问题,请参考以下文章

替换 Net Core 中的 AppDomain

如何在 .NET Core 3.0 中替换 AddJwtBearer 扩展

如何在 .NET Core 类库中使用 System.Windows.Forms

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

在 .NET Core 中替换 AssemblyBuilder.DefineDynamicAssembly

如何在 .NET Core 上隐藏 System.Exception 错误?