C# TCP 在同一个本地端口上侦听和连接

Posted

技术标签:

【中文标题】C# TCP 在同一个本地端口上侦听和连接【英文标题】:C# TCP Listen and Connect on the same Local Port 【发布时间】:2016-10-23 02:19:51 【问题描述】:

我有一个 C# 控制台应用程序,我正在尝试实现 TCP 打孔。

我需要监听一个本地端口,同时(同时/异步)使用同一个本地端口连接到 2 个不同的远程主机(实际上是远程主机公共和私有端点)。

据我了解,我需要以某种方式绑定套接字/端口,但我无法在 C# 中解决这个问题。

有 TCPListener、TCPClient 和 Socket 类,我不知道用哪些类来完成我需要的。

我正在关注本指南http://www.bford.info/pub/net/p2pnat/index.html 第 4.2 章

    来自 AB(客户端)用于向(服务器)SA 注册的相同本地 TCP 端口B 每个都按照 S 的报告异步尝试到对方的公共和私有端点的传出连接,同时在各自的本地 TCP 端口上侦听传入连接.

我已经使用 NodeJS 实现了服务器部分,并且工作正常,我正在为上面提到的本地端口问题而苦苦挣扎。

【问题讨论】:

有没有可能their respective local TCP ports和用来连接S的不一样?如果是,它是哪个其他端口? 如果您有两个线程,尝试将侦听器和 TcpClient 绑定到同一个端口时是否会出错? 我不认为我在使用单独的线程,我使用任务运行它们并调用 Task.WaitAll() 所以带有侦听器的方法和带有 TCPClient 的方法同时运行,我的问题是实际上告诉 TCPClient 使用/绑定到与侦听器相同的本地端口。我昨天发布了这个,你可以看到使用的代码***.com/questions/37930824/… 好吧,如果你明确告诉客户端 A 在端口 '25000' 上连接到服务器,当实际连接建立时,如果你检查属性,它通常会说它连接到不同的端口.那是您用于“私人”连接的端口吗? 我不需要告诉它使用哪个端口连接到服务器,我只需要知道它用于连接到服务器的“本地”端口,以便我以后可以使用它监听并连接到另一个客户端。 【参考方案1】:

我很确定 TCP 只允许客户端和服务器以及端口之间的 1-2-1 连接。设置多个连接的唯一方法是创建两个不同的套接字。

您所指的 TCP 打孔方法我也曾尝试过。您基本上需要使用中继服务器来告诉A和B如何连接。所以请执行以下操作:

1) 客户端 A 通过一个端口连接到服务器

2) 服务器告诉客户端 B 你的 IP 和端口(这将是你将要建立的新连接,与你与服务器的连接不同)

3) 服务器告诉客户端 A 客户端 B 将使用的 IP 和端口

4) 客户端 A 使用提供的信息直接创建与客户端 B 的新连接

5) 客户端 B 使用其关于您的“新”连接的信息来尝试接受传入请求

6) 它可能由于延迟而无法握手几次,因此请构建某种中继器以继续尝试连接

7) 你最终应该直接连接到 B

【讨论】:

服务器部分已经完全实现,两个客户端都得到了另一个客户端的信息,我遇到的问题是连接两个客户端,据我所知,你不能只是 @987654321 @ 相反,两者都需要监听 从用于连接服务器的同一本地端口发出请求(此时可以终止与服务器的连接),这意味着以某种方式绑定 tcplistener 和 tcpclient连接到同一个本地端口。如果你之前实现过,可以分享一下代码吗? 我猜你的意思是一个客户端总是在听,一个客户端是那个试图连接到另一个客户端的客户端,我认为这不会起作用,因为打孔的方式工作原理是防火墙看到来自请求发送到的同一端点的请求,并让它抛出/连接它们以创建连接,因此两个客户端都需要尝试连接作为监听才能使其工作。 我处理它的方法是使用双工 WCF NetTCP 服务来连接从客户端 A 到中继服务器..(以及在 B 上运行的相同)然后使用那里的方法来调用服务器从 A 回调到 B.. 然后使用 TCP 套接字来驱动 A 和 B 之间的连接过程..

以上是关于C# TCP 在同一个本地端口上侦听和连接的主要内容,如果未能解决你的问题,请参考以下文章

哪种 SSL 证书可以确保 Amazon Lightsail 实例上的 C# 侦听器与 iOS 应用程序之间的安全 TCP 连接?

如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题

C# TCP 聊天服务器:连接仅以一种方式工作

TCP重置报文段(RST)

如何创建将侦听特定端口并接受 TCP 连接(非 https)的 servlet

当服务器接受 TCP 连接时端口会改变吗?