TcpListener:如何监听所有接口上的特定端口?

Posted

技术标签:

【中文标题】TcpListener:如何监听所有接口上的特定端口?【英文标题】:TcpListener: How to listen on specific port on all interfaces? 【发布时间】:2011-11-06 11:24:57 【问题描述】:

构造TcpListener有三个重载:

public TcpListener(int port);已过时public TcpListener(IPEndPoint localEP) public TcpListener(IPAddress localaddr, int port)

想要监听特定端口,但监听所有可用接口。 有一个重载可用于执行此操作,但它已被标记为 obsolete

在 .NET 中使用TcpListener 在所有接口上侦听特定端口的新首选/非过时方法是什么?


为了帮助起见,IPEndPoint 是:

public IPEndPoint(
    IPAddress address,
    int port
)

这就是第三个重载。而IPAddress 将其作为其构造函数:

byte[] Int64 byte[]Int64

【问题讨论】:

【参考方案1】:

只需绑定到IPAddress.Any - 这就是通常的做法...不确定,但可能您也需要绑定到IPAddress.IPv6Any

此SO post 建议您明确绑定到每个 IP 地址 - 而此 SO post 包含有关如何获取所有 IP 地址的代码...


来自MSDN:

如果您不关心分配哪个本地地址,请为 localaddr 参数指定IPAddress.Any,底层服务提供商将分配最合适的网络地址。


来自MSDN:

IPAddress.Any 字段

提供一个 IP 地址,指示服务器应在 所有 网络接口上侦听客户端活动。

【讨论】:

耶稣;这比我想象的还要糟糕。您必须枚举所有接口,并手动说您要绑定到所有接口。 在带有 Mono 的 linux 上,绑定到 Any 就足够了,因为那是“实际上是 0.0.0.0”,它的意思是“所有接口”... 嗯,无论如何,它的意思是“所有 IPv4 接口”。

以上是关于TcpListener:如何监听所有接口上的特定端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 TcpListener 始终监听并接受多个连接?

利用TcpClient,简单的tcp消息收发

Go语言中Socket通信TCP服务端

tcplistener 没有启动

如何使用ZeroMQ监听和解析特定端口上的UDP数据?

如何更改Apache中的HTTP监听端口