Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 575|回复: 0

Socket 套接字编程

[复制链接]

253

主题

362

帖子

2426

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2426
发表于 2024-12-3 23:43:24 | 显示全部楼层 |阅读模式
《主流程, 服务端:》

  1. import socket
  2. from multiprocessing import Pool
  3. serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP
复制代码

AF_INET: 是ipv4网络协议的套接字类型,广泛用于ipv4套接字编程之中。
PF_INET: 和上者是等价的,取值一样用途一样,只是出现在早期Linux中。(BSD中使用AF_INET)

socket.SOCK_STREAM指的是TCP协议,即流式协议
socket.SOCK_DGRAM指的是UDP协议,即数据报协议


问题《一》:
有的时候当我们重启服务端的时候,可能会报告:
  1. Traceback (most recent call last):
  2.   File "服务端.py", line 9, in <module>
  3.     socket_server.bind(("172.17.100.52", 6930))
  4. socket.error: [Errno 98] Address already in use
复制代码

这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法)
解决方法:
加入一条socket配置,重用ip和端口

  1. socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2. socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  3. socket_server.bind(("172.17.100.52", 6930))
复制代码

《主流程, 服务端:》
  1. serverSocket.bind((dicConnectStr['url'], dicConnectStr['port']))
复制代码
  1. serverSocket.listen(5)  # TCP协议中半链接池的数量,可同时挂起5个链接。
复制代码
这里listen(5)设置半连接池监听的数量,超过后排队。
  1. pool = Pool()  # if processes number is 5, it can not add dynamic. So leave it null.
  2. conn = socket.socket()  # 初始化一个conn替身,如果try失败,可以回收该变量。
  3.         try:
  4.                 while True:
  5.                         # 有一个客户端连上来了:(server.accept)
  6.                         conn, addr = serverSocket.accept()                           
  7.                         pool.apply_async(talk, (conn, addr))  # async talk to client , conn/addr is arguments.

  8.         except (KeyboardInterrupt,Exception) as err:
  9.                 print(repr(Exception), repr(err))
  10.                 raise
  11.         finally:
  12.                 conn.close()  # 这里是Try while根本没有进入(没成功),这里将socket.socket()直接析构。
  13.                 pool.close()  # 关闭进程池
  14.                 pool.join()  # 回收进程池
  15.                 serverSocket.close()
复制代码


参考:https://blog.csdn.net/a2011480169/article/details/73602708




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-14 22:36 , Processed in 0.015981 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表