Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复socket.timeout和接收数据_Python_Sockets_Udp_Icmp_Traceroute - Fatal编程技术网

Python 如何修复socket.timeout和接收数据

Python 如何修复socket.timeout和接收数据,python,sockets,udp,icmp,traceroute,Python,Sockets,Udp,Icmp,Traceroute,我不久前写了那个程序,现在它停止工作了。每次我运行它都会说“超时”。当我将超时设置得更高(例如,设置为10秒)时,也会发生此错误 导入系统 导入套接字 def跟踪路由(目的地址,最大跳数=30,超时=0.2): proto_icmp=socket.getprotobyname('icmp')) proto_udp=socket.getprotobyname('udp') 端口=33434 对于范围内的ttl(1,最大跳数+1): rx=socket.socket(socket.AF_INET、s

我不久前写了那个程序,现在它停止工作了。每次我运行它都会说“超时”。当我将超时设置得更高(例如,设置为10秒)时,也会发生此错误

导入系统 导入套接字 def跟踪路由(目的地址,最大跳数=30,超时=0.2): proto_icmp=socket.getprotobyname('icmp')) proto_udp=socket.getprotobyname('udp') 端口=33434 对于范围内的ttl(1,最大跳数+1): rx=socket.socket(socket.AF_INET、socket.SOCK_RAW、proto_icmp) rx.settimeout(超时) rx.bind(('',端口)) tx=socket.socket(socket.AF_INET、socket.SOCK_DGRAM、proto_udp) tx.setsockopt(socket.SOL_IP,socket.IP_TTL,TTL) 发送到(字节(“”,'utf-8'),(目的地址,端口)) 尝试: 数据,curr_addr=rx.recvfrom(512) 当前地址=当前地址[0] 除了socket.error作为错误: 打印(错误) 当前地址=无 最后: rx.close() 关闭 收益率货币地址 如果(当前地址==目的地址): 打破 如果名称=“\uuuuu main\uuuuuuuu”: dest_name=“www.google.de” dest\u addr=socket.gethostbyname(dest\u name) 打印(“跟踪路由到%s(%s)”%(目的地名称,目的地地址)) 对于枚举中的i,v(跟踪路由(dest_addr)): 打印(“%d\t%s”%(i+1,v))
大概您的计算机和谷歌之间的某个路由器没有发送您的代码无条件等待的ICMP“主机不可访问”消息

你发布的代码非常“脆弱”,它在互联网上会以奇怪而奇妙的方式被破坏。例如,在发送UDP数据包后,您立即“等待”一个ICMP消息,但是如果中间的路由器在TTL期满时悄悄地丢弃数据包,那么您可能还会得到一个UDP包(如果端口恰好是打开的)或者没有返回。
我建议使用(或)同时处理多个(即UDP和ICMP)套接字的等待,或者您可以使用异步库跟踪所有内容

为了解决我的问题,我使用scapy库而不是更多套接字来修复它。如果你愿意,我可以在这里发表。