0

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

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

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

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

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

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

4

3 回答 3

3

我想你可能没有完全理解地址端口客户端服务器架构。

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

例子:

0.0.0.1 是机器 A。

0.0.0.2 是机器 B。

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

然后你会有一个连接

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

于 2013-09-03T15:14:58.400 回答
1

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

当服务端得到连接请求时,AcceptTcpClient给你服务端的socket与客户端进行通信。一个 TCP 连接总是用两端的 IP 地址和端口定义的: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
于 2013-09-03T15:17:48.043 回答
0

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

正如@nivpenso 指出的那样,执行连接的端点不需要显式绑定到端口。connect() 步骤显式地为该端点分配一个临时随机端口。

因此,如果 hostA 启动连接,这里是您将看到的所有端点(您可以使用 netstat 查看这些连接) HostA: -- listener: 8000 -- connection to hostB:port8000, localport:xyz

HostB: -- listener: 8000 -- 连接到 hostA:port:xyz, localport:8000

另一方面,如果 hostB 启动连接,您会看到以下所有端点: HostA:

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

主机B:

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

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

于 2013-09-03T16:48:24.753 回答