poll函数
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds:监听的文件描述符【数组】
struct pollfd {
int fd:待监听的文件描述符
short events:待监听的文件描述符对应的监听事件
取值:POLLIN、POLLOUT、POLLERR
short revents: 传入时, 给0。如果满足对应事件的话, 返回 非0 --> POLLIN、POLLOUT、POLLERR
}
nfds: 监听数组的实际有效监听个数。
timeout: > 0: 超时时长。单位:毫秒。
-1: 阻塞等待
0: 不阻塞
返回值:返回满足对应监听事件的文件描述符总个数。
优点:
自带数组结构。 可以将监听事件集合和返回事件集合分离。
拓展监听上限。 超出 1024限制。
缺点:
不能跨平台。 Linux
无法直接定位满足监听事件的文件描述符, 编码难度较大。
read 函数返回值说明
> 0: 实际读到的字节数
=0: socket中,表示对端关闭。close()
-1:如果 errno == EINTR 被异常终端。 需要重启。
如果 errno == EAGIN 或 EWOULDBLOCK 以非阻塞方式读数据,但是没有数据。需要再次读。
如果 errno == ECONNRESET 说明连接被重置。需要 close(),移除监听队列。
错误。
在实际的使用中,更多的是使用epoll模型。