[英]recvfrom() not receiving any data - python
我正在編寫一個簡單的程序,以獲取從計算機到任意站點(在本例中為www.google.com)的跳數。
我的程序似乎卡在了recvfrom()調用上。 我將其設置為非阻塞套接字,因此能夠看到錯誤:
[WinError 10035] A non-blocking socket operation could not be completed immediately
當我將其作為阻塞套接字運行時,該程序將永遠運行。
下面是我的源代碼。 知道為什么我會遇到這個問題嗎? 謝謝!
import socket
import select
import queue
def main(dest_name):
print('launch')
dest_addr = socket.gethostbyname(dest_name)
# Define UDP and ICMP
udp = socket.getprotobyname('udp')
icmp = socket.getprotobyname('icmp')
timer = 0
port = 54321
maxHops = 40
while True:
# Create sender and receiver. Sender uses UDP, receiver uses IDMP
sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
receiver = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
receiver.setblocking(0)
print('sockets assigned')
# Assign TTL to sender, increment TTL
sender.setsockopt(socket.SOL_IP, socket.IP_TTL, timer)
print('ttl assigned')
# Bind socket and send message from sender to receiver
receiver.setblocking(0)
receiver.bind(("", port))
print('receiver bound')
sender.sendto(bytes("", 'UTF-8'), (dest_name, port))
print('sent')
addr = None
print('addr assigned')
try:
# Reads an array of 512-byte sized blocks from sender into addr
(_,addr) = receiver.recvfrom(512)
addr = addr[0]
print("%f\n", addr)
# Process socket errors
except socket.error as exc:
print('Error: please try again.\n')
print('%s\n', exc)
pass
# Close both sockets
finally:
sender.close()
receiver.close()
print('closing')
timer += 1
if dest_addr == addr or timer == maxHops:
break
if __name__ == "__main__":
main('www.google.com')
那個怎么樣 :
#!/usr/bin/python
import socket
def main(dest_name):
dest_addr = socket.gethostbyname(dest_name)
port = 54321
max_hops = 40
icmp = socket.getprotobyname('icmp')
udp = socket.getprotobyname('udp')
ttl = 1
while True:
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
recv_socket.bind(("", port))
send_socket.sendto("", (dest_name, port))
curr_addr = None
curr_name = None
try:
_, curr_addr = recv_socket.recvfrom(512)
curr_addr = curr_addr[0]
try:
curr_name = socket.gethostbyaddr(curr_addr)[0]
except socket.error:
curr_name = curr_addr
except socket.error:
pass
finally:
send_socket.close()
recv_socket.close()
if curr_addr is not None:
curr_host = "%s (%s)" % (curr_name, curr_addr)
else:
curr_host = "*"
print "%d\t%s" % (ttl, curr_host)
ttl += 1
if curr_addr == dest_addr or ttl > max_hops:
break
if __name__ == "__main__":
main('google.com')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.