Testing socket connection in Python

匿名 (未验证) 提交于 2019-12-03 03:04:01

问题:

This question will expand on: Best way to open a socket in Python
When opening a socket how can I test to see if it has been established, and that it did not timeout, or generally fail.

Edit: I tried this:

try:     s.connect((address, '80')) except:     alert('failed' + address, 'down') 

but the alert function is called even when that connection should have worked.

回答1:

It seems that you catch not the exception you wanna catch out there :)

if the s is a socket.socket() object, then the right way to call .connect would be:

import socket s = socket.socket() address = '127.0.0.1' port = 80  # port number is a number, not string try:     s.connect((address, port))      # originally, it was      # except Exception, e:      # but this syntax is not supported anymore.  except Exception as e:      print("something's wrong with %s:%d. Exception is %s" % (address, port, e)) finally:     s.close() 

Always try to see what kind of exception is what you're catching in a try-except loop.

You can check what types of exceptions in a socket module represent what kind of errors (timeout, unable to resolve address, etc) and make separate except statement for each one of them - this way you'll be able to react differently for different kind of problems.



回答2:

You can use the function connect_ex. It doesn't throw an exception. Instead of that, returns a C style integer value (referred to as errno in C):

s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = s.connect_ex((host, port)) s.close() if result:     print "problem with socket!" else:     print "everything it's ok!" 


回答3:

You should really post:

  1. The complete source code of your example
  2. The actual result of it, not a summary

Here is my code, which works:

import socket, sys  def alert(msg):     print >>sys.stderr, msg     sys.exit(1)  (family, socktype, proto, garbage, address) = \          socket.getaddrinfo("::1", "http")[0] # Use only the first tuple s = socket.socket(family, socktype, proto)  try:     s.connect(address)  except Exception, e:     alert("Something's wrong with %s. Exception type is %s" % (address, e)) 

When the server listens, I get nothing (this is normal), when it doesn't, I get the expected message:

Something's wrong with ('::1', 80, 0, 0). Exception type is (111, 'Connection refused') 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!