最近在写socket通信,因为要用到多个通信实体故采用select+非阻塞模式,现将一些测试结果记录在此
客户端:
客户端在connect之前把套接字设置成非租塞模式,调用connect的时候显示:Operation now in progress,
此时无法判断connect成功还是失败,
(1)成功:
将sockfd 加入select可读集合监控,当connect连接成功时,select是不会返回的,只有当有数据可读select 才会返回;
将sockfd 加入select可写集合监控,当connect连接成功时,select会返回,
(2)失败
将sockfd 加入select可读集合监控,当connect连接失败时 select会返回,
将sockfd 加入select可写集合监控,当connect连接失败时 select会返回,
鉴于connect情况连接成功但是不会返回的局限性,选择加入select的写集合,
下边针对写集合的select 的返回值做一些处理
当检测到写集合返回后如果有数据发送 则调用send,若send返回大于0;表明connect 成功,若send返回-1切 错误码不是EAGAIN;说明连接失败此时关闭sockfd;错误原因暂且不表;
此时也可以尝试recv;如果返回大于0 则表明connect成功切读到数据,如error == EAGAIN 表示connect 成功但是无数据可读,其余错误码表示connect 失败,此时应该关闭sockfd
服务器:
创建socket 后设置套接字为非租塞,调用accept 返回大于0 表示有客户端连上, 返回值为-1 切 errno == EAGAIN 表示无客户端连接,其余别的错误码当做错误处理
新连接的 fd 也要设置为非租塞