2017-03-25 43 views
0

我學習socket編程在python3最近顯示的mongod服務。當我嘗試使用getservbyport方法來顯示mongod的服務名稱時,這裏有一個小問題。嘗試了getservbyport在python3

這裏是我的代碼:

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))返回類似的mongod?

回答

1

socket.getservbyport()功能轉換端口號通常與IANA(互聯網編號分配機構)註冊的知名服務。在類UNIX系統上,您通常會以純文本文件的形式找到已知服務的本地列表:/etc/services

getservbyport映射只是一個方便查找什麼樣的服務可能合理預計將收聽給定的端口。這並不檢查當前是否有服務正在主動偵聽,或者如果偵聽服務實際上是預期的服務。

那麼爲什麼print(socket.getservbyport(27017))不會返回類似mongod的東西?

這意味着您的/etc/services文件(或同等文件)沒有關聯端口27017與mongod的條目。更具體地說,端口27017目前不在IANA protocol port number registry上與mongod正式關聯。

是可能的本地條目添加到您的/etc/services文件,但是任何改變都可能在未來的O/S的更新將被覆蓋。

例如,如果您編輯/etc/services並添加一個條目爲mongod,你應該可以看到這個返回的Python socket.getservbyport(27017)調用的結果:

mongod   27017/tcp # MongoDB 

待確認,該mongod的在端口上運行27017在另一個終端窗口中同時進行。

對於更全面的端口映射(包括監聽端口上運行的服務的偵測),我會考慮使用python-nmap。 Nmap包含一個nmap-services文件,其中包含多個用於MongoDB的附加通用端口關聯(即MongoDB手冊的Default MongoDB Port部分中列出的關聯關係)。 Nmap默認只掃描端口和服務的子集,因此您必須根據您希望掃描的端口和服務的範圍,檢查Nmap文檔是否提供正確的選項組合。