【发布时间】:2013-10-13 16:21:15
【问题描述】:
我有一个 listener,它在分配的端口号上侦听 localhost,如下所示:
TcpListener listener = new TcpListener(localIP);
listener.Start();
while (true) {
listen:
if (!listener.Pending()) {
Thread.Sleep(100);
goto listen;
}
Socket socket = listener.AcceptSocket();
}
现在同一个程序应该像这样连接到该程序的其他实例:
TcpClient client = new TcpClient(localIP); //localendpoint should use same port
client.Connect("localhost", remotePort);
如您所见,我为 listener 和 client 绑定了相同的 IPEndPoint localIP。因此,每当程序的另一个实例与这个程序有连接时,侦听器中的套接字就可以给我RemoteEndPoint。这样我就不会得到系统生成的随机端口号。当然这不起作用,我得到这个错误:
每个套接字地址(协议/网络地址/端口)只能使用一次 通常是允许的
因为监听器和客户端都绑定到同一个IPEndPoint localIP。
是否有解决方法可以将侦听器和客户端绑定到同一个端点?因为我想在监听器中从socket.RemoteEndPoint 获取端口号。此端口号应该是分配给程序的每个单独实例的端口号。
【问题讨论】:
-
这没有意义。当然,你不能为两个连接使用同一个本地 tcp 端口,系统如何知道两个连接中的哪一个应该在一个到达时接收数据包?这就是端口的全部意义所在。但这永远不需要。我不明白问题是什么,或者为什么“new TcpClient(localIP)”会有所帮助。
-
好吧,就像我说的,我的目的是获取套接字另一端的程序正在侦听它自己的传入连接的端口号。相反,只要我执行
TcpClient client = new TcpClient(),系统就会创建一个随机端口号。 -
我不明白为什么随机端口有问题。您是否尝试从 listener 连接获取远程端口?尝试读取 accepted 连接的远程端口 - 你的 Socket socket = listener.AcceptSocket();连接,而不是监听器。
-
假设我启动了这个应用程序的两个实例。程序 A 将被分配监听端口 1000,程序 B 将被分配监听端口 1001。现在程序 A 连接到 B。B 确实会接受这个并返回套接字。在套接字上,当我要求它是 RemoteEndPoint 时,我得到随机生成的端口号。但是我想要程序A监听的端口号,也就是1000。
-
我解释了为什么这没有意义。想象一下程序 A 使用本地端口 1000,程序 B 使用本地端口 1000。一个数据包到达我的 IP 端口 1000。哪个连接应该接收数据?您的选择是:1)使用原始套接字,Windows 7 不再允许这些,因此您需要一个库或其他东西。这是最强大但最复杂的解决方案 2) 通过连接将客户端的侦听端口作为数据发送 3) 使客户端的侦听端口在数学上可从其客户端端口推导出 - 例如将客户端绑定到侦听端口 + 1。