我使用socket模块编写了一个python脚本,该模块提供了getservbyport,用于根据端口号参数检索服务名称。
我使用了以下代码:
import socket
socket.getservbyport(443) # 'https'
但是对于某些端口号,我收到以下错误:
socket.getservbyport(675)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
socket.getservbyport(675)
OSError: port/proto not found
有人可以向我解释为什么我会收到此错误吗?
我还想列出服务及其匹配端口,因此我使用 try
和 except
方法消除了错误,如以下代码:
for i in range(0,65536,1):
try:
print(i,"Runs, service:",socket.getservbyport(i))
except:
continue
我正在获取具有服务的端口,但我想在端口号之前列出序列号。由于我使用了except
方法,因此消除了错误,因此我无法对它们进行编号。
当在该端口上找不到服务时,将引发错误OSError: port/proto not found
。因此,如果您遍历所有可能的端口,您几乎肯定会收到该错误。捕获错误是正确的方法。
若要实现所需的内容,请使用单独的计数器来跟踪找到的服务数:
counter = 1
for i in range(0, 65536):
try:
service = socket.getservbyport(i)
print(counter, " port nr ", i, " runs service ", service)
counter += 1
except:
continue
或者,如果您希望在其他地方获取服务数据,请将服务按顺序存储在数组中,如下所示:
services = []
for i in range(0, 65536):
service = None
try:
service = socket.getservbyport(i)
except:
pass
if service is not None:
services += [{'service': service, 'port': i}]
for idx, s in enumerate(services):
print(idx, " port nr ", s['port'], " runs service ", s['service'])
你可以解决 OSError: port/proto not found
通过像这样添加 TCP 协议
import socket
print(socket.getservbyport(22, "tcp"))