我们有一个自定义应用程序需要在它自己的端口号上提供请求。我们真的不在乎数字是多少,虽然在我们决定之后我们会坚持到那个端口。如何选择最不可能与用户系统上运行的其他应用程序或服务冲突的号码?
我们应遵循哪些规则或标准?
澄清:一旦我们选择了一个端口,我们就需要坚持下去。不能使用动态的。我们正在构建一个自定义SFTP服务器,我们必须告诉客户它正在运行什么端口。
答案 0 :(得分:13)
对于静态应用程序,请考虑检查/etc/services
以查找不会与您正在使用的任何其他内容发生冲突但在其他地方不常用的端口。
$ tail /etc/services
nimspooler 48001/udp # Nimbus Spooler
nimhub 48002/tcp # Nimbus Hub
nimhub 48002/udp # Nimbus Hub
nimgtw 48003/tcp # Nimbus Gateway
nimgtw 48003/udp # Nimbus Gateway
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
答案 1 :(得分:8)
如果您无法预测应用程序运行的确切环境类型,请不要为此烦恼。选择超过1024的任何数字,并使其可配置,以便用户可以在与其他服务/应用程序发生冲突时进行更改。
当然你仍然可以避免非常常见的端口,如8080(替代HTTP)或3128(代理如鱿鱼),1666(perforce)等。您可以查看已知端口的全面列表here,或者采取看看/ etc / services。
答案 2 :(得分:7)
如果您不关心端口号,并且不介意每次运行程序时它都会更改,只需在侦听之前不要绑定端口(或者绑定端口0,如果你想要绑定特定的IP地址)。在这两种情况下,您都告诉操作系统为您选择一个免费端口。
开始收听后,使用getsockname
找出已选择的端口。您可以将其写入文件,在屏幕上显示,让孩子通过fork
继承它等等。
答案 3 :(得分:0)
如果您想要为应用程序提供唯一的端口号,则需要request an assignment from IANA来维护IETF的Service Name and Transport Protocol Port Number Registry。 /etc/services
和其他辅助记录是从IANA注册中心填充的。
请不要简单地选择一个号码并发送您的应用程序(如另一个答案中所述),因为IANA迟早会将您要占用的端口分配给传入的请求,可能会导致您的应用程序和不知情的受让人发生冲突。