簡體   English   中英

我該如何解決這個連接錯誤和類型錯誤

[英]how can i solve this connection error and typeerror

我正在嘗試創建一個簡單的 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 object,但它不可迭代,因此您不能這樣做。

在這種情況下,您將設置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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM