我正在尝试创建一个简单的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]))
答案 0 :(得分:0)
出现错误是因为您要对addr
对象进行切片,但是它不是可迭代的,因此您不能这样做。
在这种情况下,您要设置addr = None
,然后再在try
块内设置值。如果python无法执行data , addr = receiver.recvfrom(1024)
(是这种情况),则会引发错误,但由于它位于try-except结构内部,因此可以继续执行,但是addr继续设置为addr = None
。 / p>
因此,您正在尝试做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
。