📄 peerthread.cpp
字号:
// PeerThread.cpp: implementation of the PeerThread.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PeerThread.h"
#include "globalhead.h"
#include "peersocket.h"
#include "CaptureScreen.h"
#include "LZWCompress.h"
#include "command.h"
#include "peersysteminit.h"
#include "peerregeditctrl.h"
#include "peerfileoperator.h"
#include "screenctrl.h"
//////////////////////////////////////////////////////////////////////
CONNECTTHREADLIST listConnectThread; //客户连接线程列表
UNUSEDTHREADLIST listUnusedThread; //不用的线程句柄列表
CRITICAL_SECTION csProtectList; //只允许同时一个线程访问这些列表
///////////////////////////////
//接受远程连接的线程
UINT WINAPI AcceptThread(PVOID pParam)
{
CONNECTTHREAD connectthread;
HANDLE hNewThread;
DWORD dwNewThreadID;
SOCKET s;
WSAEVENT hEvnets[2];
SOCKADDR ClientAddr;
SOCKADDR_IN ClientAddrIn;
int iAddrLen = sizeof(ClientAddr);
CONNECTSOCKET ConnectSocketInfo;
if(!PeerCreateSocket(&s,PEER_STREAM))
{
return -1;
}
if(!PeerBindSocket(s,szHostAddr,nHostPort))
{
PeerCloseSocket(s);
return -1;
}
if(!PeerListenSocket(s))
{
PeerCloseSocket(s);
return -1;
}
WSAEVENT hNetEvent = WSACreateEvent();
if(hNetEvent == WSA_INVALID_EVENT)
{
PeerCloseSocket(s);
return -1;
}
hEvnets[0] = hExitEvent;
hEvnets[1] = hNetEvent;
int result = WSAEventSelect(s,hNetEvent,FD_ACCEPT);
if(result == SOCKET_ERROR)
{
PeerCloseSocket(s);
WSACloseEvent(hNetEvent);
return -1;
}
//准备工作已经完毕
SetEvent(hPrepareEvent);
//等候网络时间完成的环境变量
WSANETWORKEVENTS NetworkEvents;
for(;;)
{
DWORD EventCaused = WSAWaitForMultipleEvents(
2,
hEvnets,
FALSE,
WSA_INFINITE,
FALSE);
if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0)
{
WSACloseEvent(hNetEvent);
PeerCloseSocket(s);
return -1;
}
result = WSAEnumNetworkEvents(
s,
hNetEvent,
&NetworkEvents);
if(result == SOCKET_ERROR)
{
WSACloseEvent(hNetEvent);
PeerCloseSocket(s);
return -1;
}
if(NetworkEvents.lNetworkEvents == FD_ACCEPT)
{
SOCKET ClientSocket = WSAAccept(s, &ClientAddr, &iAddrLen, NULL, NULL);
if(INVALID_SOCKET == ClientSocket)
{
continue;
}
else
{
memcpy(&ClientAddrIn,&ClientAddr,sizeof(SOCKADDR_IN));
strcpy(ConnectSocketInfo.IP,inet_ntoa(ClientAddrIn.sin_addr));
ConnectSocketInfo.socket=ClientSocket;
if((hNewThread=BeginPeerThread(ServerThread,&ConnectSocketInfo,&dwNewThreadID))==NULL)
continue;
else{
connectthread.hThread=hNewThread;
connectthread.threadID=dwNewThreadID;
EnterCriticalSection(&csProtectList);
listConnectThread.push_back(connectthread);
LeaveCriticalSection(&csProtectList);
}
}
}
}
WSACloseEvent(hNetEvent);
PeerCloseSocket(s);
return 0;
}
/////////////////////////////////
//服务线程
/////////////////////////////////
UINT WINAPI ServerThread(PVOID pParam)
{
/////得到连接的socket//////
CONNECTSOCKET SocketInfo;
SocketInfo=*(CONNECTSOCKET*)pParam;
SOCKET s;
s=SocketInfo.socket;
/////创建socket上的事件句柄////////
WSAEVENT hEvent=WSACreateEvent();
///////////////////////////////////
DWORD retLen; //返回数据长度
COMMAND command;//命令头
///////////////////////////////////
memset((char*)&command,0,sizeof(COMMAND));
if(!PeerRecvDataS(s,(char*)&command,sizeof(command),&retLen,
hEvent,SENDRECV_TIMEOUT))
{
PeerCloseSocket(s);
WSACloseEvent(hEvent);
DeleteThread(CUR_THREADID);
return 0;
}
switch(command.CommandID)
{
case PEER_SYSTEM_INIT: //客户端循检时返回的系统信息
SYSTEMINIT si;
if(GetPeerSystemInfo(si))
PeerSendDataS(s,(char*)&si,sizeof(si),&retLen,hEvent,
SENDRECV_TIMEOUT);
break;
case PEER_REGEDIT_ENUMVALUE:
PeerRegeditEnumValue(s,hEvent);
break;
case PEER_REGEDIT_ENUMKEY:
PeerRegeditEnumKey(s,hEvent);
break;
case PEER_REGEDIT_CREATEKEY:
PeerRegeditCreateKey(s,hEvent);
break;
case PEER_REGEDIT_DELETEKEY:
PeerRegeditDeleteKey(s,hEvent);
break;
case PEER_REGEDIT_DELVALUE:
PeerRegeditDelValue(s,hEvent);
break;
case PEER_REGEDIT_SETVALUE:
PeerRegeditSetValue(s,hEvent);
break;
case PEER_REGEDIT_GETVALUE:
PeerRegeditGetValue(s,hEvent);
break;
case PEER_FILE_GETDRIVER:
PeerFileGetDriver(s,hEvent);
break;
case PEER_FILE_GETATTRIB:
PeerFileGetAttrib(s,hEvent);
break;
case PEER_FILE_SAVEFILE:
PeerFileSave(s,hEvent);
break;
case PEER_FILE_SENDFILE:
PeerFileSend(s,hEvent);
break;
case PEER_FILE_CREATEDIR:
PeerFileDirCreate(s,hEvent);
break;
case PEER_FILE_EXCUTE:
PeerFileExcute(s,hEvent);
break;
case PEER_FILE_DELETEFILE:
PeerFileDelete(s,hEvent);
break;
case PEER_KEYMOUSE:
PeerScreenMouseKey(s,hEvent);
break;
case PEER_SCREEN_GET:
PeerScreenGet(s,hEvent);
CleanScreenInfo();
break;
case PEER_FONTTEXT:
PeerScreenWrite(s,hEvent);
break;
}
WSACloseEvent(hEvent);
PeerShutDownSocket(s);
PeerCloseSocket(s);
DeleteThread(CUR_THREADID);
return 0;
}
/////////////////////////////
//清理已经完成操作的线程的线程
UINT WINAPI CleanupThread(PVOID pParam)
{
SetEvent(hPrepareEvent);
UNUSEDTHREADLIST::iterator it;
for(;;)
{
if(WaitForSingleObject(hExitEvent, PEER_CLEANTHREADTIME)==WAIT_TIMEOUT)
{
EnterCriticalSection(&csProtectList);
while(listUnusedThread.size())
{
HANDLE h = listUnusedThread.front();
DWORD n = WaitForSingleObject(h,PEER_KILLTHREADTIME);
if(n==WAIT_TIMEOUT)
{
TerminateThread(h,0);
}
CloseHandle(h);
listUnusedThread.pop_front();
}
LeaveCriticalSection(&csProtectList);
}
else
return 0;
}
return 0;
}
///////////////////////////
///删除已经执行完成线程句柄
void DeleteThread(DWORD dwThreadID)
{
CONNECTTHREADLIST::iterator it;
it=find_if(listConnectThread.begin(),listConnectThread.end(),bind2nd(IDCompare(),dwThreadID));
if(it!=listConnectThread.end())
{
EnterCriticalSection(&csProtectList);
listUnusedThread.push_back((*it).hThread);
listConnectThread.erase(it);
LeaveCriticalSection(&csProtectList);
}
}
////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -