python - 我该如何解决这个连接错误和类型错误
问题描述
我正在尝试创建一个简单的 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]))
解决方案
出现错误是因为您正在切片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
之前创建。
推荐阅读
- python - 查看 csv 文件的各种条件
- android - 改造挂起函数引发一般错误
- sql - 查询两个表之间的日志和访问
- java - 同时使用 Java 1.7 和 1.8
- javascript - 如何解释 vue.js 中 console.log() 的这种奇怪行为?
- shell - 无法回显变量值
- zend-framework - Zend 框架 OR 运算符使用
- python - 如果日期字符串具有不同的格式,则在 python 中将字符串转换为日期
- visual-studio-code - VS Code:替换内置变量launch.json中的字符
- python - 写入函数中的线程 Thread-10 错误,TypeError:write() 参数必须是 str,而不是字节