void MakeDirectory( CxString strDir ) { if ( strDir.Right(1) == _T("\\") ) strDir = strDir.Left(strDir.GetLength()-1); if ( GetFileAttributes(strDir) != -1 ) return; DWORD dwErr = GetLastError(); if ( !((dwErr == ERROR_PATH_NOT_FOUND) || (dwErr == ERROR_FILE_NOT_FOUND)) ) return; int nFound = strDir.ReverseFind( _T('\\') ); MakeDirectory( strDir.Left(nFound) ); ::CreateDirectory( strDir, NULL ); }
unsigned int __stdcall CxServerSocketTCP::WorkerThread( LPVOID lpParam ) { char * pRecvBuffer = NULL; ServerThreadContext* pContext = (ServerThreadContext*) lpParam; CxServerSocketTCP *pThis = (CxServerSocketTCP *)pContext->pThis; XTRACE( _T("Starting thread [%p]0x%x\r\n"), pContext, pContext->hThread ); if ( !pContext->bListen ) pThis->OnClientConnected( pContext, pContext->strClientIP, pContext->nClientPort ); const int nRecvBufferSize = pThis->m_nMaxRecvBufferSize; if ( !(pRecvBuffer = (char *)xmalloc(nRecvBufferSize)) ) return 0; int nEventIndex; WSANETWORKEVENTS hNetworkEvents; BOOL bWork = TRUE; while ( bWork ) { nEventIndex = WSAWaitForMultipleEvents( 2, pContext->hNetEvent, FALSE, 500, FALSE ); nEventIndex -= WSA_WAIT_EVENT_0; for ( int ix=nEventIndex ; ix<2 ; ix++ ) { nEventIndex = WSAWaitForMultipleEvents( 1, &pContext->hNetEvent[ix], TRUE, 0, FALSE ); if ( (nEventIndex == WSA_WAIT_FAILED ) ) continue; else if ( (nEventIndex==WSA_WAIT_TIMEOUT) ) { } else { if ( ix == 1 ) { WSAEnumNetworkEvents( pContext->hSocket, pContext->hNetEvent[1], &hNetworkEvents ); if ( hNetworkEvents.lNetworkEvents & FD_READ ) { if ( hNetworkEvents.iErrorCode[FD_READ_BIT] != 0 ) { XTRACE( _T("Socket Read Error![%p]\r\n"), pContext ); break; } int nRecvBytes = recv( pContext->hSocket, pRecvBuffer, nRecvBufferSize, 0 ); if ( nRecvBytes > 0 ) { //XTRACE( _T("%d bytes received!\r\n"), nRecvBytes ); pThis->ProcessBuffer( pContext, pRecvBuffer, nRecvBytes ); } else { char szBye[3] = { 0, }; send( pContext->hSocket, szBye, 3, 0 ); shutdown( pContext->hSocket, SD_BOTH ); closesocket( pContext->hSocket ); XTRACE( _T("Closed socket handle [%p]%x\r\n"), pContext, pContext->hSocket ); pContext->hSocket = INVALID_SOCKET; if ( pContext->bListen ) pThis->OnStopServer(); else { pThis->OnClientDisconnected( pContext->strClientIP, pContext->nClientPort ); bWork = FALSE; } } } if ( hNetworkEvents.lNetworkEvents & FD_ACCEPT ) { if ( hNetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0 ) { XTRACE( _T("[%p] Accept Error!\r\n"), pContext ); } SOCKADDR_IN addrinClient; int nAddrSize = sizeof(SOCKADDR_IN); SOCKET hClientSocket = ::accept( pContext->hSocket, reinterpret_cast<struct sockaddr *>(&addrinClient), &nAddrSize ); if ( hClientSocket == INVALID_SOCKET ) { XTRACE( _T("[%p] accept() failed: %d\r\n"), pContext, WSAGetLastError() ); bWork = FALSE; break; } int nRet; int nMaxSendBufferSize = MAX_SEND_BUF_SIZE; int nMaxRecvBufferSize = MAX_RECV_BUF_SIZE; nRet = ::setsockopt( hClientSocket, SOL_SOCKET, SO_SNDBUF, (const char*)&nMaxSendBufferSize, sizeof(int) ); nRet = ::setsockopt( hClientSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&nMaxRecvBufferSize, sizeof(int) ); int nLen = sizeof(int); nRet = ::getsockopt( hClientSocket, SOL_SOCKET, SO_SNDBUF, (char*)&nMaxSendBufferSize, &nLen ); nLen = sizeof(int); nRet = ::getsockopt( hClientSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nMaxRecvBufferSize, &nLen ); CxString strClientIP; int nPort; TCHAR szClientAddr[50]={0,}; DWORD dwSize = sizeof(szClientAddr); SOCKADDR* pClientSockAddr = (SOCKADDR*)&addrinClient; CxString strClientSockAddr; if ( WSAAddressToString( pClientSockAddr, sizeof(SOCKADDR), NULL, szClientAddr, &dwSize) != SOCKET_ERROR ) { strClientSockAddr = szClientAddr; } int nColonPos = strClientSockAddr.ReverseFind( _T(':') ); strClientIP = strClientSockAddr.Left( nColonPos ); strClientSockAddr.Delete( 0, nColonPos+1 ); nPort = _tcstol(strClientSockAddr, NULL, 10); ServerThreadContext* pThreadContext = new ServerThreadContext; pThreadContext->hSocket = hClientSocket; pThreadContext->hThread = NULL; pThreadContext->pThis = pThis; pThreadContext->hNetEvent[0] = pThis->m_hCleanupEvent; pThreadContext->hNetEvent[1] = WSA_INVALID_EVENT; pThreadContext->IoBuffer.Create( pThis->GetIOBufferSize() ); pThreadContext->IoBuffer.Clear(); pThreadContext->bListen = FALSE; pThreadContext->strClientIP = strClientIP; pThreadContext->nClientPort = nPort; pThreadContext->dwUserData = 0; pThreadContext->hNetEvent[1] = WSACreateEvent(); if ( WSAEventSelect( pThreadContext->hSocket, pThreadContext->hNetEvent[1], FD_READ|FD_CLOSE ) == SOCKET_ERROR ) { XTRACE( _T("WSAEventSelect() error\r\n") ); break; } unsigned int nThreadID = 0; pThreadContext->hThread = (HANDLE)::_beginthreadex( NULL, 0, WorkerThread, pThreadContext, 0, &nThreadID ); if ( pThreadContext->hThread == NULL ) { delete pThreadContext; break; } CloseHandle( pThreadContext->hThread ); } if ( hNetworkEvents.lNetworkEvents & FD_CLOSE ) // ¿¬°á Á¾·á { if ( hNetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0 ) { XTRACE( _T("Abnormal closed...!!!\r\n") ); } else { WSACloseEvent( pContext->hNetEvent[1] ); pContext->hNetEvent[1] = WSA_INVALID_EVENT; } char szBye[3] = { 0, }; send( pContext->hSocket, szBye, 3, 0 ); shutdown( pContext->hSocket, SD_BOTH ); closesocket( pContext->hSocket ); XTRACE( _T("Closed socket handle [%p]%x\r\n"), pContext, pContext->hSocket ); pContext->hSocket = INVALID_SOCKET; if ( pContext->bListen ) pThis->OnStopServer(); else { pThis->OnClientDisconnected( pContext->strClientIP, pContext->nClientPort ); bWork = FALSE; } break; } } else { bWork = FALSE; break; } } } } if ( pRecvBuffer ) xfree(pRecvBuffer); XTRACE( _T("Exit thread [%p]0x%x\r\n"), pContext, pContext->hThread ); if ( !pContext->bListen ) { delete pContext; } _endthreadex(0); return 0; }
void CAtkisSatz :: Lesen( long num_parser_calls, const char *txt ) { short i, n; CString satz = txt; CxString teil; // Initialisierung der Variablen n = m_Linien.GetSize(); for ( i = 0; i < n; i++ ) delete (CLinie*)m_Linien[i]; m_Linien.RemoveAll(); n = m_Objekte.GetSize(); for ( i = 0; i < n; i++ ) delete (CEDBSObjekt*)m_Objekte[i]; m_Objekte.RemoveAll(); n = m_Infos.GetSize(); for ( i = 0; i < n; i++ ) delete (CInfo*)m_Infos[i]; m_Infos.RemoveAll(); m_bObjektDaten = FALSE; m_bAttrSatz = FALSE; m_bGueltig = FALSE; // Gueltigkeit testen if ( satz.IsEmpty() || ( satz.GetLength() < 4 )) return; // Anfangskennung teil = satz.Left( 4 ); if ( teil == "FEIN" ) m_eStart = FEIN; else if ( teil == "BSPE" ) m_eStart = BSPE; else if ( teil == "AKND" ) m_eStart = AKND; else if ( teil == "AEND" ) m_eStart = AEND; else if ( teil == "BKRT" ) m_eStart = BKRT; else if ( teil == "BINF" ) m_eStart = BINF; else if ( teil == "FAEN" ) m_eStart = FAEN; else if ( teil == "FLOE" ) m_eStart = FLOE; else if ( teil == "FALG" ) m_eStart = FALG; satz = satz.Mid( 4 ); // Kennung überlesen teil = satz.Left( 6 ); m_lEDBSSatzNummer = teil.Long(); m_lNumParserCalls = num_parser_calls; satz = satz.Mid( 6 ); // sechsstellige Satznummer überlesen if ( satz[0] == ' ' ) m_bKomplett = TRUE; else if ( satz[0] == 'E' ) m_bKomplett = TRUE; else m_bKomplett = FALSE; // Fortsetzungskennung ausgewertet satz = satz.Mid( 2 ); // Int4 wegschlucken satz = satz.Mid( 4 ); teil = satz.Left( 8 ); satz = satz.Mid( 8 ); // Satztyp if ( teil == "ULOBNN " ) m_eTyp = ULOBNN; else if ( teil == "ULTANN " ) m_eTyp = ULTANN; else if ( teil == "ULQA0000" ) m_eTyp = ULQA0000; else if ( teil == "IBENKRT " ) m_eTyp = IBENKRT; else if ( teil == "ULOTEX " ) m_eTyp = ULOTEX; else if ( teil == "ULBENFOL" ) m_eTyp = ULBENFOL; else if ( teil == "ULBENGEO" ) m_eTyp = ULBENGEO; else if ( teil == "ULBENOBJ" ) m_eTyp = ULBENOBJ; else if ( teil == "ULPUNN " ) m_eTyp = ULPUNN; else if (teil == "DLOB2005") m_eTyp = DLOB2005; else if ( teil.Left(3) == "ULO" ) m_eTyp = ULOALK; m_strBuffer += satz; if ( Komplett()) { switch ( Start()) { case AKND: AnfangsSatz( m_strBuffer ); break; case AEND: EndeSatz( m_strBuffer ); break; case FEIN: case BSPE: DatenSatz( m_strBuffer ); break; case FLOE: LoeschSatz(m_strBuffer); // #HK001106 break; } m_strBuffer.Empty(); } }