如何为我的应用程序保留端口?

如何为我的应用程序保留端口?

如何为我的自定义应用程序保留端口列表?

具体来说,我正在创建的产品有很多流程,并且它们之间有很多相互沟通。

我遇到的问题是 - 每隔一段时间 - 操作系统就会窃取我的端口。这种情况很少见,但确实发生了。

这可能是因为不同的应用程序使用了“::bind”而没有指定端口。

或者有时,当我使用未绑定的套接字调用“::connect”时,我自己的应用程序会窃取端口。从手册页可以看出:

如果套接字尚未绑定到本地地址,则 connect() 应将其绑定到一个未使用的本地地址(除非套接字的地址族是 AF_UNIX)。

所以我的问题是,我可以保留我需要的端口,这样操作系统就不会使用它们吗?这可以通过/etc/services 来完成吗?或者有什么不同的方法吗?

答案1

确保内核不会将 49000 和 49001 分发给客户端,因为您希望将它们用于 Linux 上的服务器。

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

把它扔进去/etc/sysctl.conf,然后运行sysctl -p

请注意,这是未经测试的。

参考

答案2

从技术上讲,不存在“保留端口”这样的东西。

在 TCP/UDP 中,“保留”端口的唯一方法是实际上bind()为其建立一个套接字。绑定的端口不会被其他应用程序使用;未使用的端口是未使用的,因此其他应用程序可以自由使用它。

如果您正在编写服务器软件,那么您可以尽早在应用程序代码中将套接字绑定到特定端口。使端口号可配置,或者至少在文档中清楚地说明它们,以便系统管理员可以快速识别冲突并将冲突的应用程序移至单独的服务器。

答案3

其实,上面的答案并不完全准确。 sysctls net.inet.ip.portrange.first 和 net.inet.ip.portrange.last 指定操作系统可以为随机端口分配的端口范围。您需要确保应用程序的保留端口范围不属于这些变量的范围。

看一下 FreeBSD 手册,部分:12.14。调整内核限制。但同样的基本前提也应该适用于 Linux。

相关内容