网络协议编程应用课程设计.doc

上传人:wuy****n92 文档编号:53474241 上传时间:2022-10-26 格式:DOC 页数:20 大小:252.01KB
返回 下载 相关 举报
网络协议编程应用课程设计.doc_第1页
第1页 / 共20页
网络协议编程应用课程设计.doc_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《网络协议编程应用课程设计.doc》由会员分享,可在线阅读,更多相关《网络协议编程应用课程设计.doc(20页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课程设计报告设计名称: 网络协议编程应用课程设计 系 (院): 机算计科学学院 专业班级: 网络11003班 姓 名: 王小贱 学 号: 201006421 指导教师: 张为 邱机 设计时间: 2013.6.7 - 2013.6.18 设计地点: 四号楼1楼2号机房 一、目的与任务网络协议编程应用课程设计是TCP/IP协议分析课程后的一个重要的教学环节,是对学生进行的一次较为全面的网络协议编程方面的训练。其基本目的是:(1)培养学生理论联系实际的设计思想,训练综合运用所学的基础理论知识,结合生产实际分析和解决网络应用中问题的能力,从而使基础理论知识得到巩固和加深。(2)通过编程实践学习掌握网络

2、协议的运行原理。(3)练习多线程的网络编程模式,为以后开发真实的应用协议打下基础。二、基本要求(1)合理设计系统框图和程序结构图。(2)根据系统框图设计,编写程序代码。(3)编写程序说明书。三、实验环境 安装有vs2010以及虚拟机的计算机四、课程设计内容(1)、熟悉开发工具Visual Studio是微软公司推出的开发环境。是目前最流行的Windows平台应用程序开发环境。Visual Studio 2010版本于2010年4月12日上市,其集成开发环境(IDE)的界面被重新设计和组织,变得更加简单明了。Visual Studio 2010同时带来了 NET Framework 4.0、Mi

3、crosoft Visual Studio 2010 CTP( Community Technology Preview-CTP),并且支持开发面向Windows 7的应用程序。除了Microsoft SQL Server,它还支持 IBM DB2和Oracle数据库。学习使用好vs2010对于我们来说有很大意义。(2)、套接字编程练习 使用TCP/IP协议的应用程序通常采用两种应用编程接口(API):socket和TLI(运输层接)。前者有时称作Berkeley socket,表明它是从伯克利版发展而来的。后者起初是由AT & T开发的,有时称作XTI(X/Open运输层接口),以承认X/O

4、pen这个自己定义标准的国际计算机生产商所做的工作。XTI实际上是TLI的一个超集。而在windows操作系统中,实现了windows版本的socketAPI,又称winsock。TCP/IP还是OSI的ISO协议都是分层模式的,用层的概念屏蔽的下层的细节,只要完成自层的功能即可,因而程序员在做网络编程时并不需要去关心网络底层的具体实现,只需要关心软件的功能即可极大的简化了程序的编写。因而我们在学习网络socket编程时并不一定要很多的网络方面的知识,甚至是TCP/IP协议的知识也不需要太多。因而在着我就不介绍那方面的知识了,如果要了解网上也四处都有那些被别人应用了N遍的经典的介绍。 在这只介

5、绍基于TCP和UDP的简单的编程实现。现今的网络程序一般都是基于C/S模型,即客户机-服务器模型。这种结构将主要运算操作放在中心计算机上。同集中式大型计算系统比较,客户-服务器结构的主要优点 是提供了良好的实用性、灵活性、交互性和可扩展性。客户-服务器以数据库服务器取代集中式文件共享进而实现了计算机系统之间的松耦合。 Windows Sockets是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用。Windows Sockets在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充。

6、这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP协议的;Windows Sockets 2从Windows Sockets 1.1发展而来,与协议无关并向下兼容,可以使用任何底 层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正实现了底层网络通讯对应用程序的透明。套接字的类型总共有三类:1) 流式套接字(SOCK_STREAM)提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。这种类

7、型是基于TCP协议的。2) 数据报式套接字(SOCK_DGRAM)提供无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。 这种类型是基于UDP协议的3) 原始套接字(SOCK_RAW)。用于编写基于IP协议的程序。 它可以访问ICMP和ICMP等协议包,可以编写内核不处理的IP数据包,还可以创建自定义的IP数据包首部。(3)、TCP套接字编程 当使用TCP/IP协议一发客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便以他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。 bind()函数

8、实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。对客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求,接下来就可以与服务器通信了。 开发套接字应用程序时,首先应进行Windows Sockets的初始化,加载Windows Sockets的实现,然后创建套接字,对TCP套接字来说,需要在socket()函数或都WSASocket()函数中指明SOC

9、K_STREAM套接字类型。当服务器和客户端通信结束时,关闭套接字,释放Windows Sockets的实现。流程如下:服务器:创建套接字绑定监听接受连接收发数据关闭客户端:创建套接字连接收发数据关闭Windows Sockets API重要函数说明如下:一、WSAStartup()函数:不管是客户端还是服务器,开发Windows Sockets应用程序时,必须首先加载Windows Sockets动态库(DLL)。WSAStartup()函数实现此项功能。该函数是套接字应用程序必须调用的第一个函数。该函数声明如下: int WSAStartup( WORD wVersionRequested

10、, LPWSADATA lpWSAData);wVersionRequested:指定准备加载Windows Sockets动态库的版本。高字节指定所需要库文件的副版本,低字节指定主版本。在应用程序中可以使用MAKEWORD(X,Y)方便指定该参数。X是高位字节,Y是低位字节 lpWSAData:指向lpwsadata结构的指针,该参数返回被加载动态库的有关信息。 WSADATA结构声明如下:#define WSADESCRIPTION_LEN 256#define WSASYS_STATUS_LEN 12 struct WSAData WORD wVersion; WORD wHighVer

11、sion; char szDescriptionWSADESCRIPTION_LEN+1;char szSystemStatusWSASYSSTATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char *lpVendorInfo; WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息。 wVersion :Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号, 低位字节存储主版本号,可以用WORD M

12、AKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1) wHighVersion :这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。 szDescription :以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。 szSystemStatus :以null结尾的A

13、SCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。iMaxSockets :单个进出能够打开的socket的最大数目。iMaxUdpDg:一个进程发送或接收的最大数据报长度lpVendorInfo :指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。 二、socket()函数 初始化Windows Sockets DLL之后,创建套接字。socket()函数和WSASo

14、cket()将实现此功能。socket()函数声明如下: SOCKET socket(int af, int type, int protocol ); af:协议地址家族。创建TCP/UDP套接字时该参数为AF_INET。 type:协议的套接字类型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM 3种类型 protocol:协议。对于SOCK_STREAM套接字类型,该字段为IPPROTO_TCP或为0,对于SOCK_DGRAM套接字类型,该字段为IPPROTO_UDP或为0 三、bind()函数 bind()函数将套接字绑定到一个已知的地址。该函数声明如下: int b

15、ind( SOCKET s, const struct sockaddr FAR* name,int namelen ); s:套接字 name:地址 namelen:sockaddr结构长度 来源:魁网学习频道-计算机二级考试 四、listen()函数listen()函数将套接字设置为监听模式。listen()函数声明如下: int listen( SOCKET s, int backlog ); s:套接字 backlog:指定等待连接的最大队列长度(例如客户端的同时可连接数) 五、accept()函数 accept()函数实现接受一个连接请求的功能。accept()函数声明如下: SOC

16、KET accept( int s; struct sockaddr FAR* addr, int FAR* addrlen ); s:监听套接字 addr:该参数返回请求连接的客户端的地址 addrlen:该参数返回SOCKADDR_IN结构的长度 六、recv()函数 recv()函数和WSARevc()函数用于接受数据。recv()函数声明如下: int recv( SOCKET s, char FAR* buf, int len,int flags ); s:套接字 buf:接收数据缓冲区 len:缘冲区的长度 flags:该参数影响该函数的行为。如果为0表示无特殊行为,MSG_PEE

17、K会使有用的数据被复制到接收缓冲区内,但没有从系统缓冲区中将其删除MSG_OOB表示处理带外数据。 来源:魁网学习频道-计算机二级考试 七、send()函数 send()和WSASend()函数用于发送数据。send()函数声明如下: int send( SOCKET s, const char FAR* buf, int len, int flags);s:套接字buf:发送数据缓冲区len:发送数据长度flags:该参数影响该函数的行为。如果为0表示无特殊行为,MSG_DONTROUTE要求传输层不要将数据路由出去,MSG_OOB表示处理带外数据。八、closesocket()函数 clo

18、sesocket()函数关闭套接字,释放后占资源。该函数声明如下: int closesocket( SOCKET s );s:套接字 九、shutdown()函数 shutdown()函数用于通知对方不再发送数据,或者不再接收数据,或者即不发送也不接收数据。该函数声明如下: int shutdown( SOCKET s,int how ); s:套接字 how:如果参数为SD_RECEIVE,则表示不允许再调用接收数据函数;如果该参数为SE_SEND,则表示不允许再调用发送数据函数;如果该参数为SE_BOTH,则表示即不允许调用发送数据函数也不允许调用接收数据函数。十、connect()函数

19、 connect()函数实现连接服务器功能。该函数声明如下:int connect( SOCKET s, const struct sockaddr FAR* name,int namelen ); s:套接字name:服务器地址namelen:sockaddr 结构的长度(4)、聊天室程序的设计及实现(5)、PING程序的设计及实现五、实验调试结果及代码(1)实验调试结果聊天室实验:启动服务器端客户端连接服务器连接上服务器开始发送消息服务器端显示连接状态PING程序实验Ping主机名Ping ip地址(2)实验代码 1、聊天室实验服务器端:using System;using System.

20、Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;using System.Xml;namespace Server public partial class ServerMain : Form public ServerMain() Initialize

21、Component(); private void ServerMain_Load(object sender, EventArgs e) this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; private int GetPort() return 6600; private IPEndPoint ServerInfo; private Socket ServerSocket; private Thread ServerThread; private Socket ClientSocket; private int Client

22、Numb; private byte MsgBuffer; private void CmdStar_Click(object sender, EventArgs e) ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ServerInfo=new IPEndPoint(IPAddress.Any,this.GetPort(); ServerSocket.Bind(ServerInfo); ServerSocket.Listen(10); ClientSocke

23、t = new Socket65535; MsgBuffer = new byte65535; ClientNumb = 0;ServerThread = new Thread(RecieveAccept); ServerThread.Start(); CheckForIllegalCrossThreadCalls = false; this.CmdStar.Enabled = false; this.CmdStop.Enabled = true; this.StateMsg.Text = 服t务?正y在运?行D.+ 运?行D端?口:o+this.GetPort().ToString(); t

24、his.ClientList.Items.Add(服t务?于 + DateTime.Now.ToString() + 开a始?运?行D.); private void RecieveAccept() while (true) ClientSocketClientNumb = ServerSocket.Accept(); ClientSocketClientNumb.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack),ClientSocketClientNumb); this.Cli

25、entList.Items.Add(ClientSocketClientNumb.RemoteEndPoint.ToString()+ 成功|连?接服t务?器.); ClientNumb+; private void RecieveCallBack(IAsyncResult AR) try Socket RSocket = (Socket)AR.AsyncState; int REnd = RSocket.EndReceive(AR); string msg = Encoding.UTF8.GetString(MsgBuffer,0,REnd); MessageList.Items.Add(+

26、DateTime.Now.ToString()+ msg); for (int i = 0; i ClientNumb; i+) if (ClientSocketi.Connected) ClientSocketi.Send(MsgBuffer, 0, REnd,0); RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket); catch private void CmdStop_Click(object sender, EventArgs e) S

27、erverThread.Abort(); ServerSocket.Close(); this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; this.StateMsg.Text = 等待y运?行D.; this.ClientList.Items.Add(服t务?于 + DateTime.Now.ToString() + 停止1运?行D.); private void ServerMain_FormClosing(object sender, FormClosingEventArgs e) try ServerThread.Abor

28、t(); ServerSocket.Close(); catch 客户端:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;namespace Client public partial class ClientMain : Form public

29、ClientMain() InitializeComponent(); private IPEndPoint ServerInfo; private Socket ClientSocket; private Byte MsgBuffer; private Byte MsgSend; private void Connection() this.CmdSend.Enabled = false; this.CmdExit.Enabled = false; ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,

30、 ProtocolType.Tcp); MsgBuffer = new Byte65535; MsgSend = new Byte65535; CheckForIllegalCrossThreadCalls = false; Random TRand = new Random(); this.UserName.Text = Tina + TRand.Next(10000).ToString(); private void ClientMain_Load(object sender, EventArgs e) Connection(); private void CmdEnter_Click(o

31、bject sender, EventArgs e) if (ClientSocket = null | !ClientSocket.Connected) Connection(); ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text); try ClientSocket.Connect(ServerInfo); ClientSocket.Send(Encoding.UTF8.GetBytes(用?户: + this.UserName.Text

32、 + 进?入?系统3!?n); ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null); this.LoginList.Items.Add(+DateTime.Now.ToString()+登?录?服t务?器成功|!?); this.CmdSend.Enabled = true; this.CmdEnter.Enabled = false; this.CmdExit.Enabled = true; catch MessageBox.Show(登?

33、录?服t务?器失败,?请?确认?服t务?器是?否?正y常工作!?, 提示?, MessageBoxButtons.OK, MessageBoxIcon.Information); private void ReceiveCallBack(IAsyncResult AR) try int REnd = ClientSocket.EndReceive(AR); this.RecieveMsg.AppendText(Encoding.UTF8.GetString(MsgBuffer, 0, REnd); ClientSocket.BeginReceive(MsgBuffer,0, MsgBuffer

34、.Length, 0, new AsyncCallback(ReceiveCallBack), null); catch CmdExit_Click(null, null); MessageBox.Show(已?经-与?服t务?器断?开a连?接!?, 提示?, MessageBoxButtons.OK, MessageBoxIcon.Information); private void CmdSend_Click(object sender, EventArgs e) MsgSend = Encoding.UTF8.GetBytes(this.UserName.Text + 说: + this

35、.SendMsg.Text + n); if (ClientSocket.Connected) ClientSocket.Send(MsgSend); this.SendMsg.Text = ; else CmdExit_Click(null, null); MessageBox.Show(当前与?服t务?器断?开a连?接,?无T法发送信?息!?,提示?,MessageBoxButtons.OK,MessageBoxIcon.Information); private void CmdExit_Click(object sender, EventArgs e) this.LoginList.I

36、tems.Add( + DateTime.Now.ToString() + + 退?出?服t务?器!?); if (ClientSocket.Connected) string msg = this.UserName.Text + 离?开a了?房?间?!?n; ClientSocket.Send(Encoding.UTF8.GetBytes(msg); ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Disconnect(false); ClientSocket.Close(); this.CmdSend.Enabled = f

37、alse; this.CmdEnter.Enabled = true; this.CmdExit.Enabled = false; private void RecieveMsg_TextChanged(object sender, EventArgs e) this.RecieveMsg.ScrollToCaret(); private void SendMsg_KeyDown(object sender, KeyEventArgs e) if (e.Control & e.KeyValue = 13) e.Handled = true; this.CmdSend_Click(this, null); Ping程序实验:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.NetworkInformation;namespace 编程实现?Ping操作 public partial class Form1 : Form

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 合同协议

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com