【问题标题】:How can you run an HttpListener and TcpListener on different IP addresses with the same port?如何在具有相同端口的不同 IP 地址上运行 HttpListener 和 TcpListener?
【发布时间】:2015-10-21 01:04:32
【问题描述】:

我想监听同一端口上不同 IP 地址上的 HTTP 请求和 TCP 连接。

string prefix = "http://192.168.1.2:40000/";
HttpListener http = new HttpListener();
http.Prefixes.Add(prefix);

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 40000);
TcpListener tcp = new TcpListener(ep);

如果我先启动 HttpListener,启动 TcpListener 时会出错。

试图以访问权限禁止的方式访问套接字

如果我先启动 TcpListener,启动 HttpListener 时会报错。

该进程无法访问该文件,因为它正被另一个进程使用

当 HttpListener 运行时,netstat 显示它只监听指定的 IP 地址,但它在系统进程 (PID 4) 中运行。

Proto  Local Address          Foreign Address        State           PID
TCP    192.168.1.2:40000      0.0.0.0:0              LISTENING       4

当 TcpListener 运行时,它也只监听指定的 IP 地址,但它在我的应用程序的进程中运行。

Proto  Local Address          Foreign Address        State           PID
TCP    192.168.1.3:40000      0.0.0.0:0              LISTENING       18316

即使他们监听不同的 IP 地址,仍然存在冲突,我无法同时进行这两个操作。

但是,我可以在具有相同端口的不同 IP 地址上运行两个 HttpListener 和两个 TcpListener。


更新

问题被问到:

如何在同一个 LAN 网段上分配两个本地 IP 地址?

最初我在同一个子网 (255.255.0.0) 的同一个网络适配器上有两个 IP 地址。 (在https://superuser.com/questions/571575/connect-to-two-lan-networks-with-a-single-card 了解这是如何实现的)。

为了排除这个问题,我在不同的子网上设置了一个带有两个网络适配器的虚拟机。结果是一样的。

【问题讨论】:

  • @Eser 你有任何文件证明这不仅仅是配置问题吗?
  • 它的根源是Berkeley sockets 并且看不到任何改变内部运作的理由......
  • 如何在同一个 LAN 网段上分配两个本地 IP 地址?听起来您需要提供有关源机器配置的更多详细信息。如果这两个地址位于不同的段上,这似乎应该可以工作。
  • @JamieMeyer 请查看我的问题中的更新。
  • 在第一种情况下,答案似乎很明显是在使用单个 IP 堆栈,因此 @Eser 的响应很准确。在 VM 配置中,它仍然应该可以工作。我会使用 ping 和 tracert 进行基本的网络测试,看看这是否能说明情况。

标签: c# .net


【解决方案1】:

显然,您必须告诉 HTTP.sys 监听哪些 IP 地址,因为它默认劫持所有 IP 地址。

就我而言,运行以下命令允许我在不同 IP 地址的同一端口上运行 HttpListener 和 TcpListener。

netsh http add iplisten 192.168.1.2

来源

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 2017-12-28
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多