當前位置: 首頁>>代碼示例>>C++>>正文


C++ CSession::Mask方法代碼示例

本文整理匯總了C++中CSession::Mask方法的典型用法代碼示例。如果您正苦於以下問題:C++ CSession::Mask方法的具體用法?C++ CSession::Mask怎麽用?C++ CSession::Mask使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在CSession的用法示例。


在下文中一共展示了CSession::Mask方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。

示例1: int

        void		Dispatch( double timeout ){
            m_endTime	= (timeout < 0.0) ? -1.0 : (GetTime() + timeout);
            m_doClear	= false;
            m_inWork	= true;

            while( SESSIONS::Size() > 0 )
            {
                fd_set	inFd, outFd, excFd;
                FD_ZERO(&inFd);
                FD_ZERO(&outFd);
                FD_ZERO(&excFd);

                int	maxFd	= -1;

                CSession* pSession	= NULL;

                pSession	= SESSIONS::Begin();
                while( SESSIONS::hasNext() )
                {
                    int	fd	= int(pSession->GetSocket().GetHandle());

                    if( pSession->Mask() & ReadableEvent )
                        FD_SET(fd, &inFd);

                    if( pSession->Mask() & WritableEvent )
                        FD_SET(fd, &outFd);

                    if( pSession->Mask() & Exception	 )
                        FD_SET(fd, &excFd);

                    if( pSession->Mask() && (fd > maxFd) )
                        maxFd	= fd;

                    pSession	= SESSIONS::Next();
                }


                int	nEvents;
                if( timeout < 0.0 )
                {
                    nEvents		= select(maxFd+1, &inFd, &outFd, &excFd, NULL);
                }
                else
                {
                    struct timeval	tv;
                    tv.tv_sec	= (int)floor( timeout );
                    tv.tv_usec	= (int)floor( 1000000.0 * (timeout - floor(timeout)) ) % 1000000;
                    nEvents		= select(maxFd+1, &inFd, &outFd, &excFd, &tv);
                }

                if( 0 > nEvents )
                {
                    m_inWork	= false;
                    return;
                }

                pSession	= SESSIONS::Begin();
                while( SESSIONS::hasNext() )
                {
                    int	fd	= int(pSession->GetSocket().GetHandle());
                    DWORD	dwMask	= (DWORD)(-1);

                    if( fd <= maxFd )
                    {
                        if( FD_ISSET(fd, &inFd) )
                            dwMask	&=	pSession->HandleEvent( ReadableEvent );

                        if( FD_ISSET(fd, &outFd) )
                            dwMask	&=	pSession->HandleEvent( WritableEvent );

                        if( FD_ISSET(fd, &excFd) )
                            dwMask	&=	pSession->HandleEvent( Exception );

                        if( !dwMask )
                        {
                            SESSIONS::Delete( *pSession );
                        }
                        else
                        {
                            pSession->Mask( dwMask );
                        }
                    }

                    pSession	= SESSIONS::Next();
                }


                // 
                if( m_doClear )
                {
                /*
                    SessionList	closeList = m_SessionList;
                    m_SessionList.clear();

                    SessionList::iterator	it = closeList.begin();
                    for( ; it!=closeList.end(); it++ ){
                        it->GetSocket().Close();
                    }
                */
                    SESSIONS::DeleteAll();
//.........這裏部分代碼省略.........
開發者ID:H2-T23,項目名稱:garage,代碼行數:101,代碼來源:ExampleMultiplexing.cpp


注:本文中的CSession::Mask方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。