文档库 最新最全的文档下载
当前位置:文档库 › 远程控制程序

远程控制程序

C语言写简单远程控制代码

通信过程:服务器端启动后开始进行监听,客户端主动连接服务端,连接成功后为其建立一个线程接收控制命令并进行处理。

客户端的实现:

只要连接上服务端就基本什么都不用做了,当用户点击“发送控制”按钮后根据控制选项构造不同的命令进行发送。

连接服务端的代码://得到服务端IP

BYTE ch1,ch2,ch3,ch4;

m_edtServer.GetAddress(ch1,ch2,ch3,ch4);

m_strServer.Format("%u.%u.%u.%u",ch1,ch2,ch3,ch4);

WSADATA ws;

int ret;

struct sockaddr_in server;

if(WSAStartup(MAKEWORD(2,2),&ws)!=0)

{

return;

}

if((sClient=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)

{

return;


}


server.sin_family=AF_INET;

server.sin_port=htons(m_nPort);

server.sin_addr.s_addr=inet_addr(m_strServer);

if(connect(sClient,(struct sockaddr *)&server,sizeof(server))==0)

{

m_edtStatus.SetWindowText("已经接上TCP端口:12345");

}





“发送控制”按钮的响应函数,程序中只有三种基本功能:信息发送(使对方弹出一个对话框,显示您所发送过去的信息)、
系统控制(包括关机、重启、截获屏幕、弹出/关闭光驱五个功能)、鼠标控制(包括随机移动、禁用输入、交换左右键
三个子功能)。使用三个单选框来确定是哪类基本类型的控制,下拉框进行子功能选择,因此每次控制要发送两次控制,
第一次确定基本功能,第二次确定子功能。


char CmdBuffer[1024];

char CmdType[5];

CString strBuffer;

int iSelect;

HANDLE hThread;

DWORD dwThread;

//构造命令

if(m_rdoMsg.GetCheck()==1)

{
//发送消息

m_edtMsg.GetWindowText(strBuffer);//得到输入框里的内容

sprintf(CmdBuffer,"%s",strBuffer);

sprintf(CmdType,"%c",'C');

}

else if(m_rdoMouse.GetCheck()==1)

{

//鼠标控制

iSelect=m_cmbMouse.GetCurSel();

sprintf(CmbBuffer,"%d",iSelect);

sprintf(CmbType,"%c",'M');

}
else
{

return;

}

//首先发送命令基本类型

int ret=send(sClient,CmdType,strlen(CmdType)+1,0);

if((ret==SOCKET_ERROR)||(ret==0))

{

return;

}

//发送子功能号

ret=send(sClient,CmdBuffer,strlen(CmdBuffer)+1,0);

if((ret==SOCKET_ERROR)||(ret==0))

{

return;

}

return;


使服务端截获到的屏幕图像显示在picture控件中,服务端截获到屏幕后就直接保存在C盘根目录下,而控制端直接到该位置读取

HBITMAP hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"C:\\test.bmp",IMAGE_BITMAP,0,0,LR_CREAREDIBSECTION|LR_

LOADFROMFILE);

CDC *pDc=GetDlgItem(IDC_FILE_STATIC)->GetDC();

CDC screen;

screen.CreateCompatibleDC(pDc);

CRect rect;

GetClientRect(rect);

HBITMAP OldBitmap=(HBITAMP)screen.SelectObject(hBitmap);

pDc->BitBlt(0,0,rect.Width(),rect.Height(),&screen,0,

0,SRCCOPY);

return;



服务端,先看监听的函数

WSADATA ws;

int iAddrSize;

HANDLE hThread;

DWORD dwThread;

struct sockaddr_in local,client;

if(WSAStartup(MAKEWORD(2,2),&ws)!=0)

{

return;

}

if((sListen=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)

{

return;

}


local.sin_family=AF_INET;

local.sin_port=htons(12345);

local.sin_addr.S_un.S_addr=INADDR_ANY;

if(bind(sListen,(struct sockaddr*)&local,sizeof(struct sockaddr))==SOCKET_ERROR)

{

closesocket(sListen);
return;

}

listen(sListen,5);

iAddrSize=sizeof(client);

sClient= accept(sListen,(struct sockaddr*)&client,&iAddrSize);

if(sClient==INVALID_SOCKET)

{

closesocket(sListen);
return;

}


//创建一个会话线程

hThread=CreateThread(NULL,0,ClientThread,(LPVOID)sClient,0,&dwThread);

if(hThread==NULL)

{

return;

}

CloseHandle(hThread);

closesocket(sListen);

WSACleanup();

return;


//线程函数代码

SOCKET sock=(SOCKET)param;

char szBuff[MAX_PATH];

int ret;

while(1)

{

ret=recv(sock,szBuff,sizeof(szBuff),0);

if(ret==0)

break;

else if(ret==SOCKET_ERROR)

break;

else

szBuff[ret]='\0';


switch(szBuff[0])

{

case'S'://显示消息

ret=recv(sock,szBuff,sizeof(szBuff),0);

szBuff[ret]='\0';

ShowMessage(szBuff);

break;

case'C'://系统控制

ret=recv(sock,szBuff,sizeof(szBuff),0);

szBuff[ret]='\0';




}

}


相关文档