一个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;
相关文章推荐
- 一个支持tcp多客户端连接的例子,轻松认识linux select函数的基本原理和使用方法
- 一个使用递归函数的例子
- 使用委托数组的一个例子简介一下委托
- 在MFC下使用OpenGL的一个简单的例子
- 使用Hibernate的一个完整例子
- 使用PBDOM读取XML的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 一个DirectX使用的例子
- 使用Hibernate的一个完整例子
- Linux下,使用C/C++编写"静态链接库"的一个简单例子
- web.config文件自定义配置节的使用方法的一个简单例子
- 一个使用HashMap的Struts例子~~
- 一个使用自定义命名空间的Schema文件,xml文件和castor生成的java代码的例子
- 通过一个简单的例子,介绍如何使用LDAP(转)
- 使用Hibernate来实现持久对象 (Hibernate的一个例子)
- 使用JAVAMAIL发邮件的一个例子(转)
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 一个使用spring的最简单的例子。
- 在网页中使用 Agent 地一个例子