Select模型是WinSocket中最常见的I/O模型。select模型的核心便是select函数,select函数可对多个socket组成的集合的所有操作进行管理。Select函数所原型如下:
int select(int nfds,fd_set FAR *readfds,fd_set FAR * writefds,
fd_set FAR *exceptfds,const struct timeval FAR * timeout);
其中最关键的便是三个fd_set参数,readfds用于检查socket的可读性,包含如下条件的socket集合:
1)有数据可以读入
2)连接已经关闭、重设或中止
3)有新的连接请求到来,可以调用accept函数
writefds用于检查socket的可写性,包含以下条件的socket集合:
1)如果socket跟远程目标刚连接上后(connect()或connectEx())
2)上次发送数据时缓冲区已满,当缓冲区有空闲时,socket会包含到可写集
exceptfds包含错误异常的socket集。
一般情况下,我们只用读集readfds。
使用select模型还会用到以下几个函数:
FD_CLR(s,*set):从set中删除套接字s
FD_ISSET(s,*set):检查s是否set集合的一名成员,
FD_SET(s,*set):将套接字s加入到set集
FD_ZERO(*set):清空set集合。
下面是一个基于select模型的服务器例子,可管理多个客户端连接:
// SelectServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 1688
//Initilize the listen socket
bool InitAndListen(SOCKET &sListen)
{
WSADATA wsaData;
sockaddr_in local;
WORD version=MAKEWORD(2,0);
int ret=WSAStartup(version,&wsaData);
if(ret != 0)
{
prin
使用Select模型实现Socket服务器

本文介绍了基于Select模型的Socket服务器的实现。通过讲解select函数及其参数,展示了如何初始化和监听套接字,以及如何管理多个客户端连接。示例代码中详细阐述了如何处理新连接、读取和响应客户端消息,并在遇到错误时关闭套接字。
最低0.47元/天 解锁文章
9120

被折叠的 条评论
为什么被折叠?



