TcpListener和TcpClient共享本地端口

时间:2013-09-03 14:51:01

标签: c# sockets networking tcp

我有两个相同应用程序的实例,在不同的机器上,应该相互通信,其中没有人是典型的服务器或客户端。

应用程序的两个实例都有一个TcpListener,本地端口= 8000。

一个应用程序实例(称为“A”)创建一个TcpClient。现在,此客户端不能具有本地port = 8000,或者构造函数抛出套接字异常“通常只允许使用每个套接字地址(协议/网络地址/端口)”

因此,我使用随机本地端口创建第一个客户端,并运行Connect()以连接其他应用程序实例“B”。

“B”使用TcpListener.AcceptTcpClient()接受连接,该连接返回可用于与“A”通信的TcpClient。虽然,这个TcpClient与TcpListener具有相同的IP和端口!?当我在“A”上手动创建TcpClient时,我无法使用相同的端口,这怎么可能?我实际上真的希望他们在两台机器上使用与侦听器相同的端口......

那么,如何在“A”上使用与TcpListener相同的端口创建TcpClient?

3 个答案:

答案 0 :(得分:3)

我认为您可能无法完全理解地址端口客户端服务器架构。

TcpListener正在侦听地址和端口上的任何连接。建立连接后,您可以使用“Socket”接收和发送来自客户端和服务器的消息。

示例:

0.0.0.1是机器A.

0.0.0.2是机器B。

您可以将正在侦听端口8000的TcpListener放在机器A上。当机器B上的TcpClient尝试连接端口8000上的机器A时,机器B上的TcpClient将生成(通过操作系统)端口。

然后你将有一个连接

0.0.0.1:8000 - > 0.0.0.2:3587(Generated port) - 所以你不必担心客户端监听端口。

答案 1 :(得分:1)

TCP连接始终是服务器端和客户端端。服务器正在侦听(等待)连接,客户端连接到服务器。

当服务器获得连接请求时,AcceptTcpClient会为您提供服务器端的套接字以与客户端进行通信。始终使用双方的IP地址和端口定义TCP连接:serverip:serverport和clientip:clientport。

如果你想要一个非常对称的系统,两个实例都有一台服务器和一个连接到另一台服务器的客户端。然后,所有数据将始终通过客户端建立的连接从客户端发送到服务器。

例如:

ClientA connects to ServerB -> ConnectionAB
ClientB connects to ServerA -> ConnectionBA
ApplicationA sends data to ApplicationB over ConnectionAB
ApplicationB sends data to ApplicationA over ConnectionBA

答案 2 :(得分:0)

如果您的目标是使用2个TCP端点相互通信,而其中没有一个是端点 显式服务器总是,您可能应该运行一个监听器(在您的情况下在端口8000上) 在两台机器上。接下来,让每台机器随机尝试连接 - 让每个机器 机器选择一个随机时间(在0和T之间),然后唤醒。无论哪台机器 首先唤醒,将调用connect()并建立连接。

正如@nivpenso所指出的,执行连接的终点不需要显式绑定 一个港口。 connect()步骤明确地为其分配一个临时随机端口 终点。

因此,如果hostA启动连接,那么您将看到所有端点 (您可以使用netstat查看这些连接) 主机A:      - 听众:8000      - 与hostB的连接:port8000,localport:xyz

主机B:      - 听众:8000      - 与hostA的连接:port:xyz,localport:8000

另一方面,如果hostB启动连接,则以下是您的所有端点 会看到: 主机A:

-- listener: 8000
-- connection to hostB:port:xyz', localport:8000

主机B:

 -- listener: 8000
    -- connection to hostA:port8000, localport:xyz'

在Internet中,BGP使用类似的方法连接2个TCP对等体。