一、socket.connect卡住
当使用socket.connect连接目标IP和端口的时候,如果连接不上,socket.connect会一直卡在那里,阻塞其它进程的执行。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setblocking(0) try: s.connect(("www.baidu.com", 80)) except Exception as e: print(e)
在这个例子中,如果连接不上百度的80端口,s.connect将一直阻塞在这里,代码将不再向下执行。可以通过为socket设置非阻塞模式来解决此问题。
二、socket.connect 丢失c
在某些情况下,socket.connect连接的时候可能会出现“no route to host”错误或者“connection reset by peer”错误。这一般是由于缺失了TCP的三次握手的其中一次,导致连接无法建立。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.bbc.c", 80))
在这个例子中,在百度网址中,我们将c地址删去,导致无法建立连接。当我们使用上述代码连接时,我们将会看到如下的错误:
socket.gaierror: [Errno 11001] getaddrinfo failed
三、socket.connect 丢失
在某些情况下,socket.connect连接时不会出现任何错误提示或者异常,但是连接却没有建立成功。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.google.com", 80)) print(s.getpeername())
在这个例子中,当我们使用socket.connect连接谷歌网站的时候,并没有抛出任何错误或者异常。但是获取其连接的对端地址时,我们会发现并没有返回任何连接的对端地址。
四、socket.connect默认超时时间
默认情况下,socket.connect的超时时间是永久的,也就是说连接会一直等待直到连接成功或者出现错误。 这可能会导致程序长时间阻塞,不予响应。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) #设置超时时间为5秒 try: s.connect(("www.baidu.com", 80)) except Exception as e: print(e)
在这个例子中,我们使用s.settimeout()方法为socket设置超时时间,如果我们在5秒内没有成功连接到百度的80端口,将会抛出socket.timeout异常。
五、socket.connect模拟超时
如果我们想要模拟一个socket.connect的超时,可以通过在连接前关闭目标端口来实现。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) #设置超时时间为5秒 try: s.connect(("127.0.0.1", 8000)) #先启动一个监听8000端口的socket服务端 except Exception as e: print(e) s.close() #手动关闭socket连接
在这个例子中,我们使用s.connect尝试连接一个不存在的端口,然后手动关闭了连接。这将导致s.connect抛出socket.timeout异常。
六、socket.connect做了哪些事情
socket.connect函数做了两件事情:发送一个数据包(表示需要连接到某个目标IP的某个端口)和等待一个数据包(来自目标IP表示连接是否成功)。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.baidu.com", 80))
在这个例子中,我们使用socket.connect连接百度网站的80端口。当连接成功建立时,socket.connect会返回一个值表示连接已经建立成功。
七、socket.connect超时
当连接的目标IP和端口不可用时,socket.connect将会发生超时。超时的时长取决于系统的超时设置。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) try: s.connect(("www.bing.com", 80)) except socket.error as e: print("Connect error:", e) except socket.timeout as e: print("Connect timeout:", e)
在这个例子中,我们使用socket.connect连接必应网站的80端口,然后手动设置了超时时间为5秒。当连接超过5秒仍然没有建立成功时,socket.connect将会抛出一个socket.timeout异常。
八、socket connection refused
当目标IP和端口正在被占用或者没有被正确配置时,socket.connect将会抛出一个socket.error异常,表示连接被拒绝。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(("127.0.0.1", 9999)) #尝试连接一个不存在的地址 except socket.error as e: print("Connect error:", e)
在这个例子中,我们使用socket.connect尝试连接一个不存在的地址。这将会导致socket.connect抛出一个socket.error异常,表示连接被拒绝。
九、socket connect error
当连接建立失败,socket.connect将会抛出socket.error异常。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(("www.google", 80)) #注意google地址的错误格式 except socket.error as e: print("Connect error:", e)
在这个例子中,我们使用socket.connect连接一个错误的地址。这将导致socket.connect抛出socket.error异常,表示连接建立失败。
十、socket connection reset
when the socket’s peer abruptly closed the connection while the data was still being sent, the recv function ran out of data to return and returned a null bytes object b”.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.google.com", 80)) try: s.sendall(b'GET / HTTP/1.1\r\n\r\n') data = s.recv(1024) except socket.error as e: print("Socket error:", e) else: print(data)
在这个例子中,我们使用socket.connect连接谷歌网站的80端口,然后通过s.sendall方法向服务器发送了一个HTTP请求。但是在数据还没有接收完成之前,服务器主动关闭了连接,这将导致socket.recv()抛出一个socket.error错误,表示连接被强制重置。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/200592.html