admin管理员组

文章数量:1532440

2024年5月1日发(作者:)

c语言写简单远程控制源代码首先讲一下两方的通信过程:服务端启动后就进行监

听,客户端主动连接服务端,连接成功后为其建立一个线程接收控制命令并进行处

理。下面讲解客户端的实现。客户端的功能其实很简单,只要连接上服务端后就基

本什么不用做了,当用户点击“发送控制”按钮后根据控制选项构造不同的命令进行

发送。下面是连接服务端的代码: // 得到服务端IPBYTE

ch1ch2ch3ch4m_ressch1ch2ch3ch4m_1ch2c

h3ch4WSADATA wsint retstruct sockaddr_in serverifWSAStartupMAKEWORD22ws

0returnifsClient

socketAF_INETSOCK_STREAM0INVALID__family

AF__port htonsm__addr.s_addr

inet_addrm_strServerifconnectsClientstruct sockaddr serversizeofserver

0m_dowText已连接上 TCP端口:12345下面是“发送控制”按钮的响

应函数,本示例程序中只有三种基本功能:信息发送(使对方弹出一个对话框,显

示您所发送过去的信息)、系统控制(包括关机、重启、截获屏幕、弹出/关闭光驱

5个子功能)、鼠标控制(包括随机移动、禁用输入、交换左右键3个子功能)。我

使用了三个单选框来确定是哪类基本类型的控制,下拉框来进行子功能选择。因此

每次控制要发送两次控制,第一次确定基本功能,第二次确定子功能。 char

CmdBuffer1024char CmdType5CString strBufferint iSelectHANDLE hThreadDWORD

dwThread// 构造命令ifm_ck 1 // 发送消息

m_dowTextstrBuffer // 得到输入框中的内容

sprintfCmdBuffersstrBuffersprintfCmdTypec’S’else ifm_ck 1 // 系统

控制// 只发送下拉框返回的选项索引号,服务端直接根据该索引确定子功能命令

iSelect m_SelsprintfCmdBufferdiSelectsprintfCmdTypec’C’else

ifm_ck 1 // 鼠标控制iSelect

m_SelsprintfCmdBufferdiSelectsprintfCmdTypec’M’elsereturn// 首

先发送命令基本类型int ret sendsClientCmdTypestrlenCmdType 10ifret

SOCKET_ERROR ret 0return 第 1 页// 发送子功能号ret

sendsClientCmdBufferstrlenCmdBuffer 10ifret SOCKET_ERROR ret

0returnreturn下面再贴一段如何使服务端截获到的屏幕图像显示在picture控件中,因

为时间比较紧张,我没有把图像传输这一块儿做好,就给偷了个懒,服务端截获到

屏幕后直接保存在C盘根目录下,而控制端直接到该位置读取,哈哈,专门跟老师

说了下,老师考虑到时间限制就放我了一马,其实就是用某些编码算法将图片压缩

一下就可以了,例如JPEG,懒得弄了。HBITMAP hBitmap

HBITMAPLoadImageAfxGetInstanceHandleC:GE_BITMAP00LR_CREA

TEDIBSECTIONLR_LOADFROMFILECDC pDc

GetDlgItemIDC_FILE_STATIC-GetDCCDC

CompatibleDCpDcCRect rectGetClientRectrectHBITMAP

OldBitmap

screen00SRCCOPYreturn下面来看服务端,老规矩,先来看监听的函数。 WSADATA

wsint iAddrSizeHANDLE hThreadDWORD dwThreadstruct sockaddr_in

localclientifWSAStartupMAKEWORD22ws 0returnifsListen

socketAF_INETSOCK_STREAM0INVALID__family

AF__port _addr.S_un.S_addr

INADDR_ANYifbindsListenstruct sockaddrlocalsizeofstruct sockaddr

SOCKET_ERRORclosesocketsListenreturnlistensListen5iAddrSize sizeofclientsClient

acceptsListenstruct sockaddr clientiAddrSizeifsClient

INVALID_SOCKETclosesocketsListenreturn// 创建一个会话线程hThread

CreateThreadNULL0ClientThreadLPVOIDsClient0dwThreadifhThread

NULLreturnCloseHandlehThreadclosesocketsListenWSACleanupreturn再来看线程函数

的代码。 第 2 页SOCKET sock SOCKETparamchar szBuffMAX_PATHint

retwhile1ret recvsockszBuffsizeofszBuff0ifret 0breakelse ifret

SOCKET_ERRORbreakelseszBuffret ’0’switchszBuff0case ’S’: // 显示消息ret

recvsockszBuffsizeofszBuff0szBuffret ’0’ShowMessageszBuffbreakcase ’C’: // 系统

控制ret recvsockszBuffsizeofszBuff0szBuffret ’0’ret

atoiszBuffSystemControlretbreakcase ’M’: // 鼠标控制ret

recvsockszBuffsizeofszBuff0szBuffret ’0’ret

atoiszBuffMouseControlretbreakdefault:breakreturn 0接下来就是三个处理函数了,全

部贴出来。注意这几个函数都要定义成全局的,不要定义成类的成员函数,那样的

话在线程函数里面访问不到。 void ShowMessageLPCTSTR

msg ::MessageBoxNULLmsg信息MB_OKvoid SystemControlint selectswitchselectcase

0:OpenCDoor // 打开光驱breakcase 1:CloseCDoor // 关闭光驱breakcase 2:SnapScreen

// 截获屏幕breakcase 3:PreProcess // 提升进程权限RebootSystem // 重启系统

breakcase 4:PreProcessShutDown //关闭系统breakdefault:breakvoid MouseControlint

selectint i 0int nX 0int nY 0switchselect 第 3 页case 0:// 25秒内随机移动鼠标

fori 0 i

本文标签: 控制发送函数服务端功能