On Sun, 5 Nov 2017 02:31 am, brandon wallace wrote: > > I have this code that tests a server to see if it is listening on port 123 > runs and evaluates to True every time. Even if the server does not exist but > it is not supposed to do that. I am getting no error message at all. What is > going on with this code?
You're returning a string in both cases. Both strings evaluate as true when treated as bools. Success: > return "Port 53 is reachable on: %s" % host Failure: > except socket.error as e: > return "Error on connect: %s" % e > > check_udp(hostname, port) That's the first bug. The second bug is that I don't think the code does what you think it does. You seem to be calling it with a single hostname, presumably a string. But then you split the hostname into individual letters, and try to connect to each of them. The *first* attempt either succeeds or fails, and then returns. So if you call check_udp("mailserver", 143), your function calls for host in "mailserver": try: s.connect((host, port_num)) which attempts to connect to ("m", 143). That will either succeed (probably not), or fail (probably this), and then the function returns a string, which you apparently never look at. I suggest you re-write your check_udp function to something more like this: def check_udp(host, port_num): '''Test the UDP port on a remove server.''' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect((host, port_num)) return True except socket.error as e: return False But even this is suspicious, since it is vulnerable to a "Time Of Check To Time Of Use" bug. Just because you can connect to the host *now*, when you call check_udp, doesn't mean it will still respond two seconds later (or even two milliseconds later) when you attempt to connect again. -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list