至诚学院实验报告课程名称:TCP/IP协议编程实践姓名:学号:系别:专业:年级:年月日实验一操作系统时间同步【开发环境】1、操作系统:Windows XP或Windows 7 操作系统2、Winpcap开放代码函数库3、语言:C++ 及 2010开发平台【背景知识】1、按照实验指导书的“相关知识”来写。
2、IP数据报固定首部的基本格式(参考TCP/IP协议详解相应章节,或者教材,给出首部格式的图例,并简要说明相应字段含义)(其余实验,可以参考实验指导书的“相关知识”,如果实验指导书这部分文字内容过多,请缩写出核心知识即可)【设计思路】参考实验指导书的“课程设计分析”这个小节,包含算法分析的文字内容,程序流程图注意:以上每个子模块的文字都要用5号,宋体,20磅行距的格式来完成。
标题则是【】括起来的小四,宋体,加黑。
“实验一xxx”标题用的宋体,小三,加黑,居中显示。
【核心代码】只要求贴出最核心的代码,无需完整代码。
不要照抄实验指导书,贴出你自己的核心代码(这个小节,用小五,Time new Roman字体,15磅行距)【界面及运行结果】贴出你的界面和运行结果【思考答疑】附录附录一、实验报告要求:1、本文档的第2页是以实验五的为例说明实验报告的格式要求,照这个例子完成其余实验的实验报告。
2、实验报告只用一个封面(如本文当第1页所示),每个实验都要求另起一页开始,做在同一个WORD文档中。
3、实验报告的“设计思路”、“核心代码”和“用户界面”这三个条目必须自己做,不允许抄袭;每个人的设计思路不同,有无用户界面等各不相同,核心代码的雷同率必须≤50%。
若有 n(n>2)位同学的报告雷同,而老师无法判定谁抄袭谁,则雷同的这些报告,老师会根据雷同率,酌情扣分惩罚,直至0分为止。
其余条目,全班同学可以共享拷贝,但要注意自己的开发环境设定。
4、缺交实验报告的同学,实验报告成绩为0分。
附录二、实验验收方式:实验的验收将分为两个部分:第一部分是机房现场表现,包括:出勤率、日常实验表现(是否玩游戏等),程序运行效果、针对程序运行和代码的即时提问。
第二部分是提交的实验报告。
此外,实验将采用实时检查方式,每个实验都应尽量在规定的时间内完成并检查,过期则视情况予以不计成绩或酌情扣分的惩罚。
为避免集中检查产生的诸多不良问题,希望同学们合理安排程序的完成时间,及时向老师提出验收申请。
最终课程成绩=10%×考勤+10%×课堂参与度+30%×实验报告+50%×源代码及运行效果附录三、实验题目详细见实验设计指导和复印材料。
附录四、实验报告上交1、请根据自己的学号+姓名的方式创建文件夹,例如“211106584俞丁俊”,该文件夹内容如下,“实验X”文件夹中存放对应实验项目的源代码。
然后将该文件夹压缩成“学号+姓名”的RAR压缩包,如“211106584俞丁俊.rar”。
2、每个同学的压缩包电子版,请以电邮或其他方式交给班级负责人(不要单独交给老师!!,负责人后面指定),由负责同学将这些压缩包刻录在一个光盘内,上交电子版的截止日期,期末统一通知,建议截止日期为期末笔试前三天,因自己拖延未能在截至日期前及时交电子版,导致实验报告和源代码未能被刻入光盘的同学,实验报告成绩为0分,后果自负。
附录五、实验环境1、可以使用JAVA或C++程序设计语言等实现本学期的编程实验项目。
2、请在实验五开始前预装Wincap,下载链接为:/install/default.htm,请安装下图所示的版本,WinPcap中文技术文档见附录六,请务必详细阅读,尤其对于初学者,“WinPcap教程: 循序渐进教您使用WinPcap”部分是极其重要的:附录六、Winpcap中文技术文档:请务必仔细阅读该文档:/WinPcap/html/index.html附录七、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与Internet协议族(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 = MAKEWORD( 2, 1 );err = WSAStartup( wVersionRequested, &wsaData );(2)WSACleanup函数int WSACleanup (void);应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket 库的绑定并且释放Socket库所占用的系统资源。
(3)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);(4)closesocket函数int closesocket( SOCKET s );closesocket函数用来关闭一个描述符为s套接字。
由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。
套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。
当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。
closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。
(5)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的发送缓冲区的剩余空间里)。