问题描述
编程目的是以winsock2为基础实现一个简易的Web服务器,但在监听退出消息功能上出现了一些问题。主要矛盾在于,SOCKET类型变量创建后默认为阻塞socket,因此使用accept()函数接收客户端连接请求时就会阻塞。但又需要监听服务器本机的退出信号,如果发出退出信号时处理accept的进程处于阻塞状态(事实上大部分时间都是如此),那么就无法退出。此时就需要一个机制来处理这个阻塞状态。
解决方法
我在查阅了一些资料之后了解到可以查看文件状态的select()函数(当前环境中socket被抽象为文件),配合FD_SET()、FD_ISSET()等宏可以在accept()前查看当前处于监听状态的socket是否有可读数据(是否有客户端的连接请求)。几个重要的内容如下所示:
fd_set
struct fd_set{
u_int fd_vount;
SOCKET fd_array[FD_SETSIZE];
};
文件集结构体,用于存放多个文件句柄
FD_SET
void FD_SET( fd, set);
实际上是个宏定义,功能是把 fd 添加到文件集 set 中
FD_ISSET
int FD( int fd, fd_set *fdset