项目中很少会使用阻塞接收,一般都是select+read监听模式来实现非阻塞接收。
使用selece时,需要处理一些异常情况的返回,比如:系统中断产生EINTR错误;超时错误ETIMEDOUT。
使用read时,需要处理读取时可能出现的错误,比如:对方关闭连接(ECONNRESET),连接被拒绝(ECONNREFUSED),文件描述符错误(EBADF)等
下面以libmodbus中receive_msg函数为例,总结select+read的处理步骤,其中有对modbus协议处理的步骤(2、7、8、9),如果不关心modbu协议可忽略这些步骤。
1、函数返回值说明:
等待服务器的响应或客户端的请求。如果没有应答这个函数将会阻塞(超时);
如果接收uint8_t的消息数组成功,将会返回接收字符的个数,否则将会返回-1,并且errno将会被置为如下值:
- ECONNRESET:对方复位连接
- EMBBADDATA:无效数据
- ETIMEDOUT:超时
- read()和recv()函数的错误码
static int receive_msg(