我最近在学习python3的套接字编程。当我尝试getservbyport方法来显示mongod的服务名称时,这是一个令人烦恼的小问题。
这是我的代码:
import socket
print(socket.getservbyport(80)) # 'http' returns as expected
print(socket.getservbyport(3306)) # 'mysql' returns as expected
print(socket.getservbyport(27017)) # OSError: port/proto not found
需要确认的是,mongod 同时在另一个终端窗口中的端口 27017 上运行。
MongoDB starting : pid=18791 port=27017 dbpath=/data/db 64-bit host=xxx
那么print(socket.getservbyport(27017))
为什么不返回像僧侣这样的东西呢?
socket.getservbyport()
函数将端口号转换为通常在 IANA(互联网号码分配机构)注册的知名服务。在类 UNIX 系统上,您通常会在纯文本文件中找到已知服务的本地列表:/etc/services
。
getservbyport
映射只是方便查找可以合理预期侦听给定端口的服务。这不会检查当前是否有服务在主动侦听,或者侦听服务是否实际上是预期的服务。
那么
print(socket.getservbyport(27017))
为什么不返回像僧侣这样的东西呢?
这意味着您的/etc/services
文件(或等效文件)没有将端口 27017 与mongod
关联的条目。更具体地说,端口 27017 目前未与 IANA 协议端口号注册管理机构上的mongod
正式关联。
可以将本地条目添加到/etc/services
文件中,但是任何更改都可能在将来的操作系统更新中被覆盖。
例如,如果您编辑/etc/services
并为mongod
添加一个条目,您应该会看到这是 Pythonsocket.getservbyport(27017)
调用的结果:
mongod 27017/tcp # MongoDB
需要确认的是,mongod 同时在另一个终端窗口中的端口 27017 上运行。
对于更全面的端口映射(包括检测侦听端口的正在运行的服务),我会考虑使用python-nmap
.Nmap包含一个nmap-services
文件,其中包含其他公共端口关联,包括MongoDB的几个关联(即MongoDB手册的默认MongoDB端口部分中列出的那些)。默认情况下,Nmap 仅扫描端口和服务子集,因此您必须查看 Nmap 文档,了解根据要扫描的端口和服务范围提供的正确选项组合。