I'm writing a simple program to get the number of hops from my machine to an arbitrary site (in this case, www.google.com.
My program seems to get stuck on the recvfrom() call. I've set it to be a non-blocking socket, so I'm able to see the error:
[WinError 10035] A non-blocking socket operation could not be completed immediately
When I run it as a blocking socket, the program simply runs forever.
Below is my source code. Any idea why I'm running into this issue? Thanks!
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')