select从不超时。返回1 。FD_ISSET返回1.但无数据。rcv返回值为0

时间:2022-03-19 18:29:47
IBM的 AIX 操作系统。。

select从不超时。返回1 。FD_ISSET返回1.但无数据。rcv返回值为0


1   超时 绝对设置了。每次吐一遍日志。。绝对的。

2. 无数据 居然返回了!!!。select返回 1 。。FD_ISSET 返回 1.但是rcv是 0

求大神。。拯救。。真的找不到问题了。。

2 个解决方案

#1


select经常会出错的点有如下3点:
1、select函数中的read_fdsr和write_fdsr,其值在调用完select之后会被函数改写,所以下次再调select需要重新赋值
2、第1个参数,为最大socket fd + 1
3、出错ret<0,超时ret=0,如果出错需要判断errno是否为EINTR(是否被未知信号中断过)。

对于linux系统,对于recv函数如果返回0,表示接收数据时,网络中断,这个时候会有SIGPIPE信号产生。所以可以写个信号处理函数,看是否能拦截到信号SIGPIPE

#2


引用 1 楼 beginning1126 的回复:
select经常会出错的点有如下3点:
1、select函数中的read_fdsr和write_fdsr,其值在调用完select之后会被函数改写,所以下次再调select需要重新赋值
2、第1个参数,为最大socket fd + 1
3、出错ret<0,超时ret=0,如果出错需要判断errno是否为EINTR(是否被未知信号中断过)。

对于linux系统,对于recv函数如果返回0,表示接收数据时,网络中断,这个时候会有SIGPIPE信号产生。所以可以写个信号处理函数,看是否能拦截到信号SIGPIPE


直接 结贴了。 不得不说。linux和 UNIX 研究得越细,使用得越多,你才能发现,他们差别 太大。

unix的 select不太一样。连接关闭时,select是返回 成功的!!
linux是 返回失败。我太相信自己的经验了。反而忽略了 系统 差别。man一下 。看明白了。

#1


select经常会出错的点有如下3点:
1、select函数中的read_fdsr和write_fdsr,其值在调用完select之后会被函数改写,所以下次再调select需要重新赋值
2、第1个参数,为最大socket fd + 1
3、出错ret<0,超时ret=0,如果出错需要判断errno是否为EINTR(是否被未知信号中断过)。

对于linux系统,对于recv函数如果返回0,表示接收数据时,网络中断,这个时候会有SIGPIPE信号产生。所以可以写个信号处理函数,看是否能拦截到信号SIGPIPE

#2


引用 1 楼 beginning1126 的回复:
select经常会出错的点有如下3点:
1、select函数中的read_fdsr和write_fdsr,其值在调用完select之后会被函数改写,所以下次再调select需要重新赋值
2、第1个参数,为最大socket fd + 1
3、出错ret<0,超时ret=0,如果出错需要判断errno是否为EINTR(是否被未知信号中断过)。

对于linux系统,对于recv函数如果返回0,表示接收数据时,网络中断,这个时候会有SIGPIPE信号产生。所以可以写个信号处理函数,看是否能拦截到信号SIGPIPE


直接 结贴了。 不得不说。linux和 UNIX 研究得越细,使用得越多,你才能发现,他们差别 太大。

unix的 select不太一样。连接关闭时,select是返回 成功的!!
linux是 返回失败。我太相信自己的经验了。反而忽略了 系统 差别。man一下 。看明白了。