发现免费端口

时间:2011-06-23 00:46:34

标签: tcp erlang

我在erlang中编写了一个服务器应用程序,在C#中编写了一个客户端。它们通过3个TCP端口进行通信。端口号是硬编码的。现在我想动态地这样做。这是我第一次进行网络编程,所以请原谅我无法使用正确的术语:-D

我想做的是让一个主管接受来自先前已知端口(例如,10000或其他)的客户端的TCP连接,然后找到3个空闲端口,在这3个端口上启动服务器应用程序并告诉客户端这些端口号,以便客户端可以连接到服务器。

我的特殊问题是:如何找到3个未使用的端口? (澄清:使用哪个模块:fun()来查找自由端口?)

我的一般问题是:我确定这种东西(一个服务器分配端口和重定向客户端)是非常常见的网络编程问题,应该有一堆(特定于erlang或一般)资源,但是我只是没有用来谷歌的术语。

3 个答案:

答案 0 :(得分:13)

根据Erlang文档here,如果gen_tcp:listen / 2函数的Port参数为0,则操作系统会将任何可用端口分配给套接字。然后可以使用inet:port / 1来检索后者。

你可以这样做:

{ok, Listen} = gen_tcp:listen(0, [Options]),
Port = inet:port(Listen).

答案 1 :(得分:3)

以防您不知道 - 您不必为每个客户端分配新端口,让所有客户端连接到相同端口完全没问题

更新:

如果有理由为传入客户端分配新端口,那么它远远超出了您第一次“网络编程简介”计划。

单独的端口可能意味着您希望完全隔离不同客户端组的环境。它可以提供完全不同的IP地址来连接。如果你想写一个简单的乒乓球程序 - 你不需要它。老实说,我相信你一生都不需要使用这样的解决方案 - 这是多么罕见的。

关于cpu / ports开销 - 分配端口和启动侦听该端口的服务器的开销远远大于接受同一端口上的客户端。

答案 2 :(得分:1)

你需要避免常见的端口,ftp,http,smtp等,但我不认为有任何主要的列表,其他软件使用哪些端口你应该避免。我认为你最好的办法是提出一系列你想要使用的端口。如果没有其他人在动态选择的数字上回答(正在使用端口),如果没有将其发送给客户端,请在运行时检查。