c - 即使连接被对等套接字终止,选择也会返回成功
问题描述
我无法理解 select 系统调用的使用。根据选择文档,选择将在超时或套接字准备好进行 I/O 操作后返回。这是什么意思socket is ready for I/O operation
?
received_len = 0
do {
/* There is only one fd in readfds */
rv = select(fd+1, &readfds, NULL, NULL, timeout)
if (rv < 0){
/*socket select failed.*/
break
}else if (rv == 0){
/*socket timeout.*/
break
}else
/* Go for reading */
readbytes = read(fd, (buf + received_len), (expected_len - received_len))
if (readbytes < 0)
{
/*read fail*/
break
}
received_len += readbytes;
}while(received_len < expected_len)
我虽然选择会在对等套接字连接关闭时超时。但是在关闭对等连接后,选择返回 1 并且读取发生在套接字上。然后 read 调用返回 0 (这基本上意味着对等端终止)。我认为 select 会超时,因为套接字还没有准备好进行读取操作,但这并没有发生。
解决方案
从您在问题中引用的文档中
读取文件
监视此集中的文件描述符以查看它们是否已准备好读取。如果读取操作不会阻塞,则文件描述符已准备好读取;特别是,文件描述符在文件结束时也已准备好。
推荐阅读
- sql-server - 防止从 SSMS 导出文件中的行受影响的条目
- zsh - 如何更改powerlevel9k的提示颜色
- python - 列表中整数的成对比较
- java - Retrofit2 + RxJava2 全局处理错误
- kubernetes - Kubernetes kubectl bash 使用别名完成
- python - 如何匹配按空格分割的城市名称?
- c# - C#:如何从存储过程中在 ComboBox 中添加 2 个值
- javascript - 在多个文件中组织 firebase 函数 | 部署错误
- python - 在 Python 3.7 环境中使用 manim 为 pycairo 构建轮子失败
- node.js - GraphQL 将值显示为空