4.7tcp服务器应用开发示例服务器端_第1页
4.7tcp服务器应用开发示例服务器端_第2页
4.7tcp服务器应用开发示例服务器端_第3页
4.7tcp服务器应用开发示例服务器端_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MiniARM M3350UM01010101V1.00Date: 2013/02/09产品 用户手册类别内容TCP、epcTCPIP摘 要介绍User ManualMiniARM M3350修订历史i版本日期原因V1.002013/02/09创建文档MiniARM M3350目录1. TCP服务器应用开发示例11.11.2示例目标1示例步骤1建立和配置工程1绘制框1添加代码21.2.11.2.21.2.31MiniARM M33501. TCP服务器应用开发示例本节举例说明如何使用 epcTCPIP示例目标包,进行 TCP 服务器端应用程序的开发。1.1MINIARM M3350 工控机主板

2、上面提供了 Windows Embedded Compact 7 操作系统中的TCP/IP开发包。此应用开发示例通过 VS2008 编写一个运行于 MINIARM M3350 上面的 WindowsEmbedded Compact 7 操作系统中的应用程序。此应用程序通过使用 epcTCPIP包来实现TCP 客户机的通讯。此应用程序可以让以太网上面的任何一台 TCP 客户机,跟 MINIARMM3350 上的以太网适配器,进行 TCP 服务器的通讯。MINIARM M3350 工控机主板上提供的 epcTCPIP包的使用见epcTCPIP包使用说明。1.2示例步骤下面详细说明本示例的建立、代码

3、编写、运行等过程。1.2.1建立和配置工程(1) 新建工程。在 VS2008 里面新建一个 MFC 智能设备应用程序的工程,工程名为tcp_server。程包含 Windows(2) 添加 epcTCPIPSDK 类型为“M3350_SDK”,应用程序类型为“基于套接字属性,资源语言选择“中文(中国)”。包到工程。框”,工1.2.2绘制框(1)框,如图 1.1所示。在资源视图里面的框资源下面绘制图 1.1 TCP 服务器框(2)更改相关控件ID。框上面的控件命名如下表 1.1所示。1MiniARM M3350表 1.1各控件属性列表(3) 给框一些控件添加成员变量,如表 1.2所示。表 1.2

4、 添加成员变量添加代码头文件的配置在 tcp_serverDlg.h 文件包含头文件 epcTCPIP.h。在 tcp_serverDlg.h 文件开始,宏定义用户接收数据缓冲区大小,2#define RX_BUF_SIZE 100变量类型ID变量名CComboBoxBO_localipm_localipIDC_EDIT_localportm_localportCEditIDC_EDIT_remoteportm_remoteportCEditIDC_EDIT_remotipm_remoteipCEditIDC_EDIT_rxm_rxCEditIDC_EDIT_txm_txCButtonIDC_

5、BUTTON_openm_open控件名称标题ID说明下拉列表框(Edit Box)BO_localip本地IP 地址列表编辑框(Edit Box)IDC_EDIT_localport本地端编辑框(Edit Box)IDC_EDIT_remotipIP 地址编辑框(Edit Box)IDC_EDIT_remoteport端编辑框(Edit Box)IDC_EDIT_rx数据接收窗口编辑框(Edit Box)IDC_EDIT_tx数据发送窗口按钮(Button)启动IDC_BUTTON_open启动TCP 服务器按钮(Button)停止IDC_BUTTON_close关闭此次连接按钮(Butto

6、n)清空IDC_BUTTON_rxclr清空数据接收窗口按钮(Button)清空IDC_BUTTON_txclr清空数据发送窗口按钮(Button)发送IDC_BUTTON_send发送数据MiniARM M3350注意,此宏定义应该小于 1460。也就是小于宏“ DATA_LEN_MAX”。然后在“CTcp_serverDlg”类中添加公有属性,如程序1.1所示。程序1.1 在框类中添加的属性程序程序程序1.1 (1):定义一个TCP/IP服务的句柄;1.1 (2):定义一个用户接收数据缓冲区;1.1 (3):定义用户接收数据缓冲区游标。(2)用户接收数据回调函数,如程序1.2所示。程序1.

7、2TCP 服务器接收数据回调函数代码3void mytcpipReceivedata (void*pvOutput,unsigned longulIpaddr,unsigned shortulPort,char*pcData,unsigned shortusDatalength)CTcp_serverDlg *cupdlgTmp = (CTcp_serverDlg *)pvOutput;(1) CString csTmpstr;if (usDatalength = TCP_TERMINATE | usDatalength = ERR_RX_THREAD) (2) cupdlgTmp-m_ope

8、n.EnableWindow(true);cupdlgTmp-m_localip.EnableWindow(true);CEdit *ceditTmp = (CEdit *)cupdlgTmp-GetDlgItem(IDC_EDIT_localport); ceditTmp-EnableWindow(true);cupdlgTmp-m_remoteip.EnableWindow(true); cupdlgTmp-m_remoteport.EnableWindow(true); return;if (usDatalength = TCP_CONNECTED) (3)csTmpstr.Format

9、(_T(%d.%d.%d.%d), ulIpaddr&0 xff, (ulIpaddr 8) & 0 xff,(ulIpaddr 16) & 0 xff, (ulIpaddr 24) & 0 xff);public:HANDLEctcpipLocal;(1)unsigned short pusRxbufRX_BUF_SIZE;(2)unsigned short usIndex;(3)MiniARM M3350程序1.2 (1):转换用户指针参数pvOutput的数据类型为当前窗口的指针。以前对窗口进行操作;程序1.2 (2):如果epcTCPIP包里面的线程出错后者连接终止,启动框上相应控件;

10、程序1.2 (3):如果有接已经建立,刷新框上面的IP地址和端信息;程序1.2 (4):判断用户接收缓冲区是否溢出。如果是,弹出警告的数据;框,丢掉接收到程序1.2 (5):将接收到的数据从字节型换为宽字符类型,以便用户界面能够正确显示;程序清单 1.2 (6):让接收到数据的最后一个半字节为 0,以便字符串显示的时候比较正常;程序程序1.2 (7):在框的数据接收窗口显示从以太网接收到的数据;1.2 (8):移动用户接收数据的缓冲区游标。(3)编写框的初始化代码,如程序1.3所示。程序1.3 TCP 服务器示例的框初始化方法4cupdlgTmp-m_remoteip.SetWindowTex

11、t(csTmpstr); csTmpstr.Format(_T(%d), ulPort);cupdlgTmp-m_remoteport.SetWindowText(csTmpstr); return;if (cupdlgTmp-usIndex + usDatalength) RX_BUF_SIZE) (4) MessageBox(NULL,_T(Receive Buf is Full!),_T(Warning), MB_ICONHAND);return;MultiByteToWideChar(CP_ACP,0,pcData, usDatalength,&cupdlgTmp-pusRxbufcu

12、pdlgTmp-usIndex,usDatalength);(5)cupdlgTmp-pusRxbufcupdlgTmp-usIndex+usDatalength = 0;(6)cupdlgTmp-m_rx.SetWindowText(cupdlgTmp-pusRxbuf);(7)cupdlgTmp-usIndex = (unsigned short)(cupdlgTmp-usIndex + usDatalength);(8)MiniARM M33505BOOL CTcp_serverDlg:OnInitDialog()CDialog:OnInitDialog();/ Set the icon

13、 for this dialog. The framework does this automatically/ when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE);/ Set small iconCenterWindow(GetDesktopWindow(); / center to the hpc screenunsigned longulLocalip6;(1)iIpnum = 0;ctcpipLocal = epc

14、ProtocolInit(ulLocalip,&iIpnum, RX_BUF_SIZE,mytcpipReceivedata,this);(2)if (ctcpipLocal = NULL) (3)epcProtocolExit(ctcpipLocal); return 0;i;CString csTmpstr;for (i=0; i 8) & 0 xff, (ulLocalipi 16) & 0 xff, (ulLocalipi 24) & 0 xff);this-m_localip.AddString(csTmpstr);this-m_localip.SetCurSel(0);(5)thi

15、s-usIndex = 0;(6)this-m_localport = 1024;(7)this-m_remoteport.SetWindowText(_T(0);(8)this-m_remoteip.SetWindowText(_T(0.0.0.0);(9)UpdateData(false);(10)return TRUE; / return TRUE unless you set the focus to a controlMiniARM M3350程序程序1.3 (1):本地IP地址列表缓冲区;1.3 (2):调用epcTCPIP包的服务初始化函数,初始化本地TCP/IP服务。传递用户接

16、收数据缓冲区大小和回调含函数指针到epcTCPIP包中,得到本地IP地址列表;程序1.3 (3):如果构造函数返回本地IP地址列表为NULL,说明构造函数执行失败。删除此对象,错误返回;程序清单 1.3 (4):将 32 位的IP地址转换为点分式的IP地址格式;程序程序程序程序程序程序1.3 (5):添加得到的IP地址列表到框的“本地IP地址”的下拉列表框;1.3 (6):初始化用户接收数据缓冲区游标;1.3 (7):初始化本地端为 1024;为 0;1.3 (8):初始化1.3 (9):初始化端IP地址为“0.0.0.0”;1.3 (10):刷新对话框。(4)框“启动”按钮单击事件,如程序1

17、.4所示。程序1.4 “启动”按钮单击事件代码6void CTcp_serverDlg:OnBUTTONopen()unsigned shortpusTmpip16; usTmplen = 0;charpcTmpip16;unsigned long ulTmplocalip= 0; unsigned long ulTmpremoteip = 0; unsigned short ulTmpremoteport = 0; boolbTmpret = false;usTmplen = this-m_localip.GetWindowText(pusTmpip, 16);(1) WideCharToM

18、ultiByte(CP_ACP,0,pusTmpip, usTmplen, pcTmpip, usTmplen, NULL,NULL);(2)pcTmpipusTmplen = 0;ulTmplocalip = inet_addr(pcTmpip);(3)UpdateDrue);MiniARM M3350程序程序程序程序1.4 (1):1.4 (2):1.4 (3):1.4 (4):从框得到用户选择的本地IP地址;把宽字符串转换为字符串类型的数组;将点分式的IP地址类型转换为 32 位的IP地址类型;epcTCPIP包的启动函数epcProtocolStartup (),以TCP服务器的方式启

19、动服务;1.4 (5):程序如果协议启动成功,禁用框相关控件。(5)框“停止”按钮单击事件,如程序1.5所示。程序1.5 TCP 服务器“停止”按钮单击事件代码1.5 (1):1.5 (2):1.5 (3):1.5 (4):退出TCP/IP服务;程序程序程序程序启动启动启动框“启动”按钮;框“本地IP地址”下拉框;框“本地端”编辑框;7void CTcp_serverDlg:OnBUTTONclose()epcProtocolExit(ctcpipLocal);(1)this-m_open.EnableWindow(true);(2)this-m_localip.EnableWindow(tr

20、ue);(3)CEdit *ceditTmp = (CEdit *)GetDlgItem(IDC_EDIT_localport);ceditTmp-EnableWindow(true);(4)this-EndDialog(0)bTmpret = epcProtocolStartup(ctcpipLocal, PT_TCP,ulTmplocalip,(unsigned short)this-m_localport, ulTmpremoteip, ulTmpremoteport, MODE_SERVER);(4)if (bTmpret) (5)this-m_open.EnableWindow(fa

21、lse); this-m_localip.EnableWindow(false);CEdit *ceditTmp = (CEdit *)GetDlgItem(IDC_EDIT_localport); ceditTmp-EnableWindow(false);MiniARM M3350(6)数据接收窗口“清空”按钮单击事件,如程序1.6所示。程序1.6 接收窗口“清空”按钮单击事件代码1.6 (1):1.6 (2):程序程序复位用户接收数据缓冲区游标;清空框“数据接收窗口”的显示区域。(7)数据发送窗口“清空”按钮单击事件,如程序1.7所示。程序1.7 发送窗口“清空”按钮单击事件代码程序1.7

22、 (1):清空框的数据发送窗口的显示数据。(8)框“发送”按钮单击事件,如程序1.8所示。程序1.8 “发送”按钮单击事件代码8void CTcp_serverDlg:OnBUTTONsend()unsigned shortpusTmpip16; unsigned shortpusTmpport6;usTmplen;charpcTmpip16; unsigned longulTmpremoteip; unsigned shortulTmpremoteport;usTmplen = this-m_remoteip.GetWindowText(pusTmpip, 16);(1) WideCharT

23、oMultiByte(CP_ACP,0,pusTmpip, usTmplen, pcTmpip,void CTcp_serverDlg:OnBUTTONtxclr()this-m_tx.SetWindowText(_T();(1)void CTcp_serverDlg:OnBUTTONrxclr()this-usIndex = 0;(1)this-m_rx.SetWindowText(_T();(2)MiniARM M33501.8 (1):1.8 (2):1.8 (3):1.8 (4):1.8 (5):1.8 (6):1.8 (7):1.8 (8):框得到IP地址;程序程序程序程序程序程序程

24、序程序点。从转换宽字符类型为字符串类型;转转点分式的IP地址为 32 位的IP地址类型;从框得到端;转换宽字符类型为整型;从框发送窗口得到要发送的数据;转换宽字符串类型为字符串类型;epcTCPIP包提供发送数据的函数将数据发送到IP终节(9)至此,TCP 服务器的示例就实现完成了。(10) 启动 MINIARM M3350 的 Windows Embedded Compact 7 操作系统,用 USB 电缆连接MINIARM M3350 和 PC 机,通过 USB 建立MINIARM M3350 Windows EmbeddedCompact 7 与 PC 机 Windows 的 ActiveSync 连接,同时以太网口。(11) 在 VS2008 的中,解决方案配置选择 Release,然后选择菜单“生成”“部署解决方案”,工程开始编译。如果编译成功,将自动部署本示例的可执行文件tcp_server.exe 到 MINIARM M3350 上。可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论