socket的read timeout是咋实现的
之前有回答从操作系统内核层面给出了一种实现方式,不过这不是唯一的一种方式。(另外 SO_RCVTIMEO 似乎是在 2.6 版本之后的内核中实现的)
socket 有阻塞和非阻塞两种,阅读 SO_RCVTIMEO 文档(Linux / Windows)可以知道,设置 socket 选项 SO_RCVTIMEO 应该是适用于阻塞的 socket。对于非阻塞的 socket,可以通过 select 来实现 read timeout。
在 Python 中,它的 socket 的 read timeout 就是使用 select 来实现的。当我们通过 socket.settimeout 接口给 socket 设置超时时,Python 会把(阻塞的)socket 转换成 nonblocking,然后通过 select 来检测 socket 操作(比如 connect/read/write)是否完成,在 socket 操作完成后,又把 socket 变成 blocking。
【socket的read timeout是咋实现的】 相关源码:
Python socket.settimeoutPython socket read/connect/write with select
■网友
linux下用SO_RCVTIMEO这个socket option来设置read timeout。可以看一下内核怎么处理的。设置时,超时存在sk_rcvtimeo里,代码见Linux/net/core/sock.ccase SO_RCVTIMEO: ret = sock_set_timeout(\u0026amp;sk-\u0026gt;sk_rcvtimeo, optval, optlen); break;再看看read的时候怎么处理的,以UDP为例,read的代码最终会调用到__skb_recv_datagram这个函数,代码见Linux/net/core/datagram.c。然后里面调用了wait_for_more_packets, 代码见Linux/net/core/datagram.c。大概读一下就知道怎么实现的了。
推荐阅读
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 使用算法帮助人们筛选reader的信息是否存在可能
- 菜鸟学习,求教ServerSocket和Socket的问题
- linux主机之间的进程间通信和主机内部的进程间通信的socket有啥区别
- readfree.me 是否涉及侵权
- c++有何技术可以实现cs架构,比如socket
- 怎样量化和评估一个典型的socket消耗了哪些硬件资源
- LuaSocket这套网络库在稳定性上咋样是在客户端使用。
- 用eclipse创建的ServerSocket服务器,用流输出html代码到浏览器,浏览器无法解析
- Python-Flask-SocketIO后台线程推送时这种业务模型该怎样取舍
