select 模型

void CSockTcp::OnRunThreadProc()
{

    if(InitTcp())
    {
        

        fd_set fdsocket; 

        FD_ZERO(&fdsocket);
        FD_SET(m_sockListen, &fdsocket);

        timeval tv;
        tv.tv_sec=0;
        tv.tv_usec=1000; // 等待5秒

        char szbuf[MAX_BUFFER_SIZE] = {0};

        while(m_bThreadRunFlag)
        {
            fd_set fdread = fdsocket;

            int ret = select(0, &fdread, NULL, NULL, &tv);

            if(0==ret) // timeout
            {
                continue;
            }

            if(ret > 0)
            {
                for(int i=0; i<fdsocket.fd_count; i++)
                {
                    if(FD_ISSET(fdsocket.fd_array[i], &fdread)) 
                    {
                        if(fdsocket.fd_array[i] == m_sockListen) 
                        {
                            if(fdsocket.fd_count < FD_SETSIZE)
                            {
                                SOCKADDR_IN addrRemote;
                                int len = sizeof(SOCKADDR_IN);

                                SOCKET sockClient = ::accept(fdsocket.fd_array[i], (SOCKADDR*)&addrRemote, &len);
                                FD_SET(sockClient, &fdsocket);
                            }
                            else
                            {
                                m_logSys.LogOut("连接数超过最大值!");
                                continue;
                            }
                        } // if
                        else
                        {
                            // 接受数据
                            ZeroMemory(szbuf,MAX_BUFFER_SIZE);
                            int nRecv= recv(fdsocket.fd_array[i], szbuf, MAX_BUFFER_SIZE, 0);

                            if(nRecv > 0)
                            {
                               // 
                               szbuf[nRecv]='\n';
                               m_logRun.LogOut(szbuf);
                           
                            }

                            if(nRecv == 0 || ( (nRecv == SOCKET_ERROR) && WSAGetLastError() == WSAECONNRESET ))
                            {
                                ::closesocket(fdsocket.fd_array[i]);
                                FD_CLR(fdsocket.fd_array[i], &fdsocket);
                            }
                        }
                    }
                }
            }// if
        }//while

        FD_ZERO(&fdsocket);

       

        if(INVALID_SOCKET != m_sockListen)
        {
            ::closesocket(m_sockListen);
            m_sockListen=INVALID_SOCKET;
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值