vc实现网络远程控制
用VC编写网络远程控制程序

用VC编写网络远程控制程序基于网络的远程控制是网络管理员和黑客都非常关注的网络技术。
在美好的网络化社会中远程控制是技术核心,比如将来可以一边坐在办公室里工作,一边通过网络打开家里的电饭锅做饭。
简单的说,网络远程控制技术就是可以由一台联网(互联网或局域网)的主机来操纵联网的另一台或多台主机。
网络管理员用它来实现网络的远程管理,黑客用它来占用别人的主机资源。
网络远程控制实现的基础就是基于网络技术开发的客户端(client)/服务器(server)程序,程序执行后,由客户端来操作服务器完成客户端的请求。
一、服务器程序在VC下新建一个基于对话框的工程MiniTrojDlg,要选择支持Winsock,然后在工程中加入自己从Csocket 派生的两个类CLisenSocket和CClientSocket,CLisenSocket类用于建立监听的Socket,CClientSocket 类用于建立通信的Socket。
CLisenSocket类对虚函数OnAccept()进行重载。
CClientSocket类对虚函数OnReceive()进行重载。
在程序中建立一个用于监听指定端口的Socket,当有客户端请求到达后,再新建一个用于通信的Socket与客户端Socket建立连接,处理客户端请求。
如果客户端请求为发送消息,则通过MessageBox函数显示该消息;如果客户端请求为执行命令,则调用WinExec函数执行相应命令;如果客户端请求为截取屏幕,则获取桌面窗口DC并用DIBAPI中函数获取图象并存为DIB对象,通过与客户端建立的连接将此DIB对象发送到客户端显示。
相关核心代码如下,详细代码请参见源程序。
ClisenSocket.h代码如下:class CMiniTrojDlg;// LisenSocket command targetclass LisenSocket : public CSocket{// Attributespublic:// Operationspublic:LisenSocket(CWnd *pWnd);virtual ~LisenSocket();// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(LisenSocket)public:virtual void OnAccept(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(LisenSocket)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:private:CMiniTrojDlg *m_pWnd;};ClisenSocket.cpp代码如下:LisenSocket::LisenSocket(CWnd *pWnd){m_pWnd=(CMiniTrojDlg *)pWnd;}LisenSocket::~LisenSocket(){}// Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(LisenSocket, CSocket)//{{AFX_MSG_MAP(LisenSocket)//}}AFX_MSG_MAPEND_MESSAGE_MAP()#endif // 0// LisenSocket member functionsvoid LisenSocket::OnAccept(int nErrorCode){m_pWnd->ProcessPendingAccept();CSocket::OnAccept(nErrorCode);}CclientSocket.h代码如下:class CMiniTrojDlg;// CClientSocket command targetclass CClientSocket : public CSocket{// Attributespublic:// Operationspublic:CClientSocket(CWnd *pWnd);virtual ~CClientSocket();// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CClientSocket)public:virtual void OnReceive(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CClientSocket)// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG// Implementationprotected:private:CMiniTrojDlg *m_pWnd;};CclientSocket.cpp代码如下:CClientSocket::CClientSocket(CWnd *pWnd){m_pWnd=(CMiniTrojDlg *)pWnd;}CClientSocket::~CClientSocket(){}// Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CClientSocket, CSocket)//{{AFX_MSG_MAP(CClientSocket)//}}AFX_MSG_MAPEND_MESSAGE_MAP()#endif // 0// CClientSocket member functionsvoid CClientSocket::OnReceive(int nErrorCode){m_pWnd->ProcessPendingRead();CSocket::OnReceive(nErrorCode);}在CminiTrojDlg.cpp中添加以下代码:BOOL CMiniTrojDlg::OnInitDialog(){ // 系统初始化CDialog::OnInitDialog();SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);m_nPort=886;pLisen=new LisenSocket(this);if(!pLisen->Create(m_nPort)){AfxMessageBox(IDS_CREATEFAILED);}else if(!pLisen->Listen()){AfxMessageBox(IDS_LISTENFAILED);}elsereturn TRUE;//Ok,服务器正在帧听...arIn=NULL;arOut=NULL;return TRUE;}// -- 在此函数接收客户程序的连接请求--void CMiniTrojDlg::ProcessPendingAccept() {pClient=new CClientSocket(this);if(pLisen->Accept(*pClient)){Socketfile=new CSocketFile(pClient);arIn=new CArchive(Socketfile,CArchive::load); arOut=new CArchive(Socketfile,CArchive::store); }else{delete pClient;pClient=NULL;}}// -- 在此函数接收客户程序发送的数据--void CMiniTrojDlg::ProcessPendingRead(){CString TempReceive;if(arIn->IsBufferEmpty()){*arIn>>TempReceive;if(TempReceive.Left(1)=='m'){ //接收的是消息TempReceive.Delete(0,2);MessageBox(TempReceive,"提示信息",MB_OK); }else if(TempReceive.Left(1)=='c'){ //接收的是命令TempReceive.Delete(0,2);WinExec(TempReceive,NULL);}else if(TempReceive.Left(1)=='g'){ //接收的是关机命令::ExitWindowsEx(EWX_POWEROFF,0);}else if(TempReceive.Left(1)=='r'){ //接收的是注销命令::ExitWindowsEx(EWX_REBOOT,0);}else{ //接收的是捕获屏幕命令CWnd * m_pWnd=GetForegroundWindow();ASSERT(m_pWnd!=NULL);CDC * pdc_Showed=m_pWnd->GetDC();CRect rect;m_pWnd->GetClientRect(rect);int height,width,i,j;height=rect.Height();width=rect.Width();LPSTR lpDIBCopy;HDIB m_CopyDIB=CreateDIB(width,height,8);lpDIBCopy=(LPSTR) ::GlobalLock((HGLOBAL)m_CopyDIB);BITMAPINFO * bminfo=(BITMAPINFO *)lpDIBCopy;for(i=0;i<=255;i++){bminfo->bmiColors.rgbBlue=i;bminfo->bmiColors.rgbRed=i;bminfo->bmiColors.rgbGreen=i;bminfo->bmiColors.rgbReserved=0;}LPSTR lpDIBCopyBits=::FindDIBBits(lpDIBCopy);int tWidthBytes=WIDTHBYTES(width*8);COLORREF bmpdat;unsigned char pixel;for(i=0;i<height;i++){for(j=0;j<width;j++){bmpdat=pdc_Showed->GetPixel(j,height-i);pixel=(unsignedchar)((float)GetBValue(bmpdat)*0.299+(float)GetGValue(bmpdat)*0.587+(float)GetRValue(bmpdat)*0.11 4);lpDIBCopyBits[i*tWidthBytes+j]=pixel;}}*arOut<<height;*arOut<<width;arOut->Write(lpDIBCopy,(54+256*4+height*width));arOut->Flush();}}}二、客户端程序在VC下新建一个基于对话框的工程CTrojClient,也要选择支持WinSock,然后在工程中加入自己从Csocket派生的类CClientSocket,此类与服务器程序中建立的CclientSocket类相同。
利用VC++6.0实现网络远程控制技术

摘要对于广大电脑爱好者来说远程控制软件并不陌生。
远程控制是管理人员在异地通过计算机网络,异地拨号或双方都接入Internet等手段,连接目标计算机,并通过本地计算机对远程计算机进行管理和维护的行为。
远程控制既可以作为黑客攻击手段之一,也可以作为远程维护,在家办公等应用领域的支持工具。
随着网络技术的进一步发展,网络速度越来越快,远程控制技术支持将逐渐占据技术支持的主流。
本文针对远程控制的概念以及软件的编写问题进行了详尽、深入的分析、研究。
本文首先阐述了远程控制的概念、远程控制软件的发展前景以及它与黑客和木马程序区别;其次介绍了远程控制软件实现所必须的网络协议、Socket编程的基本概念和Windows消息系统;最后讲解了利用VC++6.0编写一个完整的远程控制软件,包括客户端程序、被控制端程序的实现过程。
关键字:远程控制、VC++6.0、网络协议、客户端、服务器端AbstractSay the long range control software for the large computer fancier not unfamiliar. The long range control is a manager to pass the calculator network in the foreign land, the foreign land stirs the number or both parties to all connect into the Internet to wait the means, link the target calculator, and pass the native calculator to carry on the behavior of management and maintenance to the long range calculator. The long range control since can be one of an attack means, can also be the long range maintenance, at home support tool that transacts to wait the applied realm. Along with the technical further development of network, the network speed is more and more quick, the long range of control the technique support and will occupy the main current of the technique support gradually.This text wrote the problem to carry on to the concept of the long range control and the plait of the software detailed, thorough of analysis, research. This text elaborated that the concept, long range of the long range control controls the development foreground of the software first and it with black guest and the wood horse procedure differentiation; Introduced the long range to control the software realization the next in order must of network agreement, the Socket weaves the basic concept of the distance and News system of Windows; Explained in detail to make use of the VC++6.0 finally the long range that plaits write an integrity controls the software, including the customer to carry the procedure and is control to carry the procedure to carry out the process.Key word: The long range control, VC++6.0, the network negotiate, the customer carry, the server carry第一章远程控制概述1.1远程控制的概念远程控制软件已经使用很多年了,起初是为了让PC用户在离开办公室的时候能够访问其台式PC硬盘中的信息,甚至可以通过其台式机PC访问企业网络资源。
用C++Builder+6.0实现远程控制

FormCjose(T0bJect 。Sender,
图1客户端设计窗体图
fI cs一>Actlve==true) cs >Act【ve=false cs~>C ose(), }
●在(:0nnrrIBtn的‘J}u州,l ln8pPcIt·r“0 h㈨l面皈双击
燃 万方数据
凌蕊辫嚣羧瑟篱黪羚
吣戮脑螭程嚣主护
喜麓季袭篙譬≯善嚣慧羔
属性值为“发送警告信鲁”。
挣件名髂
Ⅳ?
m
表2控件事件表
掭加事竹
在0nch自·事什中捺加rrnmlchse匾敬,尉于在直用
程序退出时停止当前连接。
在oncu吐事什中黍加c—tcuck函彀.用干下进
洼接搜置指争。
在0Ⅱchc★事件中1蠡古u nsc…们·A面教,用于下
造断¨莲接指夸。
在0--a·rk事件中僚加N2a—rk函数用于执行消隐 桌自指争。
在0ucKd事件巾掭加N3ckk函敦.用于执行恢复 桌面指夸
在0口cⅡrL事件中添加J4c姒西教,用于执行消臆
工肄条指夸。
存0nairk事件中舔打H5d-“止数,用于执行恢复 工具条指争。
在OncⅡ畦事什中螽加晰cl她函蕺,用于执行删腺 墙纸指夸.
件上单贵鼠标右链,在弹出的菜单中 选择Hpw Bu帅n项,俄扶舔加c¨Ⅱ.
】"c出tⅡDl……tBm
工具条上的按钮控件
属于no仙umⅢ粪
上具夺}的按钮控件:
属T nmumn类
主黉盟衍什捧件
属于1砌ⅡMe删樊
土菜单中子菜单项R: 属丁1MeⅡdlrm娄
用丁下达莲接远程主机指令,凸口-uu 属性设为“连接。。
在0Dc删事件中器加(:sc。mM
。在c…-t时触发的消息。
C语言智能家居控制系统开发

C语言智能家居控制系统开发智能家居控制系统是当前智能家居领域的热门话题之一,通过利用C语言开发智能家居控制系统可以实现对家居设备的远程控制和自动化管理。
在本文中,我们将探讨如何利用C语言开发智能家居控制系统,并介绍一些相关的技术和方法。
首先,开发智能家居控制系统需要明确系统的功能需求和设计目标。
智能家居控制系统通常包括以下功能:远程操控家居设备、实时监控家居环境、自动化调控家居设备等。
在设计系统架构时,可以采用模块化设计的方式,将不同功能组件进行分离,方便管理和维护。
其次,在利用C语言开发智能家居控制系统时,需要考虑设备与系统的通讯方式。
目前常用的通讯方式包括Wi-Fi、蓝牙、Zigbee等,可以根据具体需求选择适合的通讯方式。
在进行通讯开发时,需要注意数据的加密和安全性,确保系统的稳定和可靠性。
另外,智能家居控制系统的界面设计也是开发过程中需要重点关注的部分。
用户友好的界面设计能提升系统的易用性和用户体验。
可以采用图形化界面或者命令行界面,根据用户需求设计不同的界面风格和交互方式。
在系统开发过程中,可以借助开源库和框架来加快开发速度和提高系统性能。
例如,可以使用Arduino、Raspberry Pi等开源硬件平台搭建智能家居控制系统,同时借助相关的C语言库和API进行开发。
此外,智能家居控制系统还需要考虑到系统的可扩展性和兼容性。
随着智能家居设备的种类不断增加,系统需要支持不同品牌和型号的家居设备,同时保证系统的扩展和升级不会影响系统的稳定性。
最后,在系统开发完成后,需要进行系统的测试和优化,确保系统能够正常运行和满足用户需求。
可以利用模拟环境和实际家居设备进行测试,发现并解决系统中存在的问题和bug。
同时,对系统的性能进行优化,提高系统的响应速度和稳定性。
综上所述,利用C语言开发智能家居控制系统是一项技术挑战和创新实践。
通过合理设计系统架构、选择合适的通讯方式、设计用户友好的界面和进行系统测试优化,可以开发出高性能、稳定可靠的智能家居控制系统,为用户带来便利和舒适的家居生活体验。
多媒体中控系统网络控制的软件设计

多媒体中控系统网络控制的软件设计作者:陈为昊来源:《电脑知识与技术》2013年第35期摘要:随着计算机网络与通信技术,以及多媒体等技术不断成熟完善,传统的教育手段和方式已经不适应现代化的需要。
智能网络多媒体教室中央控制系统给校园教学的信息化管理带来了变革,其智能化和网络化给教学活动和对设备的集中管理带来了很大的便利。
在设备管理中,任务都是通过网络来进行执行的,因此中控系统的网络控制部分起着很重要的作用。
该课题采用VC编程实现了中控系统的网络控制部分,并配合硬件调试系统成功。
关键词:多媒体;网络控制;TCP/IP中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)35-8090-041 概述现今,多媒体教育、多媒体网络教学已经被普遍地运用于全国各大校园中。
在智能网络多媒体教室的中控系统中,网络控制系统占据核心地位。
在实际的应用中,将各个教室或会议厅的网络系统接入以太网,在远程监控计算机上安装相应软件。
打开软件,便可以建立与所有接入网络的网络系统的连接,并对基于网络所连接的投影机、功放、话筒、计算机、电动屏幕、电动窗帘、灯光等多媒体设备进行网络控制和管理,其中包括设备的使用状态查询和断线报警等。
本课题主要谈论整个系统中的网络控制部分,要结合前端的控制硬件设备配合完成整个中控系统。
2 系统的总体结构在智能网络多媒体教室的中控系统中,教室的中控作为整个系统的桥梁包含了两个部分,一部分是网络控制模块,另一部分是管理监控模块。
网络控制模块通过TCP/IP在校园网传输数据到多媒体中央控制室,并从那里接收数据转发给管理监控模块。
管理监控模块[1]在收到来自网络控制模块的数据后做出相应的设备处理工作。
网络控制模块通过RS-232串口协议通信,教室的计算机与网络控制模块通过TCP/IP协议通信完成计算机上软件实现设备控制的通信。
网络控制模块含独立的网卡[2],可以通过多媒体网络中央控制室直接控制教室的设备。
计算机远程控制技术原理与实现方法

计算机远程控制技术原理与实现方法随着计算机技术的不断发展,远程控制技术逐渐成为了大家生活和工作中不可或缺的一部分。
无论是个人用户还是企业用户,远程控制技术都可以为其带来极大的便利和效益。
远程控制技术是指用户可以远程控制他人计算机或设备的技术。
本文将围绕计算机远程控制技术的原理和实现方法展开探讨。
计算机远程控制技术的原理主要包括两个核心部分:远程控制协议和远程控制软件。
1. 远程控制协议远程控制协议是计算机远程控制的基础,它规定了远程控制过程中数据的传输格式、通信协议等关键信息。
常见的远程控制协议有VNC(Virtual Network Computing)、RDP (Remote Desktop Protocol)和TeamViewer等。
VNC是一种基于TCP/IP协议的远程控制协议,它允许用户通过网络远程控制另一台计算机,并在远程计算机上执行相应操作。
RDP是一种由微软公司开发的远程桌面协议,通过RDP协议,用户可以将本地计算机的桌面显示在远程计算机上,并对其进行操作。
TeamViewer则是一种广泛应用的远程控制协议,它可以实现跨平台、跨设备的远程控制。
远程控制软件是实现远程控制协议的具体工具,它通过将用户输入的操作指令封装成远程控制协议规定的数据格式,并通过网络传输到远程计算机。
远程控制软件还能够解析远程计算机发送过来的数据,并将其还原成本地计算机能够理解的操作指令。
常见的远程控制软件包括VNC Viewer、Microsoft Remote Desktop和TeamViewer等。
这些软件为用户提供了直观、便捷的远程控制操作界面,并且支持多种远程控制协议,能够满足用户在不同场景下的远程控制需求。
计算机远程控制技术的实现方法主要涉及远程控制软件的安装和配置,以及网络环境的设置。
下面将分别对这两个方面进行具体介绍。
1. 远程控制软件的安装和配置在安装完成后,用户需要对远程控制软件进行相应的配置,以确保远程控制功能能够正常使用。
VC++环境下Agilent信号源远程操控设计

器 的网络接 收命 令 服务 项打 开 。
12 P . C准 备
些 详细参 数 , 以达 到 利用 P C远 程 控 制 该 仪 器 的 目
首 先安 装 随仪 器 配 发 的 A in I irr sSi getO Lbae ut l i e 软件 , 软件 内包 含 了相关 接 口的一些 库 文 件 和一 个 1 0
安 晶晶, 陈钟荣 , 王晟博 , 潘旭光 , 蔡俊峰
( 南京信 息 工程 大学 大气物理 学院 , 苏省 南京 市 2 04 ) 江 104
摘 要: 由于使 用 A i n 仪 器时 需要 复 杂 的仪 器相 关操 作 知识 , 且在 特 定环境 下 需要 对仪 器进 g et l 并
行远程 联 网操作 , 因此仪 器 实际使 用 时有诸 多不便 。文 中提 出了一种 在 V + 境 下 利 用 A i n V . C +环 get I l
0 引
言
进入 2 世 纪 以来 , 1 计算 机技 术在 各个 领域都 得 到
了大 规模 的使 用 。各 仪 器厂 商为 了方 便客 户更 好地 利 用 自己 的产 品进行 相关 工 作 , 开发 了许 多仪 器 与 计 算
机交 互 的平 台 , 仪 器 的 各 项 功 能 得 到 更 好 的发 挥 。 使 A i n 公 司是 世 界 知 名 的信 号 仪 器 开 发 厂 商 , gl t e 同样 , 它也 为客户 开发 了 V S 虚 拟 仪 器 软 件 架 构 ) V S IA( 、 IA C M 和 SC O IL三种 编程 输入 输 出接 口。通 过 这 三种 接
选项 均设 为 o , T evcs n F PS ri 设为 o 。 e n 选择 Po ed Wi eo f ua o rce t R cn g rt n重 新 载 入 相 关 h i i
基于SOCKET技术的几种远程控制功能的实现

第20卷第8期长春大学学报Vol.20No.82010年8月JOURNAL OF CHANGCHUN UNIVERSITY Aug.2010收稿日期:2010-06-21作者简介:刘玉宝(1975-),男,吉林榆树人,讲师,博士研究生,主要从事嵌入式系统,智能控制,软件工程等方面的研究。
基于SOCKET 技术的几种远程控制功能的实现刘玉宝1,祝海英2,张良和1(1.长春大学软件学院,吉林长春130022;2.长春职业技术学院信息技术分院,吉林长春130033)摘要:远程控制可以作为远程维护,远程办公等应用领域的支持工具。
本系统采用VC ++进行设计和制作,控制端与服务端连接后实现被控端的服务控制功能、进程管理功能、屏幕截取及控制功能,以便进行计算机远程管理和维护。
关键词:远程控制;主控端;被控端;C /S 模式中图分类号:TP311.1文献标志码:A 文章编号:1009-39072010)08-0084-040引言远程控制的原理很简单:本地机直接启动运行的主控端程序,并拥有与被控端主机使用者相同的权限。
因此,如果能够启动服务器端的被控端程序,就可以使用相应的客户端程序直接控制主机。
也就是说,客户端就相当于一个超级用户,可以直接控制远程服务端计算机。
1远程控制原理简单远程控制系统由主控端和被控端两部分组成。
主控端用于实施各种对连网计算机的监控操作,被控端对于接收到的数据进行分析,解释并执行[1],在Windows 环境下即可实现。
本系统采用面向连接的服务实现控制信息的传输。
面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器。
使用面向连接的套接字编程,可以通过图1来表示。
其客户端和服务端的连接的连接过程如下:图1面向连接的服务时序图首先,应该是客户端的应用程序先启动,并启动接收数据的线程。
等待接收一串数据。
服务端将数据发送给指定IP 地址的客户端。
客户端端接收到该数据后,保存该申请远程服务的客户端系统的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《网络程序设计》课程设计报告书题目:vc实现网络远程控制专业:网络工程Vc网络远程控制软件摘要:本文主要探讨在VC编程环境下利用Socket实现网络远程控制,本文编制的服务器与客户端程序可以实现基本的网络远程控制功能,如发送消息、执行命令、远程关机、重启和截取屏幕等,也算是一个简单的木马程序。
关键词:远程控制网络管理socket基于网络的远程控制是网络管理员和黑客都非常关注的网络技术。
在美好的网络化社会中远程控制是技术核心,比如将来可以一边坐在办公室里工作,一边通过网络打开家里的电饭锅做饭。
简单的说,网络远程控制技术就是可以由一台联网(互联网或局域网)的主机来操纵联网的另一台或多台主机。
网络管理员用它来实现网络的远程管理,黑客用它来占用别人的主机资源。
网络远程控制实现的基础就是基于网络技术开发的客户端(client)/服务器(server)程序,程序执行后,由客户端来操作服务器完成客户端的请求。
一、服务器程序在VC下新建一个基于对话框的工程MiniTrojDlg,要选择支持Winsock,然后在工程中加入自己从Csocket派生的两个类CLisenSocket和CClientSocket,CLisenSocket类用于建立监听的Socket,CClientSocket类用于建立通信的Socket。
CLisenSocket 类对虚函数OnAccept()进行重载。
CClientSocket类对虚函数OnReceive()进行重载。
在程序中建立一个用于监听指定端口的Socket,当有客户端请求到达后,再新建一个用于通信的Socket与客户端Socket建立连接,处理客户端请求。
如果客户端请求为发送消息,则通过MessageBox函数显示该消息;如果客户端请求为执行命令,则调用WinExec函数执行相应命令;如果客户端请求为截取屏幕,则获取桌面窗口DC并用DIBAPI中函数获取图象并存为DIB对象,通过与客户端建立的连接将此DIB对象发送到客户端显示。
5.2 WINDOWS套接字5.2.1基本概念套接字(socket)是一种网络编程接口,它是对通信端的种抽象,提供了一种发送和接收数据的机制。
通讯的基石是套接口,一个套接口是通讯的一端。
在这一端上你可以找到与其对应的一个名字。
一个正在被使用的套接口都有它的类型和与其相关的进程。
套接口存在于通讯域中。
通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。
套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。
Windows Sockets规范支持单一的通讯域,即Internet域。
各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。
5.2.2套接口网络编程原理套接口有三种类型:流式套接口,数据报套接口及原始套接口.流式套接口定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输.数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错.原始套接口允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等.无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。
若使用无连接的套接口编程,程序的流程可以用下图表示。
面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器。
使用面向连接的套接口编程,可以通过下图来表示:其时序套接口工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。
客户在建立套接口后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据.最后,待数据传送结束后,双方调用close()关闭套接口。
这主要的两种套接字采用API调用的方式进行编程,若直用接来编程在一定程度上并不轻松,因此现在的大量运用了MFC封装的类。
5.3 MFC WINSOCK类及应用为了简化WINSOCK编程,使用户专注与应用程序算法的设计,Microsoft的基类库(MFC)提供了两个WinSock类,这两个类在不同程度对WinSock API进行了封装,在编程时使用经过封装的MFC 类使编程工作大大简化。
这两个类分别是CAsyncSocket和Csocket,CasyncSocket类是很低程度对API进行的封装,他提供了低级接口几乎和WinSock的API函数直接调用。
而Csocket类是从CAsyncSocket派生而来,它提供了高一级的抽象处理套接字通信。
最重要的是还允许用户使用与Csocket类相关的Carchive对象和CsocketFile对象,在应用程序之间传送C++对象和数据。
5.3.1与Csocket一起使用CsocketFile类和Carchive类考虑到SuperICQ的客户/服务通信使用了TCP协议,而基本套接字都支持TCP协议,MFC封装过的套接字在应用上提供了更加方便的方法,尤其是高级类Csocket,它允许用户在连接两端通过Carchive对象进行数据传输,在其两端必须规定统一序列化。
在使用Carchive类之前,必须创建一个特殊的基于CsocketFile类的文件对象,CsocketFile类是从文件派生出来,他通常和Csocket类一起使用,主要功能是帮助数据的传输。
在使用Carchive对象和CsocketFile对象和套接字一起数据传输时间,用户并不需要直接调用Csocket类的数据传输成员函数。
在放送端,用户只需要将需要的传输的数据插入到已经创建的用于发送数据的Carchive对象,Carchive对象会将数据进一步传输到CsocketFile对象中,再由套接字发送数据。
接收端,进行反向操作,最终由应用程序从用于接收数据的Carchive对象中析取所需要的数据。
传输图如下:在上述内容中,向Carchive对象插入和析取数据对象的操作和平时的在序列化操作中是一样的,仍然使用了插入操作符<<和析取操作符>>,但是在Csocket使用过程中,必须创建两个独立的Carchive对象,一个用Carchive::load属性创建,用来接收数据,另一个用Carchive::store创建,用来发送数据。
这两个Carchive对象可以共享一个CsocketFile对象和套接字。
当想要发送的数据都写入Carchive对象中以后,必须调用Carchive::Flush()函数来刷新Carchive对象的缓冲区。
5.3.2 Csocket使用的编程模型高级类Csocket的使用确实比CAsyncSocket方便许多,因为CasyncSocket相当于API的直接调用。
最重要的是Csocket类提供了阻塞调用的功能,这对于Carchive来进行同步传输是最基本的要求。
Csocket类中的Receive()、Send()、ReceiveFrom()、Accept()等,在不能立即发送或者接收的时候,不会返回WSAEWOULDBLOCK错误,它们会等待直到操作结束。
结合Carchive的特点,编程模型如下:对于服务器应用程序,在创建时很重要的一点是要指定一个公认的端口号,只有指定了端口号,客户机应用程序才能正确发送连接请求。
服务器侦听到到连接后,要专门创建一个用于连接的套接字,在这里是sockRecv对象,该套接字专门用来连接和数据传输。
5.4 CSocket在SuperICQ中的应用本系统决定使用Csocket和CsocketFile加Carchive结构,其结构应该在整个系统中充当连通客户机和服务器的桥梁,收到客户的数据后,首先将接收的数据进行Carchive序列化,转化成C++数据,交于主程序,然后由主程序进行处理,有主程序决定是否存储数据库或者向客户返回消息。
服务器端基本数据流如下:可见,套接字是整个数据流向的核心,起到数据的转接作用,他的性能直接关系到整个系统的性能,而其的处理速度则是关键因素。
因为服务器处理可能十分繁忙,接在服务器端口的机子数量不可以估量,而主机对数据的处理能力十分有限制,剩下的可操作的方法就是对需要进行序列化的数据尽量的简单,尽可能缩减需要序列化的数据数量,对于能够重用的数据类型应该重用,这也是系统对性能的需求。
比如CString 对象,我们可以对它进行重复的利用,它即可以传输人的名字,也可以传输人的自我介绍,甚至是SQL语句的字符串,比如一个有3个类型数据的消息,我们可以这样使用:{int age;CString name; -----------也可以填充为SQL字符串BOOL state;}我们可以用name数据类型填充为SQL字符串,不过这在服务与客户事先要约定好,如果不这样做,我们必须多出一个CString SQL 类型,传送给服务器,即使不使用这个字段,我们仍然要传送它,这是Carchive序列化的要求。
SuperICQ的CSocket设计基本遵循CSocket的编程模型,基本过程如下:①.创建侦听套接字,等待客户连接②.连接后创建与客户对连套接字。
③.利用线程接收用户数据,序列化后交与线程处理。
④.将返回的数据序列化后,在线程中发送给用户。
⑤.若用户下线,删除与用户连接的套接字。
在客户端没有侦听套接字,它有连接套接字,负责和服务端的发送和接收任务,它还有数据报套接字,负责客户与客户之间的通信。
5.4.1 服务端的套接字在服务端除了侦听套接字,还必须要与每个客户相连的连接套接字。
①侦听套接字侦听必须拥有一个客户端都公认的端口,以确定连接,这里将其设定为8888。
侦听的创建基本和CSocket原类差不多,因其任务较简单,由CSocket派生出ClisteningSocket类,只重载了OnAccept函数,函数如下:void CListeningSocket::OnAccept(int nErrorCode){CSocket::OnAccept(nErrorCode);//调用主对话框类中的函数m_pDlg->OnAccept();}这里对于要连接的客户,将调用主对话框进行处理。
侦听的创建如下:#define ServerPort 8888CListenSocket *m_listen=new CListenSocket(this);if(m_listen->Create(ServerPort,SOCK_STREAM,(LPCTSTR)m_ser veradd))// SOCK_STREAM为数据流套接字,m_serveradd为要绑定的ip地址m_listen->Listen();创建的Create函数若成功将返回非0,成功创建后,调用CSocket 的Listen函数创建侦听,侦听端口一直处于工作状态,若有客户请求连接,将创建连接套接字与之相连。