【问题标题】:Binding same EndPoint for TcpListener and TcpClient为 TcpListener 和 TcpClient 绑定相同的 EndPoint
【发布时间】: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);

如您所见,我为 listenerclient 绑定了相同的 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。

标签: c# tcp


【解决方案1】:

嗯,根据问题中的 cmets,最好的解决方案是通过套接字连接发送程序正在侦听的端口号。

【讨论】:

    【解决方案2】:

    我建议您切换到WCF 进行交流。它为您提供了许多方便的工具,用于对序列化、传输协议、安全性、配置等进行抽象。最终,WCF 让您可以为不同的客户端生态系统构建面向服务的应用程序,而不是自己完成所有艰苦的工作。

    WCF 必须提供的功能之一是所谓的Duplex Binding,它应该可以满足您的需求:连接的客户端会立即宣布一种回调方式。

    如果您仍然需要传达您的网络拓扑,那么您仍然可以使用 WCF 进行;为此,我建议实现一个单独的服务接口,专门处理网络拓扑。

    可以在herehere 找到关于开始使用 WCF、创建干净代码的教程 + 示例。

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2011-10-06
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2015-08-16
      • 2011-04-07
      相关资源
      最近更新 更多