static void * clientInput(void *data) { svcInfoPtr psvc = (svcInfoPtr)data; Log("clientInput Thread started(%d)\n", psvc->sock); struct sockaddr_in addr; socklen_t addrlen = sizeof(struct sockaddr_in); getpeername(psvc->sock, (struct sockaddr *)&addr, &addrlen); strcpy(psvc->host, inet_ntoa(addr.sin_addr)); Log("Client(%s) connected\n",psvc->host); fd_set rfds, sfds; struct timeval tv; int n; psvc->frame_sent = 0; #ifdef PERFORMANCE_REPORT psvc->frame_total = 0; psvc->frame_capture = 0; psvc->frame_compress = 0; psvc->frame_colorspace = 0; psvc->frame_tx = 0; psvc->frame_client = 0; gettimeofday(&tLast,NULL); #endif /* PERFORMANCE_REPORT */ //LOCK(psvc->output_mutex); //last_fbc_output_current = fbc_output_current; //UNLOCK(psvc->output_mutex); FBCCMD msgt, msg; while (1) { FD_ZERO(&rfds); FD_SET(psvc->sock, &rfds); //FD_ZERO(&sfds); //FD_SET(psvc->sock, &sfds); tv.tv_sec = 30; tv.tv_usec = 0; // 50 msec n = select(psvc->sock + 1, &rfds, /*&sfds*/ NULL, NULL, &tv); if (n < 0) { Err("ReadExact: select"); break; } if (psvc->sock == -1) { Log("client disconnected\n"); break; } if (FD_ISSET(psvc->sock, &rfds) ) { if( ReadExact(psvc, (char*)&msg, FBCCMD_HEADER) <= 0 ) { Err("Read Err"); break; } if( msg.cmd == 'h') { while( 1 ) { FD_ZERO(&rfds); FD_SET(psvc->sock, &rfds); tv.tv_sec = 0; tv.tv_usec = 1000; n = select(psvc->sock + 1, &rfds, /*&sfds*/ NULL, NULL, &tv); if( n== 0) // no more packet break; if (FD_ISSET(psvc->sock, &rfds) ) { if( ReadExact(psvc, (char*)&msgt, FBCCMD_HEADER) <= 0 ) { Err("Read Err2\n"); break; } if( msgt.cmd == msg.cmd ) {// same update packet //Log("skip same update cmd\n"); continue; } ProcessClientMessage(psvc, &msg); msg = msgt; } break; } } if( 0 == ProcessClientMessage(psvc, &msg) ) break; } /* if (FD_ISSET(psvc->sock, &sfds) ) { LOCK(psvc->output_mutex); if( last_fbc_output_current != fbc_output_current ) { //Log("output-start %d-%d\n",last_fbc_output_current,fbc_output_current); //Log("client outbuf last:%d current:%d\n", last_fbc_output_current, fbc_output_current); unsigned int size = fbc_output[last_fbc_output_current].size; fbc_output[last_fbc_output_current].size = htonl(size); //int result1, result2; WriteExact(psvc, (const char*)&fbc_output[last_fbc_output_current], FBCCMD_HEADER); WriteExact(psvc, (const char*)fbc_output[last_fbc_output_current].jpegBuf, size - FBCCMD_HEADER); last_fbc_output_current = fbc_output_current; //Log("output result(%d,%d:%d)\n", result1, result2,size); } UNLOCK(psvc->output_mutex); } */ if (psvc->sock == -1) { Log("client disconnected\n"); break; } } ExitClient(psvc); Log("clientInput Thread Exit\n"); return NULL; }
LONG APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) { switch(message) { case WM_TIMER: { if(wParam == TIMER_SEC) ProcessSecTimer(); else if(wParam == TIMER_MIN) ProcessMinTimer(); } break; case WSA_READADMINCLIENT: { if(WSAGETSELECTEVENT(lParam) != FD_READ) { Log("adminclient close fd read","-system",0); AdminClient.CloseSocket(); break; } if(AdminClient.Receive() != 1) { Log("adminclient %d close receive", "-system", 0); break; } char temp[256]; int Error; int ErrorCode; while(1) { char *Msg = AdminClient.ReadMessage(&Error, &ErrorCode); if(Msg == NULL) break; if(Error == 1 || Error == 2) { sprintf(temp, "err wsa_ReadadminClient (%d),%d", Error, ErrorCode); Log(temp, "-system", 0); break; } int ret = ProcessAdminClientMessage(Msg); }; } break; case WSA_READADMIN: { int User = GetAdminFromSocket(wParam); if(User == -1) { closesocket(wParam); Log("err, wsa_read unregistered sever socket", "-system", 0); break; } if(WSAGETSELECTEVENT(lParam) != FD_READ) { char temp[256]; sprintf(temp, "admin close fd %d", User); Log(temp, "-system", 0); pAdmin[User].cSock.CloseSocket(); pAdmin[User].Mode = USER_EMPTY; pAdmin[User].Name[0] = 0; break; } CurrentTime = timeGetTime(); if(pAdmin[User].cSock.Receive() != 1) { char temp[256]; sprintf(temp, "admin %d close receive", User); Log(temp, "-system", 0); break; } char temp[256]; int Error; int ErrorCode; while(1) { char *Msg = pAdmin[User].cSock.ReadMessage(&Error, &ErrorCode); if(Msg == NULL) break; #ifdef _PACKET_DEBUG MSG_STANDARD * debug = (MSG_STANDARD*) Msg; if(BASE_CheckPacket(debug)) { sprintf(temp, "err packet Type:%d Size:%d", debug->Type, debug->Size); Log(temp, "-system", 0); } #endif if(Error == 1 || Error == 2) { sprintf(temp, "err,wsa_Readadmin (%d),%d", Error, ErrorCode); Log(temp, "-system", 0); break; } int ret = ProcessAdminMessage(User, Msg); if(ret == FALSE) { pAdmin[User].cSock.CloseSocket(); pAdmin[User].Mode = USER_EMPTY; pAdmin[User].Name[0] = 0; break; } }; } break; case WSA_READ: { int User = GetUserFromSocket(wParam); if(User == -1) { closesocket(wParam); Log("err wsa_read unregistered game server socket", "-system", 0); break; } if(WSAGETSELECTEVENT(lParam) != FD_READ) { char temp[256]; sprintf(temp, "clo server fd %d", User); Log(temp, "-system", 0); pUser[User].cSock.CloseSocket(); pUser[User].Mode = USER_EMPTY; break; } CurrentTime = timeGetTime(); if(pUser[User].cSock.Receive() != 1) { char temp[256]; sprintf(temp, "clo, server receive %d", User); Log(temp, "-system", 0); Log(temp, "-system", 0); Log(temp, "-system", 0); pUser[User].cSock.nRecvPosition = 0; pUser[User].cSock.nProcPosition = 0; break; } char temp[256]; int Error; int ErrorCode; do { char *Msg = pUser[User].cSock.ReadMessage(&Error, &ErrorCode); if (Msg == NULL) break; #ifdef _PACKET_DEBUG MSG_STANDARD * debug = (MSG_STANDARD*) Msg; if(BASE_CheckPacket(debug)) { sprintf(temp, "**PACKET_DEBUG** Type:%d Size:%d", debug->Type, debug->Size); Log(temp, "-system", 0); } #endif if(Error == 1 || Error == 2) { sprintf(temp, "err wsa_read (%d),%d", Error, ErrorCode); Log(temp, "-system", 0); break; } ProcessClientMessage(User, Msg); } while(1); } break; case WSA_ACCEPTADMIN: { ReadAdmin(); if(WSAGETSELECTERROR(lParam)) { Log("err,accept_admin accepting fails", "-system", 0); break; } TempUser.AcceptUser(AdminSocket.Sock, WSA_READADMIN); unsigned char *cIP = (unsigned char *)&(TempUser.IP); int User = -1; int i = 0; for(i = 0; i <= MAX_ADMIN; i++) { if(pAdmin[i].IP == TempUser.IP) { User = i; break; } } if(User == -1) { int i = 0; for(i = 0; i < MAX_ADMIN; i++) { int a, b, c, d; a = b = c = d = 0; if(pAdminIP[i] == 0) continue; if(pAdminIP[i] == TempUser.IP) { User = i; break; } } if(i == MAX_ADMIN) { TempUser.cSock.CloseSocket(); char temp[256]; sprintf(temp, "err, wsa_acceptadmin request accept from %d.%d.%d.%d", cIP[0], cIP[1], cIP[2], cIP[3]); Log(temp, "-system", 0); } } if(User >= 0 && User < MAX_ADMIN) { if(pAdmin[User].Mode != USER_EMPTY) { char temp[256]; sprintf(temp, "err, wsa_acceptadmin not empty previous slot %d", i); Log(temp, "-system", 0); TempUser.cSock.CloseSocket(); pAdmin[User].cSock.CloseSocket(); pAdmin[User].Mode = USER_EMPTY; break; } } else { Log("err,accept_admin unknown attempt", "-system", 0); TempUser.cSock.CloseSocket(); break; } if(User == -1) { Log("err,accept_admin no empty", "-system", 0); break; } pAdmin[User].Level = -1; pAdmin[User].DisableID = 0; pAdmin[User].IP = TempUser.IP; pAdmin[User].Mode = TempUser.Mode; pAdmin[User].Name[0] = 0; pAdmin[User].cSock.Sock = TempUser.cSock.Sock; pAdmin[User].cSock.nRecvPosition = TempUser.cSock.nRecvPosition; pAdmin[User].cSock.nProcPosition = TempUser.cSock.nProcPosition; pAdmin[User].cSock.nSendPosition = TempUser.cSock.nSendPosition; cIP = (unsigned char *)&(pAdmin[User].IP); char tmp[100]; sprintf(tmp, "sys,wsa_acceptadmin %d.%d.%d.%d <%d>", cIP[0], cIP[1], cIP[2], cIP[3], User); Log(tmp, "-system", 0); pAdmin[User].Encode1 = rand() % 10000; pAdmin[User].Encode2 = rand() % 10000; MSG_NPIDPASS sm; memset(&sm, 0, sizeof(MSG_NPIDPASS)); sm.Type = _MSG_NPReqIDPASS; sm.Size = sizeof(MSG_NPIDPASS); sm.ID = 0; sm.Encode1 = pAdmin[User].Encode1; sm.Encode2 = pAdmin[User].Encode2; pAdmin[User].cSock.SendOneMessage((char*)&sm, sizeof(MSG_NPIDPASS)); } break; case WSA_ACCEPT: { if(WSAGETSELECTERROR(lParam)) { Log("err WSAGETSELECTERROR - accepting new client.", "-system", 0); break; } TempUser.AcceptUser(ListenSocket.Sock, WSA_READ); unsigned char *cIP = (unsigned char *)&(TempUser.IP); char sIP[256]; sprintf(sIP, "%d.%d.%d.%d", cIP[0], cIP[1], cIP[2], cIP[3]); int User = -1; for(int i = 0; i < MAX_SERVER; i++) { if(pUser[i].IP == TempUser.IP) { User = i; break; } } if(User == -1) { int i = 1; for(; i < MAX_SERVERNUMBER; i++) { if(!strcmp(g_pServerList[ServerIndex][i], sIP)) break; } if(i == MAX_SERVERNUMBER) { TempUser.cSock.CloseSocket(); char temp[256]; sprintf(temp, "err wsa_accept request from %s", sIP ); Log(temp, "-system", 0); break; } User = i - 1; } else if(User >= 0 && User < MAX_SERVERNUMBER) { if(pUser[User].Mode != USER_EMPTY) { char temp[256]; sprintf(temp, "err wsa_accept no previous slot %d", User ); Log(temp, "-system", 0); TempUser.cSock.CloseSocket(); TempUser.Mode = 0; pUser[User].cSock.CloseSocket(); pUser[User].Mode = 0; break; } } else { Log("err wsa_accept unknown attempt", "-system", 0); TempUser.cSock.CloseSocket(); } if(User == -1) { Log("err wsa_accept no empty", "-system", 0); break; } if(cIP[0] == LocalIP[0] && cIP[1] == LocalIP[1] && cIP[2] == LocalIP[2]) { pUser[User].IP = TempUser.IP; pUser[User].Mode = TempUser.Mode; pUser[User].cSock.Sock = TempUser.cSock.Sock; pUser[User].cSock.nRecvPosition = TempUser.cSock.nRecvPosition; pUser[User].cSock.nProcPosition = TempUser.cSock.nProcPosition; pUser[User].cSock.nSendPosition = TempUser.cSock.nSendPosition; cFileDB.SendDBSignalParm3(User, 0, _MSG_DBSetIndex, ServerIndex, Sapphire, User); for(int i = 0; i < 65536; i++) { if(GuildInfo[i].Citizen) cFileDB.SendGuildInfo(User, i); if(g_pGuildWar[i]) cFileDB.SendDBSignalParm2(User, 0, _MSG_War, i, g_pGuildWar[i]); if(g_pGuildAlly[i]) cFileDB.SendDBSignalParm2(User, 0, _MSG_GuildAlly, i, g_pGuildAlly[i]); } if(TransperCharacter) cFileDB.SendDBSignalParm2(User, 0, _MSG_TransperCharacter, 0, 0); break; } else { TempUser.cSock.CloseSocket(); char temp[256]; sprintf(temp, "err,wsa_accept outer ethernet IP: %d.%d.%d.%d", cIP[0], cIP[1], cIP[2], cIP[3]); Log(temp, "-system", 0); break; } } break; case WM_CREATE: { HMENU hMenu, hSubMenu; HICON hIcon, hIconSm; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, IDC_EXIT, "&Exit"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, IDC_SHUTDOWNNP, "&Reload MobBase"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Sistema"); SetMenu(hWnd, hMenu); } break; case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_EXIT: PostMessage(hWnd, WM_CLOSE, 0, 0); break; case IDC_SHUTDOWNNP: { #pragma region Load Base Characters int handle = -1; handle = _open("./BaseMob/TK", _O_RDONLY | _O_BINARY); if (handle == -1) { MessageBoxA(hWndMain, "no TransKnight file", "BOOTING ERROR", MB_OK); return FALSE; } _read(handle, &g_pBaseSet[0], sizeof(STRUCT_MOB)); _close(handle); handle = -1; handle = _open("./BaseMob/FM", _O_RDONLY | _O_BINARY); if (handle == -1) { MessageBoxA(hWndMain, "no Foema file", "BOOTING ERROR", MB_OK); return FALSE; } _read(handle, &g_pBaseSet[1], sizeof(STRUCT_MOB)); _close(handle); handle = -1; handle = _open("./BaseMob/BM", _O_RDONLY | _O_BINARY); if (handle == -1) { MessageBoxA(hWndMain, "no BeastMaster file", "BOOTING ERROR", MB_OK); return FALSE; } _read(handle, &g_pBaseSet[2], sizeof(STRUCT_MOB)); _close(handle); handle = -1; handle = _open("./BaseMob/HT", _O_RDONLY | _O_BINARY); if (handle == -1) { MessageBoxA(hWndMain, "no Huntress file", "BOOTING ERROR", MB_OK); return FALSE; } _read(handle, &g_pBaseSet[3], sizeof(STRUCT_MOB)); _close(handle); g_pBaseSet[0].BaseScore = g_pBaseSet[0].CurrentScore; g_pBaseSet[1].BaseScore = g_pBaseSet[1].CurrentScore; g_pBaseSet[2].BaseScore = g_pBaseSet[2].CurrentScore; g_pBaseSet[3].BaseScore = g_pBaseSet[3].CurrentScore; #pragma endregion } break; } } break; case WM_PAINT: PAINTSTRUCT ps; memset(&ps, 0, sizeof(PAINTSTRUCT)); BeginPaint(hWnd, &ps); hFont = CreateFont(12, 0, 0, 0, FW_LIGHT, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEVICE_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Fixedsys"); // |FF_DECORATIVE hDC = ps.hdc; DrawConfig(); EndPaint(hWnd, &ps); break; case WM_CLOSE: { int rret = MessageBox(hWndMain, "Desligando servidor, não se esqueça de salvar as contas !", "Aviso !! Desligando Servidor !!", MB_OKCANCEL | MB_ICONWARNING); if(rret == 1) { WriteConfig(); if (fLogFile) fclose(fLogFile); DayLog_ExpLog(); DayLog_ItemLog(); DefWindowProc(hWnd,message,wParam,lParam); } return true; } break; case WM_DESTROY: WSACleanup(); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }