1、4、了解用Visual C+ 进行基于对话框的编程的方法。5、培养一定的自学能力和独立分析问题、解决问题的能力。比如查找资料书、自主学习新知识。二、 软件、硬件环境软件环境:Windows XP,Visual C+6.0硬件环境:AMD Sempron(tm)Processor 3000+ , 1.61 GHz,512MB 内存物理地址扩展三、 基本思路及所涉及的相关理论31 相关理论与原理3.1.1 WinsockWindows Sockets接口是TCP/IP网络最为通用API,已成为Windows网络编程的事实上的标准。Microsoft在Sockets API库的基础上创建了WinSo
2、ck控件,专门用于Windows接口,与Sockets完全兼容。利用 WinSock 控件可以与远程计算机建立连接,Winsock包含有用户数据文报协议 (UDP)和传输控制协议 (TCP)。Winsock控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Winsock控件封装了烦琐的技术细节,编写网络应用程序时,不必了解 TCP/IP的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。Windows Sockets 支持两种类型的套字接,即流式套字接(SOCKSTREAM)和数据报套字
3、接(SOCKDGRAM)。对于要求精确传输数据的Windows Sockets通信程序,一般采用流式套接字。流式套接字提供了一个面向连接的、可靠的、数据无错的、无重复发送的及按发关顺序接收数据的报务。其内设流量控制,避免数据流超限,同时数据被看做是字节流,无长度限制。流式套接字的服务进程和客户进程在通信前必须建立各自的套接字并进行了连接,然后才能对相应的套接字进行“读”、“写”操作,实现数据的传送。会用到WindSocket的一些基本函数。关于流式套字接具体介绍如下:1、创建套接字socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af
4、,int type,int procotol);af: 通信发生的区域,一般取AFI_NETtype: 要建立的套接字类型流式套字接(SOCKSTREAM)数据报套字接(SOCKDGRAM)procotol: 使用的特定协议,一般0,即为TCP/IP协议2、指定本地地址bind()将套接字地址与所创建的套接字号联系起来。int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回0,否则SOC
5、KET_ERROR地址结构说明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口号,网络字节顺序struct in_addr sin_addr;/32位IP地址,网络字节顺序char sin_zero8;/保留 3、建立套接字连接connect()和accept()共同完成连接工作int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen); SOCKET PASCAL FAR accept(SOCKET s,stru
6、ct sockaddr FAR * name,int FAR * addrlen);同上4、监听连接listen()用于面向连接服务器,表明它愿意接收连接。int PASCAL FAR listen(SOCKET s, int backlog);/ backlog为等待队列的最大长度5、数据传输send()与recv()数据的发送与接收int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags); int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int
7、 flags);buf:指向存有传输数据的缓冲区的指针6、关闭套接字closesocket()关闭套接字sBOOL PASCAL FAR closesocket(SOCKET s);7、字节顺序转换函数:-inet_addr() 将点式IP地址转换为不念旧恶32位的无符号长整数。unsigned long inet_addr(const char FAR* cp)8、WSAStartup() 功能:加载Winsock DLL相应版本。int WSAStartup() (WORD wVersionRequested,LPWSADATA lpWSAData);9、WSAScleanup() 终止W
8、insock DLL的使用,并释放资源。int WSACleanup(void)3.1.2 用winsock控件实现点对点通信随着计算机和Internet网络的发展,原先在测量、控制、消费等领域不同设备/仪器之间,大多采用RS232/485或现场总线组建网络等进行数据传输的情况正在改变,特别在要求数据传输速度和可靠性方面的应用产品,转向基于Internet网络的远程传输和应用。网络编程大多基于TCP/IP协议,实现方法有多种,复杂但编程适应性广的方法是调用底层的Winsock API函数或MFC基本类等;简单方便的方法可以采用如Winsock控件。在网络编程中最常用的方案便是客户机/服务器模型
9、,客户应用程序向服务器程序请求服务。另外一种模式是点对点通信,通信双方对等,既有客户机功能又有服务器的功能,编程简单,适合传输数据流少的场合,而且采用简单的UDP协议,易于用微控制器等嵌入式系统实现,在测量控制方面有许多应用。接下将介绍一些网络编程和Winsock控件知识,用VC+实现点对点通信。3.1.3网络通信协议基础Winsock控件支持两种协议,TCP协议和UDP协议,都属于用TCP/IP协议。TCP(Transfer Control Protocol)是传输控制协议的简称,是基于连接的协议,在数据传输之前必须先建立连接,通信双方是基于客户/服务器模型,必须分别建立客户应用程序和服务器
10、应用程序。UDP(用户数据文报协议)协议是一种无连接协议,通信双方之间的传输类似于传递邮件:消息从一方发送到另一方,但是两者之间没有明确的连接,通信双方是对等的,单次传输的最大数据量取决于具体的网络。本设计是使用TCP的服务类型。利用Winsock控件创建双方的通信过程如下(以TCP为例):首先服务器端的应用程序先要运行,并且进行端口号的设置,然后进入等待,即等待客户端应用程序的连接请求;然后客户端的应用程序开始运行,向服务器发送信息,在服务器端会以消息对话框的形式显示这些信息;然后服务器端的应用程序会把这些信息再次地传回给客户端的应用程序,同样以消息对话框的形式显示出来。3.1.4 二进制数
11、据点对点通信的实现基于网络的远程控制和测量应用中,一般数据传输采用二进制格式,双机之间的连接方式是主丛式,构建一个测控网络,从机之间如果要交换数据也得通过主机。在网络测量控制等领域,通信双方需要传输的数据流量少,下位机一般是微控制器等嵌入式系统,数据处理能力较慢,通信双方也不必保持紧密联系,因此大多采用UDP协议,基于点对点的方式,双方通信的数据可靠性可以通过定义数据表示格式来保证。为了描述如何应用,我们在这里建立一个基于对话框的简单的点对点通信例子,说明在VC+中如何用Winsock控件实现二进制数据点对点通信。32 典型过程图面向连接的流式套接字的系统调用模式图四、方案设计通过以上理论的学
12、习,我设计了此双向通信的C/S程序。其设计思路基本如下:客户机/服务器模式客户端应用程序主要功能是:建立到服务器的连接,向服务器发送信息,接收从服务器发来的回传信息,关闭与服务器的连接。服务器端应用程序主要功能是:创建监听Socket进行监听,在有客户进行连接请求时会创建一个新的接收的Socket处理这个客户得数据发送和接收(此部分最多可接收和处理5个客户的连接请求)。五、 设计结果运行前的准备:获取主机IP地址。具体方法是在运行窗口中运行cmd命令(如图1)。 图1接着输入ipconfig命令,即可获得所需地址(如图2)。 图2正式运行:先运行服务器端程序,进行网络的端口号设置,如图3 图3
13、接着运行客户端程序,进行连接,当正确运行时,系统会弹出连接成功的对话框,接着即可发送消息(如图4)。图4然后,服务器端弹出提示信息(如图5),最后,客户端弹出提示信息(如图6)。 图5 图6以上就是一次完整的通信过程。六、源代码(含有注释)服务器端:AcceptSocket.cpp/ AcceptSocket.cpp : implementation file#include stdafx.hServer.h/自己添加的成员函数AcceptSocket.hMainFrm.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAcceptSocketCAcceptSocket:CAcceptSocket(CMainFrame * pMainFrame) m_pMainFrame=pMainFrame;/进程框架对象的赋值 CAcceptSocket()/ Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CAcceptSocket, CSocke
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1