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

📄 pppserverdlg.cpp

📁 服务端: 这是一个完整的基于Wince 4.1图形图象,网络通讯(C/S)模式下的商用程序源代码包.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// PPPServerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PPPServer.h"
#include "PPPServerDlg.h"

//#include "aboutdlg.h"
#include "AboutDlg.h"
#include "setposition.h"
#include "setsize.h"
#include "texteditor.h"

#include "setautorundlg.h"
#include "SoftRegisterDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//如何在程序中关闭、重起和硬起动WCE、PPC、SP?     
//作者:Daric   来源:BIPLIP.com   时间:2005年5月8日 18:18   阅读3888次   
// 关闭(suspend)

//方法1:
//虚拟关机键
//::keybd_event(VK_OFF, 0, 0, 0); 
//::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);
//方法2:
//调用未公开函数PowerOffSystem()
//extern "C" __declspec(dllimport) void PowerOffSystem();

//Soft reset the device
/*#include <winioctl.h>

#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)

extern "C" __declspec(dllimport) BOOL KernelIoControl(
 DWORD dwIoControlCode, 
 LPVOID lpInBuf, 
 DWORD nInBufSize, 
 LPVOID lpOutBuf, 
 DWORD nOutBufSize, 
 LPDWORD lpBytesReturned);
*/
BOOL ResetDevice()
{
 return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}
//硬起动(hard reset)

//注意!!!使用此段代码会将您的Pocket PC的用户数据全部清空,
//请勿非法使用,用者后果自负.

//#include <winioctl.h>

//#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
/*
extern "C" __declspec(dllimport)void SetCleanRebootFlag(void);

extern "C" __declspec(dllimport) BOOL KernelIoControl(
 DWORD dwIoControlCode, 
 LPVOID lpInBuf, 
 DWORD nInBufSize, 
 LPVOID lpOutBuf, 
 DWORD nOutBufSize, 
 LPDWORD lpBytesReturned);
*/
BOOL HardResetDevice()
{
 SetCleanRebootFlag();
 return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}
//=============================================================

CPPPServerDlg *m_main_dlg;
//
CString m_ini_pathname;
CString m_keycode_pathname;

bool m_one_flag=false;
bool m_all_flag=false;
BOOL m_run_watchdlg_flag=FALSE;
HANDLE m_watchdog_thread=NULL;
//软件保护标志
BOOL m_software_protected_flag;
//
//adjust system time
bool m_server_run_flag=false;
HANDLE m_server_thread_handle=NULL;
DWORD m_server_threadid=0;
//
#define SOCKETBUFFSIZE  8192
//20480

#define SD_RECEIVE      0x00
#define SD_SEND         0x01
#define SD_BOTH         0x02

//向客户端发送数据的函数。
//参数1:连接socket;参数2:缓冲区指针;参数3:要发送的字节数,其实就是缓冲区中的数据数;
int WriteSocket(SOCKET fd,char *bp,int len)
{
	int cnt;
	int rc;
	cnt=len;
	//我觉得,之所以需要用一个while循环来发送数据,大概是因为send函数也许不能把指定数量数据
	//一次都发送完吧,所以需要用一个循环来反复地发送,直至所有的数据都发送完,或者是出错。
	while(cnt>0)
	{
		//send  The send function sends data on a connected socket.
		//send函数的返回值可用来表示已经成功地发送出去了多少数据,至于客户端能否成功地收到
		//这些数据,好像并不能在send函数的返回值中体现出来。其实,能否成功地收到数据是客户端
		//的事,跟服务器端无关。也许数据被客户端的防火墙拦截了,这样,客户端就永远也不能收到
		//这些数据了,不过,这些乱七八糟的事,服务器端可管不着。
		rc=send(fd,bp,cnt,0);
		if(rc==SOCKET_ERROR)
		{
			//CString aa;
			//aa="发送错误!\n";
			//AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
			//aa.ReleaseBuffer();
			int errorno;
			errorno=WSAGetLastError();
			return -1;
		}
		if(rc==0)
		{
			int errorno;
			errorno=WSAGetLastError();
			return len-cnt;
		}
		//发送完了一批数据后,缓冲区指针当然要向后移了。如果指定数量的数据已经发送完了,则
		//bp就指向缓冲区的末尾了。
		bp+=rc;
		//发送完了一批数据,则cnt(用来记录还没发送完的数据)的数值当然需要减去已经发送了的了。
		cnt-=rc;
	}
	return len;
}
//从客户端读取数据的函数。
//参数1:连接套接字;参数2:指向缓冲区的指针;参数3:缓冲区的长度;
//参数4:超时处理
int ReadSocket1(SOCKET fd,char *bp,int len,DWORD timeout)
{

	/////////////////////////////////////////////
	int cnt;//用来记录缓冲区中的剩余可用空间。
	int rc;
	cnt=len;
	while(cnt>0)
	{
		//Platform SDK: Windows Sockets  The recv function receives data from a connected or bound socket.
		//Return Values  If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
		//cnt参数的值被设定为缓冲区的长度值,所以,在网络速度足够好的情况下,读取cnt这么
		//多的字节,没问题。这样的话,此while循环只需要执行一次就会正常退出了。从而,我也
		//明白了while循环的作用,就是:用来保证一定要读取cnt这么多的字节,读不够数就
		//反复地读,直至读够数了,或者是此连接被关闭掉了。
		//我有一个疑问:如果客户端只发过来50个字节的数据,会怎么样呢?其实,这个问题,只需要查到合适的资料,就可以轻松解决,并无任何的难度可言。
		//答:?????? timeout process,haha~~
		rc=recv(fd,bp,cnt,0);

		if(rc==SOCKET_ERROR)
		{
			int errorno;
			errorno=WSAGetLastError();
			//CString aa;
			//aa="接收错误!\n";
			//AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
			//aa.ReleaseBuffer();
		
			return -1;
		}

		//If the connection has been gracefully closed, the return value is zero.
		if(rc==0) 
		{
		
			int errorno;
			errorno=WSAGetLastError();
			return len-cnt;
		}
		//读取了一些数据之后,缓冲区指针也应该相应地增加。
		bp+=rc;
		//读取了一些数据之后,缓冲区中的剩余可用空间也应该相应地减小。
		cnt-=rc;
	}

	////////////////////////////
	return len;
}
//从服务端读取数据的函数。

//参数1:连接套接字;参数2:指向缓冲区的指针;参数3:缓冲区的长度;
//参数4:超时处理
int ReadSocket(SOCKET fd,char *bp,int len,DWORD timeout)
{


    fd_set fdRead;
	TIMEVAL tt;
	tt.tv_sec=0;//timeout/1000;
	tt.tv_usec=0;//(timeout%1000)*1000;	
	/////////////////////////////////////////////
	int iRet=0;
	int rc=0;
	DWORD bt,et;
	bt=et=GetTickCount();
	while(TRUE)//cnt>0)
	{
		FD_ZERO(&fdRead);
		FD_SET(fd,&fdRead);
		iRet=select(0,&fdRead,NULL,NULL,&tt);
		if(iRet==SOCKET_ERROR)
		{
			break;
		}

		if(iRet>0)
		{
			if(FD_ISSET(fd,&fdRead))
			{
				//read
              rc=recv(fd,bp,len,0);

		      if(rc==SOCKET_ERROR)
			  {		
		    	//接收错误!		
			    int errorno;
		    	errorno=WSAGetLastError();
			    return -1;
			  }
		     //If the connection has been gracefully closed, the return value is zero.
		      else if(rc==0) 
			  {
			   int errorno;
			   errorno=WSAGetLastError();	
			   return 0;
			 }
			  else
			  {
				  return rc;
			  }

			}
		}

		//timeout
		et=GetTickCount();
		if(et-bt>=timeout) break;
	}
	return -2;	
}
//get rand seed,
 //使每次产生的随机数不一样                           
BYTE GetCodeBYTE()
{
	  BYTE b=0x00;


	   int n;
	   n=rand();
       n=n%255; // 得到一个0-(MAX_ADD_SHOWWAY-4)的数
		 //
		//in=n+1;
	   b=n;

	 return b;
}

//
//取得PPC2003设备机身设备序号的EVC程序和代码  [ 2006-6-17 | Cxty's Blog | 嘻 嚓 啼 歪 的 小 窝 窝 ] 
//主要是使用KernelIOControl这个函数
CString GetSerialNumberFromKernelIoControl()
{
        DWORD dwOutBytes;
        const int nBuffSize = 4096;
        byte arrOutBuff[nBuffSize];
        int count;
		count=0;

begin:
        BOOL bRes = ::KernelIoControl(IOCTL_HAL_GET_DEVICEID, 
                                     0, 0, arrOutBuff, nBuffSize, &dwOutBytes);
       
        if (bRes) 
        {
                CString strDeviceInfo;
                for (unsigned int i = 0; i<dwOutBytes; i++) 
                {
                        CString strNextChar;
                        strNextChar.Format(TEXT("%02X"), arrOutBuff[i]);
                        strDeviceInfo += strNextChar;
                }
                CString strDeviceId = 
                        strDeviceInfo.Mid(20,2) + //40
                        strDeviceInfo.Mid(30,8) + //9
                        strDeviceInfo.Mid(70,6);

                return strDeviceId;
        } 
        else
        {       ++count;
		        if(count<10) goto begin;
                return _T("");
        }
}

CString GetSerialNumber(CString m_pathname)
{
   
	 CString sn;
	 //sn=TEXT("");
     sn=GetSerialNumberFromKernelIoControl();
	 FILE *fp;
	 fp=_tfopen(m_pathname,L"rb");
	 if(!fp)
	 {
		 //
		 fp=_tfopen(m_keycode_pathname,L"wb");
		 if(fp)
		 {
          //create 32*8 code by random
		  BYTE ch;
		  int i;
		  CString strDeviceInfo;

		 SYSTEMTIME st;
         GetSystemTime(&st);
	     unsigned int seed;
	  //seed=st.wHour*3600+st.wMinute*60+st.wSecond*1000+st.wMilliseconds;   
	     seed=st.wHour*3600+st.wMinute*60+st.wSecond+st.wMilliseconds;   
         srand(seed);
          for ( i = 0; i<8; i++) 
           {
			     ch=GetCodeBYTE();
                 CString strNextChar;
                 strNextChar.Format(TEXT("%02X"), ch);
                 strDeviceInfo += strNextChar;
           }
           WORD len=strDeviceInfo.GetLength()*2;
		   fwrite(&len,2,1,fp);
		   TCHAR tch;
		   for(int j=0;j<len/2;j++)
		   {
			   tch=strDeviceInfo.GetAt(j);
			   fwrite(&tch,2,1,fp);
		   }
		   //fwrite((char*)strDeviceInfo,len,1,fp);
          //write 32+32 byte to file		   
		   //len*2+2           
		   fclose(fp);
           //
		   sn=sn+strDeviceInfo;
		 }
		 //
		 
		 //m_software_registered_flag=FALSE;//NOT REGISTER
	 }
	 else
	 { 
		//取得ID
		CString did;
        WORD len;
		fread(&len,2,1,fp);
		TCHAR *str;
		str=new TCHAR[len+1];
		//for(WORD i=0;i<len;i++)
		fread(str,len,1,fp);
		str[len/2]=_T('\0');//
        did=str;
        delete str; 		
    
        fclose(fp);
		//
		sn=sn+did;
	 }

	 return sn;
}
//
CString GetSoftWareRegisterCode(CString serial)
{
 CString sn; 
 sn=serial;

 if(sn.GetLength()<=0||sn.GetLength()%2!=0)
 {
	 return TEXT("1234567890");
 } 
 //全部为大写
 //
 sn.MakeUpper();
 //
 CString tmpstr;
 int len;
 len=sn.GetLength();
 //0,1,2,3,4,5,6,7,8,9
 //1,8,2,5,0,3,9,6,4,7
 TCHAR code[11]={_T('1'),_T('8'),_T('2'),_T('5'),_T('0'),
	             _T('3'),_T('9'),_T('6'),_T('4'),_T('7'),
				 _T('\0')

				};
 //密码=[各项求和后模10]+[原码]+[各项求积后模10]
 
 long he,ji;
 he=0;
 ji=1;
 TCHAR ch,ss,mm;
 TCHAR *mstr;
 ss=0;
 mm=0;
 mstr=new TCHAR[len+2+1];
 int count;
 count=0;
 for(int i=0;i<len;i++)
 {
   ch=sn.GetAt(i);
   if(ch>=_T('A')&&ch<=_T('F'))
   {
    ss=ch-_T('A');
   }
   else
   {
     ss=ch-_T('0');
   }
   //he,ji
   if(ss!=0)
   {
    he=he+ss;   
    ji=ji*ss;
   }
   //
   if(ss!=0)
   {   
    mm=code[ss];
    mstr[count+1]=mm;
    count++;
   }
   //.....
 }
 //he
   ss=labs(he)%10;
   mm=code[ss];
   mstr[0]=mm;
//ji
   ss=labs(ji)%10;
   mm=code[ss];
   mstr[count+1]=mm;
//
   mstr[count+2]=_T('\0');

   //
   tmpstr=mstr;

   //

⌨️ 快捷键说明

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