当前位置: 首页 > news >正文

网络编程问题:TCP/UDP 连接异常解决方案

TCP/UDP 连接异常解决方案代码示例

以下是一个基于 Python 的 TCP/UDP 连接异常处理代码示例,涵盖常见的连接异常场景(如超时、连接拒绝、端口占用等),并提供重试机制和日志记录功能。

TCP 连接异常处理
import socket import time import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def tcp_connect_with_retry(host, port, max_retries=3, timeout=5): retry_count = 0 while retry_count < max_retries: try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) sock.connect((host, port)) logger.info(f"TCP connection established to {host}:{port}") return sock except socket.timeout: logger.warning(f"TCP connection timeout (attempt {retry_count + 1})") except ConnectionRefusedError: logger.error(f"Connection refused by {host}:{port}") except socket.error as e: logger.error(f"Socket error: {str(e)}") finally: retry_count += 1 time.sleep(1) raise ConnectionError(f"Failed to establish TCP connection after {max_retries} retries")

https://www.zhihu.com/zvideo/1994260861682997179/
https://www.zhihu.com/zvideo/1994260861682997179
https://www.zhihu.com/zvideo/1994260860697341967/
https://www.zhihu.com/zvideo/1994260860697341967
https://www.zhihu.com/zvideo/1994260857056671243/
https://www.zhihu.com/zvideo/1994260857056671243
https://www.zhihu.com/zvideo/1994260851021071994/
https://www.zhihu.com/zvideo/1994260851021071994
https://www.zhihu.com/zvideo/1994260850433886062/
https://www.zhihu.com/zvideo/1994260850433886062
https://www.zhihu.com/zvideo/1994260847934066912/
https://www.zhihu.com/zvideo/1994260847934066912
https://www.zhihu.com/zvideo/1994260843584570191/
https://www.zhihu.com/zvideo/1994260843584570191
https://www.zhihu.com/zvideo/1994260839423832246/
https://www.zhihu.com/zvideo/1994260839423832246
https://www.zhihu.com/zvideo/1994260838081664990/
https://www.zhihu.com/zvideo/1994260838081664990
https://www.zhihu.com/zvideo/1994260835078529378/
https://www.zhihu.com/zvideo/1994260835078529378
https://www.zhihu.com/zvideo/1994260833497273482/
https://www.zhihu.com/zvideo/1994260833497273482
https://www.zhihu.com/zvideo/1994260832259966840/
https://www.zhihu.com/zvideo/1994260832259966840
https://www.zhihu.com/zvideo/1994260832532583874/
https://www.zhihu.com/zvideo/1994260832532583874
https://www.zhihu.com/zvideo/1994260827105146355/
https://www.zhihu.com/zvideo/1994260827105146355
https://www.zhihu.com/zvideo/1994260823569364542/
https://www.zhihu.com/zvideo/1994260823569364542
https://www.zhihu.com/zvideo/1994260822684356958/
https://www.zhihu.com/zvideo/1994260822684356958
https://www.zhihu.com/zvideo/1994260818049655700/
https://www.zhihu.com/zvideo/1994260818049655700
https://www.zhihu.com/zvideo/1994260817747674698/
https://www.zhihu.com/zvideo/1994260817747674698
https://www.zhihu.com/zvideo/1994260815390463543/
https://www.zhihu.com/zvideo/1994260815390463543
https://www.zhihu.com/zvideo/1994260811632358143/
https://www.zhihu.com/zvideo/1994260811632358143

UDP 连接异常处理
def udp_send_with_retry(host, port, data, max_retries=3, timeout=5): retry_count = 0 while retry_count < max_retries: try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) sock.sendto(data.encode(), (host, port)) logger.info(f"UDP data sent to {host}:{port}") return sock except socket.timeout: logger.warning(f"UDP send timeout (attempt {retry_count + 1})") except socket.error as e: logger.error(f"UDP socket error: {str(e)}") finally: retry_count += 1 time.sleep(1) raise ConnectionError(f"Failed to send UDP data after {max_retries} retries")

https://www.zhihu.com/zvideo/1994266399967815160/
https://www.zhihu.com/zvideo/1994266399967815160
https://www.zhihu.com/zvideo/1994266394804638799/
https://www.zhihu.com/zvideo/1994266394804638799
https://www.zhihu.com/zvideo/1994266393525372736/
https://www.zhihu.com/zvideo/1994266393525372736
https://www.zhihu.com/zvideo/1994266392124466186/
https://www.zhihu.com/zvideo/1994266392124466186
https://www.zhihu.com/zvideo/1994266391612769736/
https://www.zhihu.com/zvideo/1994266391612769736
https://www.zhihu.com/zvideo/1994266391889604666/
https://www.zhihu.com/zvideo/1994266391889604666
https://www.zhihu.com/zvideo/1994266389448504132/
https://www.zhihu.com/zvideo/1994266389448504132
https://www.zhihu.com/zvideo/1994266387447832880/
https://www.zhihu.com/zvideo/1994266387447832880
https://www.zhihu.com/zvideo/1994266387040981461/
https://www.zhihu.com/zvideo/1994266387040981461
https://www.zhihu.com/zvideo/1994266386592199141/
https://www.zhihu.com/zvideo/1994266386592199141
https://www.zhihu.com/zvideo/1994266373937967153/
https://www.zhihu.com/zvideo/1994266373937967153
https://www.zhihu.com/zvideo/1994266375666034264/
https://www.zhihu.com/zvideo/1994266375666034264
https://www.zhihu.com/zvideo/1994266370750301136/
https://www.zhihu.com/zvideo/1994266370750301136
https://www.zhihu.com/zvideo/1994266368053359641/
https://www.zhihu.com/zvideo/1994266368053359641
https://www.zhihu.com/zvideo/1994266368544096292/
https://www.zhihu.com/zvideo/1994266368544096292
https://www.zhihu.com/zvideo/1994266367365490383/
https://www.zhihu.com/zvideo/1994266367365490383
https://www.zhihu.com/zvideo/1994266365352248655/
https://www.zhihu.com/zvideo/1994266365352248655
https://www.zhihu.com/zvideo/1994266364907635656/
https://www.zhihu.com/zvideo/1994266364907635656
https://www.zhihu.com/zvideo/1994266364546942673/
https://www.zhihu.com/zvideo/1994266364546942673
https://www.zhihu.com/zvideo/1994266364588873142/
https://www.zhihu.com/zvideo/1994266364588873142

端口占用检测
def is_port_in_use(port, protocol='tcp'): try: if protocol.lower() == 'tcp': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) else: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('0.0.0.0', port)) sock.close() return False except socket.error: return True
使用示例
if __name__ == "__main__": # TCP 示例 try: tcp_sock = tcp_connect_with_retry("example.com", 80) tcp_sock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n") response = tcp_sock.recv(4096) print(response.decode()) except Exception as e: print(f"TCP error: {str(e)}") # UDP 示例 try: udp_sock = udp_send_with_retry("example.com", 53, "test data") data, addr = udp_sock.recvfrom(1024) print(f"Received UDP data from {addr}: {data.decode()}") except Exception as e: print(f"UDP error: {str(e)}") # 端口检测 print(f"Port 80 in use (TCP): {is_port_in_use(80)}") print(f"Port 53 in use (UDP): {is_port_in_use(53, 'udp')}")
关键功能说明
  • 自动重试机制:通过max_retries参数控制最大重试次数
  • 超时处理:通过timeout参数设置连接/发送超时时间
  • 错误分类处理:区分超时、连接拒绝和其他socket错误
  • 日志记录:使用标准logging模块记录连接状态
  • 端口检测:支持检测TCP/UDP端口占用情况

该代码可通过调整参数适应不同网络环境,建议根据实际需求修改重试策略和超时时间。

http://www.jsqmd.com/news/236497/

相关文章:

  • 2025 年程序员转行方向推荐:避开开发内卷,投身网络安全这类紧缺领域,真的不用焦虑了!
  • 人体姿态估计应用:MediaPipe Pose在医疗中的使用
  • Qwen3-0.6B-FP8:0.6B参数解锁双模智能推理
  • MediaPipe Pose为何选择CPU优化?能效比实测数据揭秘
  • MediaPipe Pose实战:舞蹈动作捕捉系统
  • MediaPipe Pose部署成功率100%?零外部依赖方案实测分享
  • ImageGPT-medium:用像素预测玩转AI图像生成新技巧
  • display driver uninstaller操作指南:从零实现GPU驱动纯净环境
  • AR交互实战:用MediaPipe Hands镜像快速搭建手势控制应用
  • MediaPipe Pose性能测试:CPU环境下毫秒级推理实战
  • 无人机交通监管:基于YOLOv8的电动车违规检测方案
  • YOLOv8鹰眼检测功能测评:CPU版实时性能实测
  • 构建自定义I2C HID设备驱动完整指南
  • AI关键点检测优化:MediaPipe Pose性能测试
  • Kimi-VL-Thinking:2.8B参数实现卓越视觉推理
  • 腾讯混元7B:256K长文本+GQA,中文AI性能实测
  • 【毕业设计】SpringBoot+Vue+MySQL 桂林旅游景点导游平台平台源码+数据库+论文+部署文档
  • ERNIE 4.5-A47B:300B参数MoE模型部署全攻略
  • 舞蹈动作分析实战:MediaPipe镜像实现高精度姿态捕捉
  • MediaPipe姿态识别商业化路径:SaaS产品架构设计思路
  • AI运动康复评估:MediaPipe Pose应用实践
  • MediaPipe Pose高级应用:实时动作捕捉系统
  • 快速理解Keil添加文件对工业HMI开发的意义
  • 前后端分离图书进销存管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • LLaVA-One-Vision 85M多模态训练数据集6大源已完成
  • MediaPipe Pose部署案例:舞蹈动作捕捉系统实现
  • 无人机+YOLOv8:智能交通违规检测完整教程
  • MediaPipe Pose部署案例:运动损伤预防
  • Step-Audio-TTS-3B:SOTA语音合成AI,说唱哼唱新体验
  • 彩虹骨骼效果展示:MediaPipe Hands镜像打造科技感交互