python - 操作系统错误: port/proto not found in for loop

标签 python sockets for-loop network-programming

我使用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 find。因此,如果您迭代所有可能的端口,那么您几乎肯定会遇到该错误。捕获错误是正确的方法。

要实现您的需求,请使用单独的计数器来跟踪找到的服务数量:

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'])

关于python - 操作系统错误: port/proto not found in for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644773/

相关文章:

python - 为什么字符串会导致整个 pandas DataFrame 成为非数字?

python - 如何在创建后更改 matplotlib LineCollection 的偏移量

python - 玛雅Python : Renaming object with for loops

algorithm - 这个嵌套 for 循环的运行时间是多少?

javascript - 使用for循环使用整数序列填充数组,而不会导致Chrome崩溃

python - 如何解释 ML 训练输出

python - 向装饰器添加参数会删除 cls 参数

java - 为什么 DataoutputStream 和 BufferedWriter 创建顺序很重要?

c# - 发送大量消息时出现 SocketException(代码 10048)

JAVA通过网络发送Scribble