首页 > 解决方案 > 我该如何解决这个连接错误和类型错误

问题描述

我正在尝试创建一个简单的 traceroute 应用程序。我想将 ip 保存到 rota 文件。但我犯了错误,我不知道为什么。错误:

connection error
Traceback (most recent call last):
  File "rota.py", line 30, in <module>
    f.write('\n' + str(addr[0]))
TypeError: 'NoneType' object is not subscriptable

我的代码:

import sys
import socket

dst = sys.argv[1]
dst_ip = socket.gethostbyname(dst)
port = 42424
ttl = 1
max_hop = 30
f = open('rota.txt','w')
timeout = 0.2

while True:

    receiver = socket.socket(family=socket.AF_INET,type=socket.SOCK_RAW,proto=socket.IPPROTO_ICMP)
    receiver.settimeout(timeout)
    receiver.bind(('',port))

    sender = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM,proto=socket.IPPROTO_UDP)
    sender.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
    sender.sendto(b'',(dst,port))

    addr = None

    try:
        data , addr = receiver.recvfrom(1024)
    except socket.error:
        print('connection error')

    f.write('\n' + str(addr[0]))

标签: pythonsocketstraceroute

解决方案


出现错误是因为您正在切片addr对象,但它不可迭代,因此您不能这样做。

在这种情况下,您正在设置addr = None,稍后您正在设置try块内的值。如果 python 无法执行data , addr = receiver.recvfrom(1024)(就是这种情况),它会引发错误,但由于它位于 try-except 结构内,它可以继续,但 addr 继续设置为addr = None.

因此,您正在尝试这样做None[0],并且您可能知道,None它是不可订阅的。

所以你必须这样做:

# ...

sender.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
sender.sendto(b'',(dst,port))

try:
    data , addr = receiver.recvfrom(1024)
    f.write('\n' + str(addr[0]))
except socket.error:
    print('connection error')

因为您不需要addr之前创建。


推荐阅读