我正在开发一个软件,外部软件可以使用它,这个外部软件可以使用我使用的端口,我希望能够保存一系列端口,仅供我的软件和外部软件使用时要使用它,他们会收到错误。
是否有任何系统调用告诉内核为我的应用程序保存端口范围?
答案 0 :(得分:1)
一旦您的应用程序启动,您可以打开端口并绑定它们,没有理由再保留它们。 在应用程序启动之前,您无法使用任何系统调用。
系统管理员可以在linux上执行类似
的操作# echo 30000 31000 > /proc/sys/net/ipv4/ip_local_port_range
这意味着内核在随机分配端口号时仅使用该范围的端口。还有一个sysctl也可以随身携带。理论上,您可以为您的应用程序保留端口64000-65000,并告诉您的软件运行的机器的管理员使用
# echo 1024 64000 > /proc/sys/net/ipv4/ip_local_port_range
在启动过程的早期某个地方。
但是,我强烈建议不要这样做 - 任何至少有一点经验的系统管理员都会告诉你让你的软件正常运行。这种依赖会使管理变得混乱,如果您尝试在一台计算机上使用需要不同端口范围的多个不同软件包,那么您将完全失败。
您可以做的最好的事情是在运行任何外部程序之前打开并绑定要保留的每个端口的套接字。
顺便说一句,我曾经在一个在启动阶段早期安装NFS目录的机器上遇到过类似的问题,这个机器有时会在本地使用端口993和995,从而阻止了pop3d和imapd的ssl版本启动。我解决了这个问题,编写了一个绑定到这些端口的小程序,甚至在NFS执行任何操作之前启动该程序,并在pop3d和imapd的启动脚本中再次杀死它。如果其他软件在您的程序启动之前使用您的端口,也许这样的事情也可能是您的解决方案。但同样,我认为这是一个邪恶的黑客,而不是一个写得很好的软件应该依赖的东西。