套接字端口与监听端口不匹配

Socket ports are not matching listening ports

我正在使用 sys.net.Socket (cpp, linux) 设置一个简单的服务器。

服务器是这样绑定的:

hostSocket.bind(new Host("0.0.0.0"), 20301);

然后我这样连接到服务器:

clientSocket.connect(new Host("localhost"), 20301);

如果端口不匹配,连接将无法正常工作,因此会按预期工作。
但是,当我在服务器端“接受”连接并想要打印有关客户端的信息时,只要有新连接传入,我就会得到一个随机端口,永远不会 20301:

var connectedClient : Socket = hostSocket.accept();

trace("Incoming connection from " + connectedClient.peer().host.toString() 
      + " on port " + connectedClient.peer().port);

现在我得到这样的结果:

Incoming connection from 127.0.0.1 on port 50977

Incoming connection from 127.0.0.1 on port 50978

Incoming connection from 127.0.0.1 on port 50979

这是怎么回事?为什么显示的端口不是20301?

服务器和客户端套接字都需要绑定到某个本地地址(ip、端口)才能建立连接。

客户端简单地绑定到本地免费端口,并且很可能会发生很大变化,具体取决于您计算机上发生的所有其他连接。

最后,Haxe 套接字(有时是间接的)是 POSIX 套接字的包装器; connect()spec 说:

If the socket has not already been bound to a local address, connect() shall bind it to an address which, ..., is an unused local address.