⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obmain.cxx

📁 Windows CE 6.0 Server 源码
💻 CXX
📖 第 1 页 / 共 5 页
字号:
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (ecode=%d)! -- retrying(%d/%d)\n", WSAGetLastError(), i, SOCKET_CREATION_ATTEMPTS));
            Sleep(1000);
        }
            
    }
    
    if (sl == INVALID_SOCKET) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)!\n", WSAGetLastError()));
        return FALSE;
    }

    if (af == AF_BT) {
        SOCKADDR_BTH sa;
        memset (&sa, 0, sizeof(sa));
        sa.addressFamily = AF_BT;
        sa.port             = 0;

        if (bind (sl, (sockaddr *)&sa, sizeof(sa))) {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: bind failed (error=%d)!\n", WSAGetLastError()));
            closesocket (sl);
             return FALSE;
        }

        int namelen = sizeof(SOCKADDR_BTH);
        if (getsockname(sl, (SOCKADDR *)&sa, &namelen))    {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: getsockname failed (error=%d)!\n", WSAGetLastError()));
            closesocket(sl);
            return FALSE;
        }

        SVSUTIL_ASSERT(sa.port);
        uiSDPRecordHandleCnt = MAX_NUM_STP_RECS;
        
        if (ERROR_SUCCESS != obutil_RegisterPort((unsigned char)sa.port, &SDPRecordHandle[0], &uiSDPRecordHandleCnt) ) {
            IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: failed to register port with SDP\n"));
            closesocket(sl);
            return FALSE;
        }
    } else {
        SVSUTIL_ASSERT (0);
        closesocket (sl);
        return FALSE;
    }

    if (listen (sl, 5)) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start::Listen failed (error=%d)!\n", WSAGetLastError()));
        closesocket (sl);
        return FALSE;
    }

    ++cSockets;

    if (! hThread)
        hThread = CreateThread (NULL, 0, ThreadListen, (void *)this, 0, NULL);

    if (! hThread) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start failed to create thread (error=0x%08x (%d))\n", GetLastError(), GetLastError ()));
        closesocket (sl);
        return FALSE;
    }
    

    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Start - successfully started af %d\n", af));
    
    return TRUE;
}

int AddressFamily::Start (int af, char *szServiceName) {
    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_MAINTAIN, L"[OBEX] GlobalData::Start :: IRDA\n"));

    SVSUTIL_ASSERT (gpState->IsLocked ());

    SVSUTIL_ASSERT (cSockets < OBEX_MAXPORTS);

    addFam[cSockets] = af;
    SOCKET sl;

    for(int i=0; i < SOCKET_CREATION_ATTEMPTS; i++) {
        sl = aSocket[cSockets] = socket (af, SOCK_STREAM, 0);

        if(sl != INVALID_SOCKET)
            break;
        else {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)! -- retrying(%d/%d)\n", WSAGetLastError(), i, SOCKET_CREATION_ATTEMPTS));
            Sleep(1000);
        }
            
    }
    

    if (sl == INVALID_SOCKET) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)!\n", WSAGetLastError()));
        return FALSE;
    }

    if (af == AF_IRDA) {
        SOCKADDR_IRDA sa;

        memset(&sa, 0, sizeof(SOCKADDR_IRDA));
        sa.irdaAddressFamily      = AF_IRDA;
        
        if(strlen(szServiceName) + 1 > sizeof(sa.irdaServiceName))
        {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AF_IRDA: name too long! (%s)\n", szServiceName));
            closesocket (sl);
            return FALSE;
        }
        
        strcpy (sa.irdaServiceName, szServiceName);
    
        if (bind (sl, (const struct sockaddr *)&sa, sizeof(sa))) {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AF_IRDA: bind failed (error=%d)!\n", WSAGetLastError()));
            closesocket (sl);
             return FALSE;
        }

    } else {
        SVSUTIL_ASSERT (0);
        closesocket (sl);
        return FALSE;
    }

    if (listen (sl, 5)) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start::Listen failed (error=%d)!\n", WSAGetLastError()));
        closesocket (sl);
        return FALSE;
    }
    
    ++cSockets;

    if (! hThread)
        hThread = CreateThread (NULL, 0, ThreadListen, (void *)this, 0, NULL);

    if (! hThread) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start failed to create thread (error=0x%08x (%d))\n", GetLastError(), GetLastError ()));
        closesocket (sl);
        --cSockets;
        return FALSE;
    }
    
    
    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Start - successfully started af %d\n", af));
    
    return TRUE;
}

int AddressFamily::Stop (void) {
    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Stop\n"));

    SVSUTIL_ASSERT (gpState->IsLocked ());
    for (int i = 0 ; i < cSockets ; ++i)
        closesocket (aSocket[i]);
    cSockets = 0;

    return TRUE;
}

int AddressFamily::IsDown (void) {
    if (! hThread)
        return TRUE;

    if (WAIT_TIMEOUT == WaitForSingleObject (hThread, 1000))
        return FALSE;

    return TRUE;
}

void AddressFamily::Listen (void) {

    //
    //  If gpState isnt here, we have to quit!
    //
    if(!gpState) {
        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Listen -- no GLOBAL STATE!\n"));
        return;
    }

    
    
    SOCKET sockarray[FD_SETSIZE];
    int l_cSockets = 0;
    int l_cAccepts = 0;

    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Listen\n"));

    for ( ; ; ) 
    {
        gpState->Lock ();

        if (gpState->fState != RUNNING) {
            gpState->Unlock ();
            break;
        }

        //
        //    This is here so this is not accessed without a lock...
        //
        l_cSockets = l_cAccepts = cSockets;
        Connection *pConn = gpState->pconnList;
        while (pConn) {
            if (pConn->paf == this)
                ++l_cSockets;
            pConn = pConn->pNext;
        }

        int iSocket = 0;
        if (cSockets > FD_SETSIZE)    {    // Do not accept any more...
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_WARNINGS, L"[OBEX] Listen: too many sockets - some connections will not be served: %d sockets\n", l_cSockets));
            l_cAccepts = 0;
        } else {                        // Copy 
            iSocket = cSockets;
            memcpy (sockarray, aSocket, sizeof(SOCKET) * cSockets);
        }

        pConn = gpState->pconnList;
        while (pConn) {
            if (pConn->paf == this)
                sockarray[iSocket++] = pConn->s;

            if (iSocket >= FD_SETSIZE)
                break;

            pConn = pConn->pNext;
        }

        gpState->Unlock ();


        SVSUTIL_ASSERT (! gpState->IsLocked ());

        FD_SET fd;
        FD_ZERO (&fd);
        for (int i = 0 ; i < l_cSockets ; ++i)
            FD_SET(sockarray[i], &fd);

        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen thread reenters select %d accept %d read\n", l_cAccepts, l_cSockets - l_cAccepts));

        if (SOCKET_ERROR == select (0, &fd, NULL, NULL, NULL)) {
            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Listen: select failed - %d\n", WSAGetLastError ()));
            continue;
        }


        if (gpState->fState != RUNNING)
            break;

        int fExit = FALSE;

        for (i = 0 ; (i < l_cSockets) && (! fExit) ; ++i) {
            if (obutil_PollSocket (sockarray[i]) == 1) {
                if (i < l_cAccepts) {    // This is an accept call
                    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen : incoming connection on %s at index %d\n", (addFam[i] == PF_INET || addFam[i] == PF_INET6) ? L"TCP/IP" : ((addFam[i] == AF_IRDA) ? L"IRDA" : L"Bluetooth"),i));

                    union {
                        SOCKADDR_STORAGE      sa_in;
                        SOCKADDR_IRDA         sa_irda;
                        SOCKADDR_BTH          sa_bth;
                        SOCKADDR              sa;
                    } sa;

                    int addrlen = 0;

                                        
                    if (addFam[i] == PF_INET || addFam[i] == PF_INET6)
                        addrlen = sizeof (SOCKADDR_STORAGE);
                    else if (addFam[i] == AF_IRDA)
                        addrlen = sizeof(SOCKADDR_IRDA);
                    else if (addFam[i] == AF_BT)
                        addrlen = sizeof(SOCKADDR_BTH);
                    

                    SVSUTIL_ASSERT (addrlen);

                    SOCKET s = accept (sockarray[i], &sa.sa, &addrlen);
    
                    if (s != INVALID_SOCKET) {
                        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Accepted connection\n"));
                
                        gpState->Lock ();

                        if (gpState->fState != RUNNING) {
                            closesocket (s);
                            gpState->Unlock ();
                            fExit = TRUE;
                            break;
                        }

                        //
                        //    This is a new connection.
                        //
                        pConn = (Connection *)svsutil_GetFixed (gpState->pfmdConnections);
                        if (pConn) {
                            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen: added new connection for socket %d\n", s));
                            pConn->s = s;
                            pConn->addFam = addFam[i];
                            pConn->paf = this;
                            pConn->uiCurrentTransaction = 0;
                            pConn->uiConnectionId = OBEX_INVALID_CID;
                            pConn->pNext = gpState->pconnList;
                            pConn->tickLastActive = GetTickCount ();
                            pConn->pBuffer = NULL;
                            pConn->cBufSize = pConn->cFilled = 0;
                            pConn->cPeekFilled = 0;
                            gpState->pconnList = pConn;

                            gpState->SetMaintain();
                        } else {
                            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] Listen: failed to allocate structure for incoming connection (OOM)\n"));
                            closesocket (s);
                        }
                        gpState->Unlock ();
                    } else
                        IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen incoming connection failed to materialize\n"));

                    continue;
                }

        
                //
                //    Got a packet... do a RECV...
                //
                gpState->Lock ();
                if (gpState->fState != RUNNING) {
                    gpState->Unlock ();
                    break;
                }

                pConn = gpState->pconnList;
                while (pConn) {
                    if ((pConn->paf == this) && (pConn->s == sockarray[i]))
                        break;

                    pConn = pConn->pNext;
                }

                
                if (! pConn) {                    
                    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Listen packet on %s : nonexistent connection\n", (pConn->addFam == PF_INET || pConn->addFam == PF_INET6) ? L"TCP/IP" : ((pConn->addFam == AF_IRDA) ? L"IRDA" : L"Bluetooth")));
                    gpState->Unlock ();
                    continue;
                }

                IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen got some data on %s at index %d\n", (pConn->addFam == PF_INET || pConn->addFam == PF_INET6) ? L"TCP/IP" : ((pConn->addFam == AF_IRDA) ? L"IRDA" : L"Bluetooth"),i));

                int ires;

                if (pConn->uiCurrentTransaction) {            
                    IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"Listen: received data for connection currently in transaction 0x%08x\n", pConn->uiCurrentTransaction));
                    gpState->CloseConnection (pConn);
                    gpState->Unlock ();
                    continue;
                }

                pConn->tickLastActive = GetTickCount ();

                if (! pConn->pBuffer) {
                    ires = recv (pConn->s, (char *)pConn->ucPeekBuff + pConn->cPeekFilled, sizeof(pConn->ucPeekBuff) - pConn->cPeekFilled, 0);

                    if (ires <= 0) {
#if defined (DEBUG) || defined (_DEBUG)
                        if (ires == 0)
                            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Listen: connection %d closed at the request of the client\n", pConn->s));
                        else if (ires < 0)
                            IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Listen: connection %d closed because of socket error %d (RECV returns %d)\n", pConn->s, WSAGetLastError (), ires));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -