示例#1
0
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;
}
示例#2
0
文件: Server.cpp 项目: JA589/W2PP
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;
}