为什么TCP服务器的监听套接字要设置为非阻塞

  • 我们一般使用IO复用来实现并发模型,如果我们默认监听套接字为阻塞模式,假设一种场景如下:
    • 客户通过connect向TCP服务器发起三次握手
    • 三次握手完成后,触发TCP服务器监听套接字的可读事件,IO复用返回(select、poll、epoll_wait)
    • 客户通过RST报文取消连接
    • TCP服务器调用accept接受连接,此时发现内核已连接队列为空(因为唯一的连接已被客户端取消)
    • 程序阻塞在accept调用,无法响应其它已连接套接字的事件
  • 为了防止出现上面的场景,我们需要把监听套接字设置为非阻塞
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Python中的套接字编程是指利用Python提供的socket模块实现的网络通信功能。通过使用socket模块,可以创建网络套接字设置套接字选项,绑定套接字到特定的IP地址和端口号,以及进行网络数据的发送和接收。 在Python中,可以通过以下步骤实现套接字编程: 1. 导入socket模块:使用`import socket`语句将socket模块导入到程序中。 2. 创建套接字对象:使用`socket.socket()`函数创建一个套接字对象。 3. 设置套接字选项:使用`setsockopt()`函数设置套接字选项,例如设置套接字非阻塞模式。 4. 绑定IP地址和端口号:使用`bind()`函数将套接字绑定到指定的IP地址和端口号。 5. 监听连接请求:使用`listen()`函数开始监听连接请求。 6. 接受连接请求:使用`accept()`函数接受客户端的连接请求,并返回一个新的套接字对象,用于与客户端进行通信。 7. 发送和接收数据:使用`send()`和`recv()`函数进行数据的发送和接收。 以下是一段简单的Python套接字编程代码示例,用于创建一个TCP服务器并接受客户端的连接请求: ```python import socket # 创建一个TCP服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8000)) # 监听连接请求 server_socket.listen(5) print('Waiting for connection...') while True: # 接受客户端的连接请求 client_socket, addr = server_socket.accept() print('Connected by', addr) # 发送数据到客户端 client_socket.sendall(b'Hello, world!') # 接收客户端发送的数据 data = client_socket.recv(1024) print('Received', repr(data)) # 关闭客户端套接字 client_socket.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值