winsock2 服务器端编程,accept()与实时监听退出信号出现矛盾的解决方法

本文介绍了在使用Winsock2编程实现Web服务器时,遇到accept()函数阻塞导致无法监听退出信号的问题。通过引入select()函数配合FD_SET和FD_ISSET宏,可以在accept()之前检查是否有新的连接请求,从而避免阻塞并能正确响应退出信号。文中还探讨了使用fcntl()设置无阻塞套接字的可能性及其潜在问题。
摘要由CSDN通过智能技术生成
问题描述

编程目的是以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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值