[英]how can i solve this connection error and typeerror
I am trying to create a simple traceroute app.我正在尝试创建一个简单的 traceroute 应用程序。 I want to save the ip s to rota file.我想将 ip 保存到 rota 文件。 But i am taking errors, i dont know why.但我犯了错误,我不知道为什么。 Errors:错误:
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
My Code:我的代码:
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]))
The error comes because you are slicing addr
object, but it's not iterable so you cannot do it like so.出现错误是因为您正在切片addr
object,但它不可迭代,因此您不能这样做。
In this case, you are setting addr = None
and later you are setting the value inside the try
block.在这种情况下,您将设置addr = None
,稍后您将在try
块内设置值。 If python is not able to perform data, addr = receiver.recvfrom(1024)
(which is the case) it raises an error, but as it's inside the try-except structure, it can continue but addr continues to be set as addr = None
.如果 python 无法执行data, addr = receiver.recvfrom(1024)
(这种情况)它会引发错误,但由于它在 try-except 结构内,它可以继续,但 addr 继续设置为addr = None
。
So you are trying to do None[0]
and as you might know, None
is unsubscriptable.因此,您正在尝试执行None[0]
并且您可能知道, None
是不可订阅的。
So you must do:所以你必须这样做:
# ...
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')
as you don't need to create addr
before.因为您之前不需要创建addr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.