




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于WINSOCK控件的VC网络通讯程序马进林永君马永光吕丽霞华北电力大学仿真控制技术实验室,河北保定作者简介:马进(1971- ,男,籍贯河北任丘,华北电力大学仿真控制技术研究所工程师,工学硕士,现从事电厂负荷优化、仿真机的开发与研究工作。该程序为原国家电力公司青年促进费项目“发电厂厂级负荷优化调度”中的一部分。项目编号:SP11-2001-05-66摘要:介绍在VISCAL C+ 6.0 环境下,使用Winsock控件进行网络通讯的一种方法。Winsock控件的使用简单,可以方便地应用在使用VC+进行编程的网络通讯程序中。关键字:Winsock控件局域网 VC6.0中图分类号: 文献标识码
2、: 文章编号:引言:随着计算机技术的发展和网络的不断普及,网络通讯程序的应用越来越普遍,各种软件开发平台也为网络通讯程序的开发提供了不同形式的类和控件。在利用Visual C+ 进行开发时,可以使用Csocket类;在利用Visucal Basic 进行开发时,可以使用Winsock 控件。有关Csocket类在VC中的使用和Winsock 控件在VB中使用,已经有许多文章、资料进行的介绍,这里不再赘述。同时也应注意到,利用VC的CSocket类需要对网络通讯的机制和参数有较深的了解,需要较深的计算机知识。虽然CSocket对Winsock进行了封装,但是它的函数调用仍然比较复杂,使用起来不容
3、易。与此相反,在利用VB编程时,各种控件的使用比较简单,不需要许多的参数。利用VB中的Winsock 控件进行开发比较容易,但VB本身的功能不如VC强大,在进行开发时有时会受到一定程度的限制。在VC中利用Winsock控件的使用难度则介于上述二者之间,只需对少许一些参数做简单设置即可。如果在用VC编制程序时需要进行网络通讯而又不想花费过多的时间,在VC程序中插入Winsock控件是一种合适的方法。利用Winsock控件可以编制一个简单的通讯程序,用于局域网之间的微机通讯。1 Winsock控件的使用方法1.1通讯协议的选择Winsock控件提供了访问 TCP 和 UDP 网络服务的方便途径。采
4、用TCP协议可以提供双向的、可靠的、有序的和无重复投递的数据流。TCP允许创建和维护与远程计算机的连接,连接两台计算机就可彼此进行数据传输。用户数据文报协议(UDP 是一个无连接协议。采用UDP协议,支持双向的数据流,但不保证有序、可靠或无重复的投递。但计算机并不建立连接。在使用中,采用TCP协议的编程模型应用最为广泛,因为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方,Internet上的多数服务(WWW、FTP、Telnet、SMTP就是靠此协议运转的。采用UDP协议由于不用建立连接,传输比连接协议快,无数据纠错功能,不保证数据的可靠传递。在这里本文
5、只介绍使用TCP/IP协议进行编程的方法。1.2使用方法和主要函数Winsock控件的使用方法和步骤如下图所示。Server Winsock控件使用的一个特殊的数据类型为V ARIANT结构,其中vt的值类型说明了它所存储的数据,vt的几个主要的值类型及值域为:类型值域说明vt=VT_BSTR bstrVal 字符串类型vt=VT_I2 Ival 整数类型vt=VT_ERROR scode 错误代码在使用之前,应对V ARIANT变量的类型和值域进行赋值。一般的使用方法为: V ARIANT variant namevariant name.vt=variant typevariant nam
6、e.variant type=value例如:Cstring m_host;m_host="Room312"V ARIANT vtHost;vtHost.vt=VT_BSTR;vtHost.bstrVal=m_host.AllocSysString(;Bind(函数指定用于 TCP 连接的 LocalPort 和 LocalIP。Listen(函数设置侦听模式。该方法仅适用于 TCP 连接。Accept(在处理 ConnectionRequest 事件时用这个方法接受新连接。SendData(用于数据的发送。Close(关闭与对方的连接。Connect(要求连接到远程计算机
7、。GetData(得到远程计算机上的数据。2使用Winsock控件的局域网通讯程序2.1 Server程序利用ClassWizard建立一个ServerDemo程序,注意选择SDI,支持ActiveX,将View类设为CFormView类, 从Project->Add File->Compont and Control, 在对话框中选Registered ActiveX,选择Microsoft WinSock Control ,点击Insert按钮,依照缺省设置即可。这样在工程文件中会出现mswinsockcontrol类编辑ServerDemo程序的主对话框,可以看到在控件面版上
8、出现mswinsockcontrol类的控件。在对话框中加入控件和相应的变量,如表1所示控件 控件ID 变量名 类型Edit IDC_EDIT1 m_edit CString按钮 IDC_SENDWinsock IDC_WINSOCK1 m_server 控制Winsock IDC_WINSOCK2 m_connect 控制(1在ServerDemoView.h中,加入以下变量VARIANT localport;VARIANT localip;CString strport;CString strip;VARIANT vtCommand;CString m_command;VARIANT vt
9、Data;VARIANT vtType;VARIANT vtMaxlen;(2在ServerDemoView .cpp的构造函数中加入:localport.vt=VT_BSTR;localip.vt=VT_BSTR;strport="4000"vtCommand.vt=VT_BSTR;m_command="Server Send"vtData.vt=VT_BSTR;vtType.vt=VT_ERROR;(3利用ClassWizar映射OnInitialUpdate(的响应:在其中加入代码:localport.bstrVal=strport.AllocSy
10、sString(;localip.bstrVal=strip.AllocSysString(;m_server.Bind(localport, localip;m_server.Listen(;(4利用ClassWizar响应IDC_WINSOCK1的ConnectionRequest事件,在OnConnectionRequestWinsock1(中加入代码:if(m_connect.GetState(=0 m_connect.Accept(requestID;elseAfxMessageBox("no more connects",MB_OK;(5利用ClassWizar
11、映射ID_SEND的动作:OnSend(,在其中加入代码:m_edit.GetWindowText(m_command;vtCommand.bstrVal=m_command.AllocSysString(;m_connect.SendData(vtCommand;(6利用ClassWizar响应ID_WINSOCK2的DataArrival事件,在OnDataArrivalWinsock2(中加入代码:CString m_MBody;vtMaxlen.vt=VT_I2;vtMaxlen.iVal=bytesTotal;vtData.bstrVal=strport.AllocSysString
12、(;vtType.bstrVal=strport.AllocSysString(;m_connect.GetData(&vtData,vtType,vtMaxlen;m_MBody=vtData.bstrVal;m_edit.SetWindowText( m_MBody;(7利用ClassWizar响应ID_WINSOCK2的Close(事件,在OnCloseWinsock2(中加入代码:m_connect.Close(;(8在DestroyWindow( 中加入:m_server.Close(;m_connect.Close(;2.2 Client程序利用ClassWizard建立一
13、个ClientDemo程序,注意选择SDI,支持ActiveX,将View类设为CFormView类, 从Project->Add File->Compont and Control, 在对话框中选Registered ActiveX,选择Microsoft WinSock Control ,点击Insert 按钮,依照缺省设置即可。这样在工程文件中会出现mswinsockcontrol类。编辑ClientDemo程序的主对话框,可以看到在控件面版上出现mswinsockcontrol 类的控件。在对话框中加入控件和相应的变量,如表2所示表2控件表控件 控件ID 变量名 类型Edi
14、t IDC_EDIT1 m_edit CString按钮 IDC_CONNECT m_connect 控制按钮 IDC_SENDWinsock IDC_WINSOCK1 m_socket 控制(1在ClientDemoView.h中,加入以下变量CString m_host;CString m_port;VARIANT vtHost;VARIANT vtPort;VARIANT vtData;VARIANT vtType;VARIANT vtMaxlen;VARIANT vtCommand;CString m_command;(2在ClientDemo.cpp的构造函数中加入:m_host=_
15、T("Room312"/在程序中将“Room312”设为自己server的主机 /名m_port=_T("4000" /端口设为4000;m_command=_T("Client send"vtHost.vt=VT_BSTR;vtPort.vt=VT_BSTR;vtData.vt=VT_BSTR;vtType.vt=VT_ERROR;vtCommand.vt=VT_BSTR;(3利用ClassWizar映射ID_CONNECT的动作:在OnConnect(中加入代码: m_socket.SetRemoteHost("Room
16、312"/在程序中将“Room312”设为自己 /server的主机名m_socket.SetRemotePort(4000;vtHost.bstrVal=m_host.AllocSysString(;/见CString类字符串转化为/系统字符串vtPort.bstrVal=m_port.AllocSysString(;m_socket.Connect(vtHost,vtPort;if(m_socket.GetState(=0 /如果m_socket已经断开连接,将connect /设置为可用m_connect.EnableWindow(true;elsem_connect.Enab
17、leWindow(false;(4利用ClassWizar映射ID_SEND的动作:在OnSend:m_edit.GetWindowText(m_command;vtCommand.bstrVal=m_command.AllocSysString(;m_socket.SendData(vtCommand;(5利用ClassWizar响应ID_WINSOCK1的DataArrival事件,在 OnDataArrivalWinsock1(long bytesTotal中加入代码:CString m_MBody;vtMaxlen.vt=VT_I2;vtMaxlen.iVal=bytesTotal;v
18、tData.bstrVal=m_host.AllocSysString(; vtType.bstrVal=m_port.AllocSysString(; m_socket.GetData(&vtData,vtType,vtMaxlen; m_MBody=vtData.bstrVal; m_edit.SetWindowText(m_MBody; (6)在 DestroyWindow(中加入: m_socket.Close(; (7)利用 ClassWizar 响应 ID_WINSOCK1 的 Close 事件,在 OnCloseWinsock1( 中加入代码: m_socket.Clos
19、e(; if(m_socket.GetState(=0 m_connect.EnableWindow(true; else m_connect.EnableWindow(false; 3程序演示及结论 将 上 述 程 序 分 别 编 辑 、 连 接 为 执 行 程 序 , 生 成 serverdemo.exe 和 clientdemo.exe 文件。确认程序中主机名和 IP 地址无误。如果计算机没有连网, 可以在程序中使用本机的主机名和 IP 地址。首先运行 serverdemo.exe。它自动进 入到监听状态。 随后运行 clientdemo.exe, 点击 connect 按钮。 如果 client 与 server 连接成功,connect 按钮变为灰色(不可用) 。连接成功后,在编辑框中输入文字, 点击 send 按钮,在 serverdemo 程序的编辑框中可以看到 clientdemo 程序发送的 文字。同样,在 serverdemo 的编辑框中输入文字,点击 send 按钮,在 clientdemo 程序的编辑框中可以看到 serverdemo 程序发送的文字。 通过上述程序可以看到, MFC 的 Csocket
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兼职校医聘任协议书二零二五年
- 学校物业管理服务合同书范例
- 企业健康管理中的智能决策与数据分析应用
- 心绞痛病人的治疗及护理
- 办公室环境下食品安全管理解决方案的探索与应用
- 区块链技术在金融支付领域的应用与探索
- 健康产业崛起下的教育担当探讨医疗信息动画的作用
- 工程助理工程师年度工作总结(7篇)
- 幼儿园上学期后勤的工作总结(22篇)
- 2025大班下学期工作计划范文(22篇)
- 《电力人工智能样本存储技术要求》编制说明
- 矿车安全生产培训
- 大宗物业交易居间合同范本
- 金属热处理工(初级工)职业技能认定考试题库(含答案)
- 临床管道的风险管理
- 团员发展纪实簿
- 落实《中小学德育工作指南》制定的实施方案
- 湖南省城镇排水管道非开挖修复更新技术标准(发布稿)
- 民用无人机操控员执照(CAAC)考试复习重点题及答案
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 2024年幼儿园园务工作总结参考范文(4篇)
评论
0/150
提交评论