计算机网络课程设计(TCPIP协议分析及实现_第1页
计算机网络课程设计(TCPIP协议分析及实现_第2页
计算机网络课程设计(TCPIP协议分析及实现_第3页
计算机网络课程设计(TCPIP协议分析及实现_第4页
计算机网络课程设计(TCPIP协议分析及实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、 计算机网络课程设计(TCP/IP协议分析及实现)班级:班学号:姓名:冯炜轩指导老师:贺刚 2009年4月28日 一、 设计目的及要求1、初步掌握Windows socket编程的方法,并运用所学的知识实现客户端和服务器端的简单双向通信。2、熟悉TCP或IP协议的基本原理,并能对客户/服务器编程模式有一个深入理解。3、进一步熟悉面向对象的编程方法和封装的相关概念。4、了解用Visual C+ 进行基于对话框的编程的方法。5、培养一定的自学能力和独立分析问题、解决问题的能力。比如查找资料书、自主学习新知识。二、 软件、硬件环境软件环境:Windows XP,Visual C+6.0硬件环境:AM

2、D Sempron(tm)Processor 3000+ , 1.61 GHz,512MB 内存物理地址扩展三、 基本思路及所涉及的相关理论31 相关理论与原理3.1.1 WinsockWindows Sockets接口是TCP/IP网络最为通用API,已成为Windows网络编程的事实上的标准。Microsoft在Sockets API库的基础上创建了WinSock控件,专门用于Windows接口,与Sockets完全兼容。利用 WinSock 控件可以与远程计算机建立连接,Winsock包含有用户数据文报协议 (UDP)和传输控制协议 (TCP)。Winsock控件对用户来说是不可见的,它

3、提供了访问 TCP 和 UDP 网络服务的方便途径。Winsock控件封装了烦琐的技术细节,编写网络应用程序时,不必了解 TCP/IP的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。Windows Sockets 支持两种类型的套字接,即流式套字接(SOCKSTREAM)和数据报套字接(SOCKDGRAM)。对于要求精确传输数据的Windows Sockets通信程序,一般采用流式套接字。流式套接字提供了一个面向连接的、可靠的、数据无错的、无重复发送的及按发关顺序接收数据的报务。其内设流量控制,避免数据流超限,同

4、时数据被看做是字节流,无长度限制。流式套接字的服务进程和客户进程在通信前必须建立各自的套接字并进行了连接,然后才能对相应的套接字进行“读”、“写”操作,实现数据的传送。会用到WindSocket的一些基本函数。关于流式套字接具体介绍如下:1、创建套接字socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);af: 通信发生的区域,一般取AFI_NETtype: 要建立的套接字类型流式套字接(SOCKSTREAM)数据报套字接(SOCKDGRAM)procotol: 使用的特定协议,一般0,

5、即为TCP/IP协议2、指定本地地址bind()功能:将套接字地址与所创建的套接字号联系起来。格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口号,网络字节顺序struct in_addr sin_ad

6、dr;/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,struct sockaddr FAR * name,int FAR * addrlen);参数:同上4、监听连接listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:int PASCAL FAR lis

7、ten(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 flags);参数:buf:指向存有传输数据的缓冲区的指针6、关闭套接字closesocket()功能:关闭套接字s格式:BOOL PASCAL FAR closesocket(

8、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()功能: 终止Winsock DLL的使用,并释放资源。格式:int WSACleanup(void)3.1.2 用winsock控件实现点对点通信随着计

9、算机和Internet网络的发展,原先在测量、控制、消费等领域不同设备/仪器之间,大多采用RS232/485或现场总线组建网络等进行数据传输的情况正在改变,特别在要求数据传输速度和可靠性方面的应用产品,转向基于Internet网络的远程传输和应用。网络编程大多基于TCP/IP协议,实现方法有多种,复杂但编程适应性广的方法是调用底层的Winsock API函数或MFC基本类等;简单方便的方法可以采用如Winsock控件。在网络编程中最常用的方案便是客户机/服务器模型,客户应用程序向服务器程序请求服务。另外一种模式是点对点通信,通信双方对等,既有客户机功能又有服务器的功能,编程简单,适合传输数据流

10、少的场合,而且采用简单的UDP协议,易于用微控制器等嵌入式系统实现,在测量控制方面有许多应用。接下将介绍一些网络编程和Winsock控件知识,用VC+实现点对点通信。3.1.3网络通信协议基础Winsock控件支持两种协议,TCP协议和UDP协议,都属于用TCP/IP协议。TCP(Transfer Control Protocol)是传输控制协议的简称,是基于连接的协议,在数据传输之前必须先建立连接,通信双方是基于客户/服务器模型,必须分别建立客户应用程序和服务器应用程序。UDP(用户数据文报协议)协议是一种无连接协议,通信双方之间的传输类似于传递邮件:消息从一方发送到另一方,但是两者之间没有

11、明确的连接,通信双方是对等的,单次传输的最大数据量取决于具体的网络。本设计是使用TCP的服务类型。利用Winsock控件创建双方的通信过程如下(以TCP为例):首先服务器端的应用程序先要运行,并且进行端口号的设置,然后进入等待,即等待客户端应用程序的连接请求;然后客户端的应用程序开始运行,向服务器发送信息,在服务器端会以消息对话框的形式显示这些信息;然后服务器端的应用程序会把这些信息再次地传回给客户端的应用程序,同样以消息对话框的形式显示出来。3.1.4 二进制数据点对点通信的实现基于网络的远程控制和测量应用中,一般数据传输采用二进制格式,双机之间的连接方式是主丛式,构建一个测控网络,从机之间

12、如果要交换数据也得通过主机。在网络测量控制等领域,通信双方需要传输的数据流量少,下位机一般是微控制器等嵌入式系统,数据处理能力较慢,通信双方也不必保持紧密联系,因此大多采用UDP协议,基于点对点的方式,双方通信的数据可靠性可以通过定义数据表示格式来保证。为了描述如何应用,我们在这里建立一个基于对话框的简单的点对点通信例子,说明在VC+中如何用Winsock控件实现二进制数据点对点通信。32 典型过程图面向连接的流式套接字的系统调用模式图四、方案设计通过以上理论的学习,我设计了此双向通信的C/S程序。其设计思路基本如下:客户机/服务器模式客户端应用程序主要功能是:建立到服务器的连接,向服务器发送

13、信息,接收从服务器发来的回传信息,关闭与服务器的连接。服务器端应用程序主要功能是:创建监听Socket进行监听,在有客户进行连接请求时会创建一个新的接收的Socket处理这个客户得数据发送和接收(此部分最多可接收和处理5个客户的连接请求)。五、 设计结果运行前的准备:获取主机IP地址。具体方法是在运行窗口中运行cmd命令(如图1)。 图1接着输入ipconfig命令,即可获得所需地址(如图2)。 图2正式运行:先运行服务器端程序,进行网络的端口号设置,如图3 图3接着运行客户端程序,进行连接,当正确运行时,系统会弹出连接成功的对话框,接着即可发送消息(如图4)。图4然后,服务器端弹出提示信息(

14、如图5),最后,客户端弹出提示信息(如图6)。 图5 图6以上就是一次完整的通信过程。六、源代码(含有注释)服务器端:AcceptSocket.cpp/ AcceptSocket.cpp : implementation file#include stdafx.h#include Server.h/自己添加的成员函数#include AcceptSocket.h#include MainFrm.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAcceptSock

15、etCAcceptSocket:CAcceptSocket(CMainFrame * pMainFrame) m_pMainFrame=pMainFrame;/进程框架对象的赋值 CAcceptSocket:CAcceptSocket()/ Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CAcceptSocket, CSocket)/AFX_MSG_MAP(CAcceptSocket)/AFX_MSG_MAPEND_MESSAGE_MAP()#endif/ 0/ C

16、AcceptSocket member functionsvoid CAcceptSocket:OnReceive(int nErrorCode) char pMsg10000,tempMsg1000; int ByteCount;/每次读取的字符个数 int EndFlag=0;/接受完后的标志 char AnswerMsg10100; /回应信息字符串 strcpy(pMsg,); do strcpy(tempMsg,); /每次读取时,把读取使用的缓冲区置成空 ByteCount=Receive(tempMsg,1000);/每次读取1000个字符 if (ByteCount1000 |

17、 ByteCount=0) AfxMessageBox(接受数据出错,MB_OK);return ; else if(ByteCount0) EndFlag=1; /字节不足1000时,表示数据接受已经完成 /添加字符串的结束苻 tempMsgByteCount=0; /把每次收到的数据放在一起 strcat(pMsg,tempMsg); while(EndFlag=0);/显示接收但的数据 AfxMessageBox(pMsg,MB_OK); sprintf(AnswerMsg,我已经收到你的消息n%sn 谢谢,pMsg); /发送回传信息 Send(AnswerMsg,strlen(Ans

18、werMsg),0); CSocket:OnReceive(nErrorCode);ListenSocket.cpp/ ListenSocket.cpp : implementation file/#include stdafx.h#include Server.h/自己添加的成员函数#include ListenSocket.h#include AcceptSocket.h#include MainFrm.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CLis

19、tenSocket/构造函数和析构函数的实现 CListenSocket:CListenSocket(CMainFrame * pMainFrame) m_pMainFrame=pMainFrame; /进程框架对象的赋值 CListenSocket:CListenSocket() / Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CListenSocket, CSocket)/AFX_MSG_MAP(CListenSocket)/AFX_MSG_MAPEND_ME

20、SSAGE_MAP()#endif/ 0/ CListenSocket member functionsvoid CListenSocket:OnAccept(int nErrorCode) /生成接收Socket函数 CAcceptSocket * pSocket=new CAcceptSocket(m_pMainFrame); /如果监听成功了,则通过框假类的成员函数 /把接收的socket放入接收socket队列 if(Accept(*pSocket) m_pMainFrame-m_pAcceptList.AddTail(pSocket); else/否则进行错误处理 delete pS

21、ocket; CSocket:OnAccept(nErrorCode); MainFrm.cpp/ MainFrm.cpp : implementation of the CMainFrame class/#include stdafx.h#include Server.h#include MainFrm.h/以下是自己添加的头文件#include SetPortDlg.h#include ListenSocket.h#include AcceptSocket.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS

22、_FILE = _FILE_;#endif/ CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_COMMAND(ID_SET_PORT, OnSetPort)/AFX_MSG_MAPEND_MESSAGE_MAP()static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_IN

23、DICATOR_NUM,ID_INDICATOR_SCRL,;/ CMainFrame construction/destruction/构造函数和析够函数的实现CMainFrame:CMainFrame()/ TODO: add member initialization code here m_pListenSocket=NULL; /初始化请求Socket m_pAcceptList.RemoveAll();CMainFrame:CMainFrame() /释放监听空间 delete m_pListenSocket;int CMainFrame:OnCreate(LPCREATESTRU

24、CT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0(Failed to create toolbarn);return -1

25、; / fail to createif (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to create/ TODO: Delete these three lines if you dont want the toolbar to/ be dockablem_wndToolBar.EnableDocking(CBRS_AL

26、IGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn TRUE;/ CMainFrame diagnostics#ifdef _

27、DEBUGvoid CMainFrame:AssertValid() constCFrameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) constCFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame message handlers/响应端口号设置采单命令的响应处理函数void CMainFrame:OnSetPort() /弹出设置IP地址和端口号的对话框CSetPortDlg dlg; if(dlg.DoModal()=IDOK) /创建一个socket监听m_pListenSock

28、et=new CListenSocket(this);if(m_pListenSocket-Create(dlg.m_nPort)/把监听的socket设置 监听状态if(!m_pListenSocket-Listen(5) MessageBox(设置监听Socket失败,错误信息,MB_OK); /释放分配给监听socket空间 delete m_pListenSocket;else MessageBox(生成Socket错误,错误信息,MB_OK); delete m_pListenSocket;客户端:ClientSocke.cpp/ ClientSocket.cpp : implementation file/#include stdafx.h#include Client.h#include ClientSocket.h#include MainFrm.h #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CClientSocket CClientSocket:CClientSocket(CMainFrame

温馨提示

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

评论

0/150

提交评论