// Main server function int main(int argc, char *argv[]) { srand( (unsigned)time(NULL) ); srand( rand()*time(NULL) ); StartSignal( ); LOG_THISSERVER = LOG_WORLD_SERVER; InitWinSocket( ); string fileconf = "worldserver.conf"; if(argc>1) { fileconf = argv[1]; } CWorldServer *server = new (nothrow) CWorldServer( fileconf ); if(server==NULL) return -1; pthread_attr_init(&server->at); pthread_attr_setdetachstate(&server->at, PTHREAD_CREATE_JOINABLE); // Connect mysql MYSQL mysql; server->DB = new CDatabase( server->Config.SQLServer.pcServer, server->Config.SQLServer.pcUserName, server->Config.SQLServer.pcPassword, server->Config.SQLServer.pcDatabase, server->Config.SQLServer.pcPort, &mysql ); server->port = server->Config.CharPort; if(server->Config.usethreads) Log( MSG_INFO, "Using Threads" ); // Start server server->port = server->Config.WorldPort; if(server->DB->Connect( )==0) Log( MSG_INFO, "Connected to MySQL server" ); else { delete server; server = NULL; #ifdef _WIN32 system("pause"); #endif return -1; } server->StartServer(); // Close server pthread_attr_destroy(&server->at); server->DB->Disconnect( ); CloseWinSocket( ); StopSignal( ); Log(MSG_INFO, "Cleaning memory, please wait..." ); delete server; server = NULL; return EXIT_SUCCESS; }
// Main server function int main(int argc, char *argv[]) { //LMA: Opening log. LogHandleSp(1); LogDebugPriority(0,true); //LMA: LogDebug won't appear in Logs or screen. srand( (unsigned)time(NULL) ); srand( rand()*time(NULL) ); //LMA: TEST DEACTIVATING ERROR TRAPPING //Uncomment following line to use "console" mode (control+C). //StartSignal( ); LOG_THISSERVER = LOG_WORLD_SERVER; InitWinSocket( ); string fileconf = "worldserver.conf"; if(argc>1) { fileconf = argv[1]; } CWorldServer *server = new (nothrow) CWorldServer( fileconf ); if(server==NULL) return -1; pthread_attr_init(&server->at); pthread_attr_setdetachstate(&server->at, PTHREAD_CREATE_JOINABLE); // Connect mysql MYSQL mysql; server->DB = new CDatabase( server->Config.SQLServer.pcServer, server->Config.SQLServer.pcUserName, server->Config.SQLServer.pcPassword, server->Config.SQLServer.pcDatabase, server->Config.SQLServer.pcPort, &mysql ); server->port = server->Config.CharPort; if(server->Config.usethreads) Log( MSG_INFO, "Using Threads" ); // Start server server->port = server->Config.WorldPort; if(server->DB->Connect( )==0) Log( MSG_INFO, "Connected to MySQL server" ); else { delete server; server = NULL; #ifdef _WIN32 system("pause"); #endif return -1; } server->StartServer(); // Close server pthread_attr_destroy(&server->at); server->DB->Disconnect( ); CloseWinSocket( ); StopSignal( ); Log(MSG_INFO, "Cleaning memory, please wait..." ); delete server; server = NULL; //LMA: closing log. LogHandleSp(0); return EXIT_SUCCESS; }
/* Recv需要多次接收(头+体),并且验证合法性。 因此把资源操作放在外部,而消息提示放在内部 */ int CBinServerPlayTCP::Recv() { int nResult; CUserBridge UserBridge; //防止goto 错误提示 //debug, with select fd_set SetRead; int nTotal = 0; timeval TimeSelect; FD_ZERO(&SetRead); FD_SET(nSocket, &SetRead); TimeSelect.tv_sec=1; TimeSelect.tv_usec=0; nTotal = select(0, &SetRead, NULL, NULL, &TimeSelect); if( SOCKET_ERROR==nTotal ) { printf("Err, CBinServerPlayTCP::Recv(): %d\n", WSAGetLastError()); goto recv_close; } if( nTotal<=0 ) { return 0; } //end debug // //recv head with protocol. reasult: close or err nResult = RecvnTCP(nSocket, BufferRecv, name_msg_protocol::MSG_HEAD_BASE_SIZE); if( nResult<=0 ) { printf("Err, CBinServerPlayTCP::Recv Head Or Close Order:%d\n", WSAGetLastError()); goto recv_close; } MsgBaseHead* pMsgHead = (MsgBaseHead*)BufferRecv; // //check head if( !ProtocolVerify.IsMsgSize(pMsgHead->nSizeOfMsg, 0, 0) || !ProtocolVerify.IsMsgAction(pMsgHead->__nActionOrder) ) { printf("Err, 收到不合法数据包!\n"); goto recv_close; } // //recv content with protocol nResult = RecvnTCP(nSocket, BufferRecv+name_msg_protocol::MSG_HEAD_BASE_SIZE, pMsgHead->nSizeOfMsg-name_msg_protocol::MSG_HEAD_BASE_SIZE); if( nResult<=0 ) { printf("Err, CBinServerPlayTCP::Recv Content:Close a socket:%d\n", WSAGetLastError()); goto recv_close; } InitUserBridge(&UserBridge, nSocket); if( -1==g_WorldServer.ResolveMsg(pMsgHead, &UserBridge) ) { printf("Err, CBinServerPlayTCP::g_WorldServer.ResolveMsg\n"); goto recv_close; } return 0; recv_close: Close(); return -1; }