简介:适合不知如何写实验协议方面的相关专业大学硕士和本科毕业论文以及关于实验协议论文开题报告范文和相关职称论文写作参考文献资料下载。
《计算机网络》课程设计指导书
前 言
《计算机网络》课程是计算机科学与技术专业的重要专业课程之一.随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求.
由于计算机网络是一门实践性较强的技术,课堂教学应该与实践环节紧密结合.将《计算机网络》课程建设成一流的课程,是近期《计算机网络》课程努力的方向.
希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《计算机网络》课程设计真正成为课堂教学的有益补充.同时也希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养.本学期授课教师为曾勇军,参与网络课教学环节的辅导教师还有黎晓军等,此外武东英,朱俊虎等教师也给予了热情的支持和帮助.
目 录
一,《计算机网络》实验教学大纲 4
1.1 学时安排 4
1.2 实验内容 4
1.3 试验要求 5
1.4 验收 5
二,实验一:PING程序设计(必做实验) 5
2.1 实验目的 5
2.2 实验内容 6
2.3 实验步骤和注意事项 6
三,实验二:文件传输协议的简单设计与实现(必做实验) 7
3.1 实验目的 7
3.2实验内容和要求 7
3.3 注意事项 7
四,实验三:局域网截包程序设计(选做实验) 8
4.1 实验目的 8
4.2 实验内容 8
4.3 实验步骤和注意事项 8
五,实验四:数据链路层协议的设计与实现(选做实验) 8
5.1 实验目的 8
5.2 实验内容 9
5.3 模拟实现环境 9
5.4 实验步骤和注意事项 10
附录一:参考文献 11
附录二:实验报告的格式 12
附录三,SOCKET编程 17
1,SOCKET规范概述 17
2,WINDOWS环境下SOCKET基本函数 18
3,RAW模式的SOCKET编程 22
一,《计算机网络》实验教学大纲
1.1 学时安排
本课程设计安排30个学时的上机时间,每周两次,每次150分钟.
1.2 实验内容
计算机网络是现代信息社会最重要的基础设施之一.在过去十几年里得到了迅速的发展和应用.《计算机网络》课程实验的目的是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,对现代计算机网络的基本功能有一个初步的了解.通过一个简单的PING程序的设计和实现,理解TCP/IP协议的工作机制和编程方法;通过实现一个文件传输协议,掌握计算机网络应用层协议的基本实现技术;同时还提供了一些选做实验以供有余力有兴趣的同学进一步提高.总之,通过上述实验环节,使学生加深了解和更好地掌握《计算机网络》课程教学大纲要求的内容.
《计算机网络》课程设计共提供了4个实验:
实验一:PING程序的设计与实现(必须做实验)
该实验的主要目的是使同学们掌握基于TCP/IP网络编程的基本方法和思路,同时进一步熟悉《计算机网络》课程中基于IP层协议的工作机制.
实验二: 文件传输协议的简单设计与实现(必做实验)
文件传输是应用层中的一个主要协议,负责将主机中的文件从一台机器传送到另一台机器.文件传输协议FTP采用客户/服务器的工作模式,由客户端产生操作要求,服务器接收到该请求后返回响应.该实验的目的是使同学们掌握应用层协议的实现方法,加深对客户/服务器的工作模式的认识.
实验三:局域网截包程序设计(选做实验)
局域网采用广播方式完成包的发送.因此任何机器发送的包,均可被局域网上的其它机器截获,只要将以太网卡设置为"混杂模式"即可.该实验的主要目的是对《计算机网络》课程的局域网以及IP等相关知识巩固和复习.
实验四: 数据链路层协议的设计与实现(选做实验)
计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议,用于保证数据的可靠传输,进行流量控制等基本功能.
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解数据链路层协议中的"滑动窗口"技术的基本工作原理,掌握计算机网络协议的基本实现技术.
1.3 试验要求
在《计算机网络》的课程实验过程中,要求学生做到:
(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析.
(2)仔细观察上机和上网操作时出现的各种现象,记录主要情况,作出必要说明和分析.
(3)认真书写实验报告.实验报告包括实验目的和要求,实验环境及实验结果分析.对需编程的实验,写出程序设计说明,给出源程序框图和清单.
(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备.
(5)实验课程不迟到.如有事不能出席,所缺实验一般不补.
1.4 验收
实验的验收将分为两个部分:
第一部分是上机操作,包括检查程序运行和即时提问
第二部分是提交书面的实验报告
此外,针对以前教学中出现的问题,网络实验将采用阶段检查方式,每个实验都将应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩.以避免集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成.
二,实验一:PING程序设计(必做实验)
2.1 实验目的
PING程序是我们使用的比较多的用于测试网络连通性的程序.PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作.由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP*IP的封装之后传递.
课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识.
2.2 实验内容
1,RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作.为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程.
熟悉SOCKET的编程,包括基本的系统调用如SOCKET,BIND等(参考附录二);
2,具体内容
定义数据结构
需要定义好IP数据报,ICMP包等相关的数据结构
程序实现
在WINDOWS环境下实现PING程序
程序要求
在命令提示符下输入:
PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求.不带开关变量时,要求返回4次响应.
返回信息的格式:
REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
或
REQUEST TimeOut (无法PING通的情况)
2.3 实验步骤和注意事项
实验按下述步骤进行:
熟悉IP以及ICMP协议的工作机制
熟悉RAW模式的SOCKET编程
编写PING的实现程序
编译环境中需要包括SOCKET库 WS2_32.lib
在模拟实现环境下调试并运行自己编写的PIN程序
保留你实现的程序在你的用户目录下,以备辅导教师检查
最后提交源程序,撰写实验报告
三,实验二:文件传输协议的简单设计与实现(必做实验)
3.1 实验目的
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一.
本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧.
3.2实验内容和要求
1,实验内容
我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上.各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统.实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能.本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议.
2,具体要求
用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:
get:取远方的一个文件
put:传给远方一个文件
pwd:显示远主当前目录
dir:列出远方当前目录
cd :改变远方当前目录
? :显示你提供的命令
quit :退出返回
这此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令.
最后,写出实验报告.
3.3 注意事项
1,关于端口号(假设用SERV_PORT 来表示)的设定,原则上2000 至5000都可用,为避免冲突,建议取你学号后三位数加上2000,比如学号为971234,则可定义:
#define SERV_PORT 2234
2,客户和服务程序中要有相应的include 文件(参考所给例子程序)
3,有些同学的server 方程序支持多连接,为了不占用更多的系统资源,并发连接数限制在3 个以内.
4,最后提交源程序,撰写实验报告,在实验报告中说明设计的思路
四,实验三:局域网截包程序设计(选做实验)
4.1 实验目的
目前的局域网基本上都采用以广播为技术基础的以太网,任何两个节点之间的通信数据包,不仅为这两个节点的网卡所接收,也同时为处在同一以太网上的任何一个节点的网卡所截取.因此,论文范文只要接入以太网上的任一节点进行论文范文,就可以捕获发生在这个以太网上的所有数据包,对其进行解包分析,从而窃取关键信息,这就是以太网所固有的安全隐患.网上主要的免费论文范文攻击工具如SATAN,ISS,NETCAT等均将以太网论文范文作为基本的手段.
本实验实现一个局域网截包程序,目的在于使学生能更好地理解网络的工作机制(包括封包机制,协议分析等),该实验是对《计算机网络》课程一个有益的补充.
4.2 实验内容
在一个局域网环境中,用C 语言实现下面的基本功能:
(1)确定截包的方法:包括RAW 模式SOCKET,PACKET32以及直接作为驱动程序挂在NDIS上
(2)要求截获以下包的类型并分析:以太网帧格式,IP包,ICMP包,TCP报文段,UDP报文等相关字段进行描述.
4.3 实验步骤和注意事项
实验按下述步骤进行:
熟悉RAW模式的SOCKET编程
熟悉PACKET32的工作机制
熟悉WINDOWS 2000环境下NDIS驱动程序的编写方法
编写基于上述某一机制的局域网截包的实现程序;
在模拟实现环境下调试并运行自己编写的协议实现程序;
如出现异常情况,在实验报告中记录并分析可能的原因
五,实验四:数据链路层协议的设计与实现(选做实验)
5.1 实验目的
计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议.
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解数据链路层协议中的"滑动窗口"技术的基本工作原理,掌握计算机网络协议的基本实现技术.
5.2 实验内容
在一个数据链路层的模拟实现环境中,用C 语言实现下面两个数据链路层协议.
(1)"退回到N 重发"的滑动窗口协议(参考文献[1]第四章的协议5);
(2)"选择重发"的滑动滑动窗口协议(参考文献[1]第四章的协议6);
5.3 模拟实现环境
数据链路层协议位于物理层之上,网络层之下.它使用物理层提供的服务,并且向网络层的分组数据传输提供可靠的服务.
由于构造实际的工作环境需要系统提供支持,难度较大.因此,实现一个数据链路层协议必须要有一个模拟实现环境.在本实验中,我们仍然采用基于SOCKET的模拟通信环境.
这个模拟系统由以下几部分组成:
两个代码文件sim.c 和worker.c;
一个通用的头文件mon.h,包含类型预定义,常量定义等;
协议文件使用的头文件potocol.h,包含支撑函数的函数声明等.
模拟系统使用三个进程:
main: 控制整个模拟系统.
MO: 协议2 和协议3 的发送方(machine 0).
M1: 协议2 和协议3 的接收方(machine 1).
文件sim.c 中包含着主程序,它首先分析命令行并且将参数保存起来,接着创建六个管道使得三个进程之间能够进行通信,所创建的文件描述字以如下方式命名:
MO 和M1 的通信;
w1,r1:MO 到M1 的帧传递
w2,r2:M1 到MO 的帧传递
Main 和MO 的通信:
W3,r3:main 通知MO go-ahead
w4,r4:MO 通知main,MO 已准备好
Main 和M1 通信:
w5,r5: main 通知M1-go-ahead
w6,r6:M1 通知main,M1 已准备好.
模拟实现环境的源程序放置在相应的目录下,请同学们首先把这些文件拷贝到自己的用户目录下.
5.4 实验步骤和注意事项
实验按下述步骤进行:
(1)熟悉已给出的数据链路层协议模拟实现环境的功能;
(2)编写两个数据链路层协议的实现程序;
(3)在模拟实现环境下调试并运行自己编写的协议实现程序;
(4)了解协议的工作轨迹,如出现异常情况,在实验报告中写出原因分析;
(5)保留你实现的数据链路层协议在你的用户目录下,以备辅导教师检查.
附录一:参考文献
参考文献[1]"Computer Networks (Third Edition)", Andrew S. Tanenbaum, Prentice-Hall,
清华大学出版社影印, 1996
中译本《计算机网络》,熊桂喜等译,清华大学出版社,1998
参考文献[2]《TCP/IP 网络原理与技术》,周明天,汪文勇编着,清华大学出版社,1993
参考文献[3]《计算机网络》(第3版),谢希仁编着,大连理工大学出版社,2000
附录二:实验报告的格式
实验报告
课 程
实验名称
专业班级
姓 名
学 号
同组人姓名
同组人学号
实验日期
教师审批签字
二 零 零 三 年 月 日
一,实验目的和要求
1,实验目的
2,实验要求
二,实验环境
三,程序的逻辑框图
四,程序源代码
五,实验数据,结果分析
六,总结
七,教师意见
附录三,SOCKET编程
1,SOCKET规范概述
Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口.它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程.
Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守.此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作.因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义.
遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者.一个网络软件供应商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容.
任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口.我们称这种应用程序为Windows Sockets应用程序.
Windows Sockets规范定义并记录了如何使用API与Inter协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口.
应用程序调用Windows Sockets的API实现相互之间的通讯.Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作.它们之间的关系如下图:
2,WINDOWS环境下SOCKET基本函数
(1)WSAStartup函数int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
使用Socket的程序在使用Socket之前必须调用WSAStartup函数.该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本,低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息.当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中.以后应用程序就可以调用所请求的Socket库中的其它Socket函数了.该函数执行成功后返回0.
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下
wVersionRequested 等于 M*EWORD( 2, 1 );
err 等于 WSAStartup( wVersionRequested, &wsaData ); WSACleanup函数 int WSACleanup (void);
应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库绑定并且释放Socket库所占用的系统资源. socket函数SOCKET socket( int af, int type, int protocol );
应用程序调用socket函数来创建一个能够进行网络通信的套接字.第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM,数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议.该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET.套接字描述符是一个整数类型的值.每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系.该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构.每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里.下面是一个创建流套接字的例子:
struct protoent *ppe;
ppe等于getprotobyname("tcp");
SOCKET ListenSocket等于socket(PF_INET,SOCK_STREAM,ppe->p_proto);
closesocket函数
int closesocket( SOCKET s );
closesocket函数用来关闭一个描述符为s套接字.由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构.套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构.当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1.
closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR.
send函数
int send( SOCKET s, const char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据.客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答.该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0.这里只描述同步Socket的send函数的执行流程.当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里).如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR.要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端.如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR.(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)
注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止.
(6)recv函数
int recv( SOCKET s, char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据.该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0.这里只描述同步Socket的recv函数的执行流程.当应用程序调用recv函数时,recv先等待s的发送
试验协议:生成树协议实验
缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕.当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完.recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数.如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0.注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止.
bind函数
int bind( SOCKET s, const struct sockaddr FAR *name, int namelen );
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号.一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号.客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号.该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET.当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr; char sin_zero[8];
};
其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数i_addr()把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr.有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的Socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信.我们用0来填充sin_zero数组,目的是让sockaddr_in结构的大小与sockaddr结构的大小一致.下面是一个bind函数调用的例子:
struct sockaddr_in saddr;
saddr.sin_family 等于 AF_INET;
saddr.sin_port 等于 htons(8888);
saddr.sin_addr.s_addr 等于 htonl(INADDR_ANY);
bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr)); listen函数
int listen( SOCKET s, int backlog );
服务程序可以调用listen函数使其流套接字s处于监听状态.处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求.假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR.
accept函数
SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen );
服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET.该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度.下面是一个调用accept的例子:
struct sockaddr_in ServerSocketAddr;
int addrlen;
addrlen等于sizeof(ServerSocketAddr);
ServerSocket等于accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);
connect函数
int connect( SOCKET s, const struct sockaddr FAR *name, int namelen );
客户程序调用connect函数来使客户Socket s与监听于name所指定的计算机的特定端口上的服务Socket进行连接.如果连接成功,connect返回0;如果失败则返回SOCKET_ERROR.下面是一个例子:
struct sockaddr_in daddr;
memset((void *)&daddr,0,sizeof(daddr));
daddr.sin_family等于AF_INET;
daddr.sin_port等于htons(8888);
daddr.sin_addr.s_addr等于i_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr)); Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的.它包括了一组扩展件,以充分利用 Microsoft Windows 消息驱动的特点.规范的1.1版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行.Windows 2000 支持 Winsock 2.2 版.在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型,服务质量控制等.
这里介绍Windows Sockets的一些关于原始套接字(Raw Socket)的编程.同Winsock 1相比,最明显的就是支持了Raw Socket套接字类型,通过原始套接字,我们可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制.
(1)创建一个原始套接字,并设置IP头选项.
SOCKET sock;
sock 等于 socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s 等于 WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型.创建原始套接字后,IP头就会包含在接收的数据中,如果我们设定 IP_HDRINCL 选项,那么,就需要自己来构造IP头.
注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\
修改键:DisableRawSecurity(类型为DWORD),把值修改为 1.如果没有,就添加.
BOOL blnFlag等于TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
对于原始套接字在接收数据报的时候,要注意这么几点:
如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中.
如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中.
如果定义的是外部地址,比如使用connect(),那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中.
(2)构造IP头和TCP头
这里,提供IP头和TCP头的结构:// Standard TCP flags#define URG 0x20#define ACK 0x10#define PSH 0x08#define RST 0x04#define SYN 0x02#define FIN 0x01typedef struct _iphdr //定义IP首部{unsigned char h_lenver; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间 论文范文Lunsigned char proto; //8位协议 (TCP, UDP 或其他)unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;typedef struct psd_hdr //定义TCP伪首部{unsigned long saddr; //源地址unsigned long daddr; //目的地址char mbz;char ptcl; //协议类型 unsigned short tcpl; //TCP长度}PSD_HEADER;typedef struct _tcphdr //定义TCP首部{USHORT th_sport; //16位源端口USHORT th_dport; //16位目的端口unsigned int th_seq; //32位序列号unsigned int th_ack; //32位确认号unsigned char th_lenres; //4位首部长度/6位保留字unsigned char th_flag; //6位标志位USHORT th_win; //16位窗口大小USHORT th_sum; //16位校验和USHORT th_urp; //16位紧急数据偏移量}TCP_HEADER;TCP伪首部并不是真正存在的,只是用于计算检验和.校验和函数:USHORT checksum(USHORT *buffer, int size){unsigned long cksum等于0;while (size > 1){cksum +等于 *buffer++;size -等于 sizeof(USHORT); }if (size){cksum +等于 *(UCHAR*)buffer; }cksum 等于 (cksum >> 16) + (cksum & 0xffff);cksum +等于 (cksum >>16); return (USHORT)(~cksum); }
当需要自己填充IP头部和TCP头部的时候,就同时需要自己计算他们的检验和.
(3)发送原始套接字数据报填充这些头部稍微麻烦点,发送就相对简单多了.只需要使用sendto()就OK.sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0,(sockaddr*)&addr_in,sizeof(addr_in));
(4)接收数据
和发送原始套接字数据相比,接收就比较麻烦了.因为在WIN我们不能用recv()来接收raw socket上的数据,这是因为,所有的IP包都是先递交给系统核心,然后再传输到用户程序,当发送一个raws socket包的时候(比如syn),核心并不知道,也没有这个数据被发送或者连接建立的记录,因此,当远端主机回应的时候,系统核心就把这些包都全部丢掉,从而到不了应用程序上.所以,就不能简单地使用接收函数来接收这些数据报.要达到接收数据的目的,就必须采用嗅探,接收所有通过的数据包,然后进行筛选,留下符合我们需要的.可以再定义一个原始套接字,用来完成接收数据的任务,需要设置SIO_RCVALL,表示接收所有的数据.
25
多思版权所有 不得复制 VPN 4/25/2003 9:05 PM
zyj 实验课.doc
物理通信介质
操作系统,如WINDOWS
网络通信协议服务截面,如TCP/IP
网络编程截面,如WINDOWS SOCKET
应用程序N
应用程序1
总结:此文是一篇实验协议论文范文,为你的毕业论文写作提供有价值的参考。
试验协议引用文献:
[1] 协议论文范文 协议相关论文范例2万字
[2] 协议论文范文 协议方面有关本科毕业论文范文2万字
[3] 协议论文范文 协议类有关自考开题报告范文2万字