【发布时间】: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 进行基本的网络测试,看看这是否能说明情况。