|
1. 引言
多路复用I/O模型(select)是UNIX/LINUX用得的最多的一种I/O模型,在Windows下也
可做为一种同步I/O使用。本文给出该I/O模型处理多Client的简单(在主线程中)实现。
2. 关于select
select I/O模型是一种异步I/O模型,在单线程中Linux/WinNT默认支持64个客户端套
接字。这种I/O模型主要涉及以下几个函数及宏:
int select(…)、FD_ZERO、FD_SET、FD_ISSET以及FD_SETSIZE。
3. 用select开发一个Server
3.1 只支持单个Client
// 相关初始化处理, 创建监听套接字
listen(listensock, 5);
clientsock = accept(listensock, NULL, NULL);
for (; ;)
{
FD_ZERO(&readfds);
FD_SET(clientsock, &readfds);
nResult = select(
0, // Windows中这个参数忽略,Linux中在此处为1
readfds, // 可读套接字集合
……
)
if (nResult = = SOCKET_ERROR)
return –1;
// 判断cliensock是否处于待读状态
if (FD_ISSET(clientsock, &readfds))
{ // 相关处理
}
}
其实Winsock中的WSAEventSelect模型是与之类似的。
3.2 在单线程中支持63个Client
SOCKET clientsockarray[FD_SETSIZE – 1]; // FD_SETSIZE is 64
// 相关初始化处理, 创建监听套接字
listen(listensock, 5);
// 初始化套接字数组
InitSock(clientsockarray);
FD_ZERO(&readfds);
FD_SET(listensock, &readfds);
for (; ;)
{
nRet = select(0, &readfds, NULL, NULL, NULL);
// 判断监听套接字是否可读
if (FD_ISSET(listensock, &readfds))
{
clientsock = accept(listensock, NULL, NULL);
// 将客户套接字放到套接字数组中
if (!InsertSock(clientsockarray, clientsock))
{
printf("客户端超过了63个,此次连接被拒绝.\n");
closesocket(clientsock);
continue;
}
}
// 逐个处理处于待决状态的套接字
[1] [2] [3] 下一页 |