您的位置:首页 > 理论基础 > 计算机网络

一个select函数使用的例子

2017-01-17 21:59 218 查看
一个select函数使用的例子:(代码抄自《UNIX网络编程》P141),for循环嵌套很深,例子很垃圾,好像还有一个bug,此处仅做记录代码使用。

int main(int argc, char **argv)
{
INT iConfd = 0;
INT iReadLen = 0;
INT iMaxFd = 0;
INT iMaxIndex = -1;
INT iClientfd[BUF_LEN_16];
INT iIndex = 0;
INT iReady = 0;
fd_set stAllFdset;
fd_set stRfdSet;
CHAR szBuf[BUF_LEN_256] = {0,};

/* 注册信号 */
(VOID)reg_sigal(abnomalExit);

/* 初始化 */
process_init();

/* 创建服务器 */
if(ERROR_SUCCESS != sock_CreateServer(SERVER_PORT, &g_iListenSocket))
{
printf("create server failed.\n");
return -1;
}
iMaxFd = g_iListenSocket;
for(iIndex = 0; iIndex<BUF_LEN_16; iIndex++)
{
iClientfd[iIndex] = -1;
}
FD_ZERO(&stAllFdset);
FD_SET(g_iListenSocket, &stAllFdset);
for(;;)
{
stRfdSet = stAllFdset;
iReady = select(iMaxFd + 1, &stRfdSet, NULL, NULL, NULL);
if(FD_ISSET(g_iListenSocket, &stRfdSet))
{
iConfd = accept(g_iListenSocket, NULL, NULL);
for(iIndex = 0;iIndex<BUF_LEN_16;++iIndex)
{
if(iClientfd[iIndex]<0)
{
iClientfd[iIndex] = iConfd;
break;		/* 跳出内层循环 */
}
}
if (iIndex == BUF_LEN_16)
{
printf("too many client.\n");
break; /* 跳出外层循环 */
}
/* 将链接socket加入监听 */
FD_SET(iConfd, &stRfdSet);
if(iConfd > iMaxFd)
{
iMaxFd = iConfd;
}
if(iIndex>iMaxIndex)
{
iMaxIndex = iIndex;
}
if(--iReady < 0)
{
continue;
}
}
for(iIndex = 0;iIndex <= iMaxIndex; ++iIndex)
{
if(iClientfd[iIndex] < 0)
{
continue;
}
/* 以下bug,如果客户端两次发送, */
if(FD_ISSET(iClientfd[iIndex], &stRfdSet))
{
if(0 == (iReadLen = read(iClientfd[iIndex], szBuf, BUF_LEN_256)))
{
close(iClientfd[iIndex]);
FD_CLR(iClientfd[iIndex], &stAllFdset);
iClientfd[iIndex] = -1;
}
else
{
printf("%s\n",szBuf);
write(iClientfd[iIndex], szBuf, iReadLen);
}
if(--iReady<=0)
{
break;
}
}
}
}

return 0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程