socket.connect详细阐述

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-05 20:01
下一篇 2024-12-05 20:01

相关推荐

  • Python中使用socket传输图片

    本文将从多个方面介绍如何使用Python中的socket模块传输图片,涉及到准备工作、发送方部分和接收方部分的详细代码实现。 一、准备工作 在使用Python中的socket模块进…

    编程 2025-04-28
  • Taro使用Connect实现数据流管理

    本文将详细介绍如何使用Taro和Connect,实现数据流管理,便于开发人员在创建React应用时维护它们的数据流。Connect是Redux提供的一个应用于React组件的辅助工…

    编程 2025-04-28
  • Python Socket阻塞问题的解析

    本文将从多个方面对Python socket阻塞问题进行详细阐述,包括阻塞的原因、影响、解决方法等等。 一、阻塞的原因 阻塞是指在等待某个事件的过程中,该进程无法处理其他任务,直到…

    编程 2025-04-27
  • C# Socket关闭后客户端仍可连接的解决方法

    对于C# Socket通信中的一些问题,多数人可能已经熟知,但是有些问题仍然困扰着一部分人,例如Socket关闭后,客户端仍然可以连接。本篇文章将在此问题为中心,围绕该问题的原因和…

    编程 2025-04-27
  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25

发表回复

登录后才能评论