一个select函数使用的例子

一个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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值