




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子科技大学通信学院套接字接口函数实验报告班 级 2011221010 学 生 熊泽瞳 刘炎宏 学 号 2011221010020(熊泽瞳) 2011221010010(刘炎宏) 教 师 段景山 2004年9月12套接字接口函数【实验目的】掌握套接字接口函数的正确使用方法了解接口函数使用中可能出现的错误及解决方法【实验环境】单人实验,或两人联网配合实验。【实验原理】见本实验指导书相关内容【实验步骤及记录】注意:本实验测试各种套接字函数时,均使用如下形式判断函数执行是否成功和取得错误码,再通过查阅教材了解错误码的具体含义:retval = xxxx( ); / xxxx( )表示被测试的套接字函数if( retval = = SOCKET_ERROR) /或者if ( retval != 0)r = WSAGetLastError(); /r中取得错误码。每次测试完毕后,使用菜单中debug/stop debug选项使测试停止下来,如果没有特殊说明,都应把测试对象恢复到测试前的正常状态,以免影响下一个测试内容。l 面向连接服务器的各接口函数:socket、bind、listen、accept、send、recv、closesocket1、socket( )打开例程中面向连接服务器工程1) 测试参数1。测试目标:使用AF_ISO,或其它不是AF_INET家族的标识,注意:使用单步调试方法取得测试结果。参数1的值 AF_ISO ,s 的值: 4294967295 ,r取得的错误码 10047 ,错误含义 WSAEAFNOSUPPORT 地址家族不支持请求的操作。对套接字类型不支持的操作来说,在试着执行它时,就会出现这个错误。 。2) 测试参数2。使用非标准套接字类型,如:6。记录错误提示。参数1的值 AF_INET ,retval 的值: -1 ,r取得的错误码 10044 ,错误含义 WSAESOCKTNOSUPPORT 不支持的套接字类型。对指定的地址家族来说,没有相应的具体套接字类型支持。 。3) 测试参数3。一般情况下,不特别指明使用协议类型时使用0。现在分别使用不同的协议号测试并记录:参数2:SOCK_STREAM,参数3:6retval 的值: 0 ,r取得的错误码 -858993560 ,错误含义 r错误码变量是没有初始化,没有错误 。参数2:SOCK_STREAM,参数3:7retval 的值: -1 ,r取得的错误码 10043 ,错误含义 WSAEPROTONOSUPPORT 不支持的协议。系统中没有安装请求的协议或没有相应的实施方案。 。参数2:SOCK_DGRAM,参数3:17retval 的值: 0 ,r取得的错误码 -858993560 ,错误含义 r错误码变量是没有初始化,没有错误 。参数2:SOCK_DGRAM,参数3:19retval 的值: -1 ,r取得的错误码 10043 ,错误含义 WSAEPROTONOSUPPORT 不支持的协议。系统中没有安装请求的协议或没有相应的实施方案。 。结论:socket()函数的三个参数主要用于定义协议家族,套接字类型以及协议类型。如果当前环境不支持相应的类型,则socket()会返回失败。2、bind( )1) 测试参数1。测试目标:使用尚未申请套接字资源的套接字描述符,能否绑定套接字地址在s socket( );一句及相关的错误判断等语句前加”/”方式变成注释语句。观察bind函数执行的结果。retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。2) 测试参数2。测试目标:在套接字地址中分别使用不正确的地址族标识、本地IP地址和端口号测试。a、在local结构中,sin_family成员赋值为AF_OSI,retval 的值: -1 ,r取得的错误码 10047 ,错误含义 WSAEAFNOSUPPORT 地址家族不支持请求的操作。对套接字类型不支持的操作来说,在试着执行它时,就会出现这个错误。 。b、在local结构中,sin_addr成员赋值为本计算机的IP地址,retval 的值: 0 ,r取得的错误码 -858993460 ,错误含义 没有错误 。c、在local结构中,sin_addr成员赋值为非本计算机的IP地址,如同小组的另一个同学的IP地址;retval 的值: -1 ,r取得的错误码 10049 ,错误含义 WSAEADDRNOTAVAIL 不能分配请求的地址。A P I 调用中指定的地址对那个函数来说无效时,就会产生这样的错误。 。d、在local结构中,sin_port成员赋值为135;retval 的值: 0 ,r取得的错误码 -858993460 ,错误含义 没有错误 。思考:什么样的端口值会导致出错?。如果试图bind()已经分配给其他进程的端口则会出错。一般写程序,不用选择1024之前的端口。3) 测试参数3。参数3:10retval 的值: -1 ,r取得的错误码 10014 ,错误含义 WSAEFAULT地址无效。传给Wi n s o c k 函数的指针地址无效。 参数3:16retval 的值: 0 ,r取得的错误码 -858993460 ,错误含义 没有错误 。参数3:40retval 的值: 0 ,r取得的错误码 -858993460 ,错误含义 没有错误 。思考:什么样的套接字地址结构大小是不正确的?因为表示地址信息的结构有很多,为了保持兼容,第三个参数的结构大小会用于判断地址结构版本的用途,当给定的地址结构大小不能正常识别出地址信息就会出错吧。bind函数的测试结论:bind()函数仅仅表示网络编程模型的一个基本操作,不仅仅是tcpip使用。因此保证参数的正确能使bind()正常工作。bind()需要的参数是分配好资源的套接字标识符以及地址信息。3、listen( )1) 测试参数1。测试目标:使用尚未建立本地半相关的套接字预测测试结果:(可从winsock.h的错误代码列表中找出可能的错误类型,然后再用实验证明。)将bind()一句及相关判错的语句前面加“/”方式变成注释语句后测试retval 的值: -1 ,r取得的错误码 10022 ,错误含义 WSAEINVAL参数无效。指定了一个无效参数。 。2) 测试参数2。有文献载明:“windows套接字实现中最多只允许服务器同时监听5个套接字。使用参数0,则系统将把该参数改为1,而使用超过5的值,系统将自动把该参数改为5。”使用不同的参数值,测试实际效果,具体步骤如下:a、 设置listen()第2个参数的值b、 单步调试服务器程序,执行到listen下一句,即在错误判断语句前c、 在例程目录下有一个coclient.exe,双击执行,观察客户机与服务器连接的情况。(客户机程序会打印连接结果)d、 同时执行多个coclient(不要关闭已经打印结果的客户机),记录有多少个客户机能同时与服务器连接。设置参数值为0,有 1 个客户机可同时与服务器连接设置参数值为1,有 1 个客户机可同时与服务器连接设置参数值为10,有 5 个客户机可同时与服务器连接思考,如果想结束套接字的监听状态,可以如何处理?closesocket()关闭套接字listen()函数的测试结论:listen()将会为分配好的服务器套接字监听客户端的连接,可以指定等待连接的数量,但是会有限制,但并不是5.4、accept( )1)测试参数1目标:能否在没有设置为监听状态的套接字上接受连接将listen()一句设为注释语句,然后测试retval 的值: -1 ,r取得的错误码 10022 ,错误含义 10022 WSAEINVAL参数无效。 。2)测试参数2(这是一个输出参数,其作用是告诉使用者远端点地址。)测试目标:如果事先往远端点地址结构(remote)里面填写一个指定的远端点地址,能够限制服务器只接受这个远端点的连接请求。步骤如下a、在调用accept之前,给remote(远端点)的IP地址或端口号赋值,注意IP地址不指定为同小组另一个同学的地址,或端口号不是本地客户机绑定的端口号(即,联网实验为非客户机的IP地址,单机实验为非客户机的端口号)。注意:本实验的客户机(coclient.exe)端口为0x4321.b、将服务器单步调试到accept()阻塞。c、双击例程提供的coclient.exe,观察是否能够连接服务器。连接是否成功: 能 accept()执行后,remote内存放的IP地址为 127.0.0.1 ,端口号为 8515 。结论:(能否限制连接服务器的客户机地址)不能限制3)测试参数3参数3的作用与bind()函数参数3一致,可同样方法如0,15,16,40等值进行测试。accept函数的测试结论:accept()函数为已经处于监听的服务器套接字选择请求进行处理,返回新的连接的套接字。5、recv( )1)测试参数1目标:在一个没有建立连接的套接字上尝试接收数据。将accept一句改为注释语句,并将recv()里的套接字标识符改为s,然后测试:retval 的值: -1 ,r取得的错误码 10057 ,错误含义 WSAENOTCONN套接字尚未连接。 。2)测试参数2这是程序接收数据缓冲区指针,接收缓冲区要求程序设计者事先准备好的空间,即该指针已经指向一块已经向系统申请,确定大小的空间。测试目标:如果不使用指向确定空间的指针,将会出现什么错误。a、在声明接受缓冲区时,使用指针声明而不是字符数组申明。 如 char * recvbuf;(字符数组声明时向系统申请了一块确定大小的空间,而字符串指针的声明仅仅是表明该变量是一个指针而已)b、先启动服务器,单步调试到accept后阻塞,再启动coclient.exe程序c、继续单步调试服务器,观察recv()函数的错误情况。(或在recv()函数处设置调试断点,使用F5键进行调试,可以节约一定时间)retval 的值: -1 ,r取得的错误码 10014 ,错误含义 WSAEFAULT地址无效。传给Wi n s o c k 函数的指针地址无效。若指定的缓冲区太小,也会产生这个错误。 。3)测试参数3此参数用于设置接收缓冲区的大小/长度。缓冲区长度参数可以小于等于程序员实际准备的缓冲区大小,但如果大于这个值,则可能造成不可预计的错误。测试目标:如果给出的接收缓冲区大小与缓冲区实际大小不一致时,会出现什么样的错误。测试步骤同上。服务器上接收缓冲区以char recvbuf4方式申请4字节空间。a、客户机在正确连接服务器并出现“请输入”的提示后,输入6个字符的字符串。b、recv()参数3使用0,4和10分别测试。参数3:0retval 的值: 0 ,r取得的错误码 -858993460 ,recvbuf的内容 没有初始化 。错误含义 没有出错 。参数3:4retval 的值: 4 ,r取得的错误码 -858993460 ,recvbuf的内容 hhhh 。错误含义 没有出错 。参数3:10retval 的值: 10 ,r取得的错误码 -858993460 ,recvbuf的内容 hhhh 。错误含义 没有报错 。系统是否出现其它错误: 没有 。4)测试参数4在windows socket里flag可以是0,MSG_PEEK和MSG_OOB,一般设置为0。如果将flag设置为MSG_PEEK状态,套接字上接收的数据不会因为用户调用recv()而从缓冲队列中消失,因此,当用户下一次调用recv时,上一次的数据又重复出现了。测试目标:分别使用0和MSG_PEEK测试,对比测试结果。a、将服务器例程的recv()函数以以下语句代替retval = recv(ns,recvbuf,2,MSG_PEEK);recvbuf0 = 0;recvbuf1 = 0; /清空用户缓冲区retval = recv(ns,recvbuf,2,0);b、在第一个recv处设置调试断点。按F5键开始调试服务器;c、启动coclient程序,连接服务器,并输入2个字符的传输字符串d、继续单步调试服务器,观察两个recv语句收到的字符串是否一致。参数4:0第一个recv()处retval 的值: 2 , recvbuf的内容 he 。第二个recv()处retval 的值: 2 , recvbuf的内容 ll 。参数4:MSG_PEEK第一个recv()处retval 的值: 2 , recvbuf的内容 he 。第二个recv()处retval 的值: 2 , recvbuf的内容 he 。recv()函数的测试结论:recv()提供了获取数据的办法以及一些控制参数。6、send()1)测试参数1测试目标:在没有建立连接的套接字上尝试发送数据。将accept()到recv()一段的语句都变成注释语句,然后测试retval 的值: -1 ,r取得的错误码 10057 ,错误含义 WSAENOTCONN套接字尚未连接。 。2)测试参数2显然,发送数据的程序需要事先准备好待发的数据,并将这些数据放在一个缓冲区内。测试目标:如果用户给出的指针没有指向一个正确的缓冲区,会出现什么情况。a、将服务器例程发送缓冲区的声明改为:char * sendbuf;b、将服务器例程send()函数改为:retval = send( ns, sendbuf, 3 , 0);c、在send()处设置调试断点,启动服务器调试。打开coclient.exe与服务器建立连接,并向服务器发送数据。d、继续单步调试服务器,记录send函数的返回值retval 的值: -1 ,r取得的错误码 10014 ,错误含义 WSAEFAULT 地址无效。传给Wi n s o c k 函数的指针地址无效。若指定的缓冲区太小,也会产生这个错误。 。3)测试参数3通过发送数据长度参数,程序员可以控制系统发送的数据量,即不一定将缓冲区的数据全部发送完。但是该长度不应该超过实际缓冲区的大小,否则造成不可预计的后果。测试目标:如果发送数据的长度与发送缓冲区实际大小不一致时,可能出现的后果。可以使用0,2,6等参数分别测试,同时观察客户机程序的打印结果。测试步骤同上。参数3:0retval 的值: 0 ,r取得的错误码 -858993460 ,错误含义 没有出错 。参数3:2retval 的值: 2 ,r取得的错误码 -858993460 ,错误含义 没有出错 。客户机收到的数据 AC 。参数3:6retval 的值: 6 ,r取得的错误码 -858993460 ,错误含义 没有报错 。客户机收到的数据 ACK 。send()函数的测试结论发送数据,可以指定发送数据的大小。返回发送的大小。7、closesocket()这是一种“粗暴”的断开连接方法。几乎在任何时候都可以调用该函数以放弃对某个套接字的使用。1)测试参数1测试目标:关闭一个没有申请套接字资源的套接字描述符会出怎样的错误?重复关闭一个已经关闭的套接字描述符会出怎样的错误?a、 在服务器例程的s = socket()前增加语句段:retval = closesocket(s);if(retval = SOCKET_ERROR)r = WSAGetLastError();记录测试结果:retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。b、 在服务器例程的closesocket(ns);后再次关闭ns,测试并记录结果:retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。closesocket()函数的测试结论l 面向连接客户机的各接口函数:connect8、connect()在两个VC环境里分别打开面向连接客户机工程和面向连接服务器工程,在客户机工程里完成以下实验。1)测试函数执行情况测试目标:在没有运行服务器的情况下,connect是否会一直阻塞?观察connect的返回值。retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。2)测试参数1测试目标:在一个没有建立本地半相关(绑定)的套接字上能否成功连接服务器?a、将客户机例程中填写local内容和bind语句变成注释语句b、启动执行服务器c、单步调试客户机,观察能否建立连接。retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。是否能正确建立连接 否 。3)测试参数2参数2是对方端点地址信息,可以使用一些特殊的地址来测试a、 使用远端点IP地址为INADDR_ANY测试。retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。b、 使用远端点IP地址为10.1.1.255广播地址。retval 的值: -1 ,r取得的错误码 10038 ,错误含义 WSAENOTSOCK无效套接字上的套接字操作。 。4)测试参数3参数3在上述几个函数中都已经实验过,有兴趣的同学可以按照前面的方法测试一下。connect函数的测试结论:Connect()函数需要准确的服务器地址,否则无法建立连接。l 无连接方式下的接口函数:sendto、recvfrom分别在两个VC中打开无连接服务器和无连接客户机例程。可以现在服务器例程中测试recvfrom,然后在客户机例程中测试sendto9、recvfrom( )本测试在无连接服务器中进行1)测试参数1无连接服务下,用户程序可以直接发送或接收数据而不需要建立连接,但是有一个基本要求,即服务器仍必须确定自己的地址,并在该处等待客户机的数据,以满足客户/服务器的通信模式。测试目标:如果在没有建立本地半相关的套接字上,服务器是否能执行recvfrom等待数据的到来。打开无连接服务器工程,注释bind语句,进入单步调试,并记录recvfrom的执行情况:retval 的值: -1 ,r取得的错误码 10022 ,错误含义 WSAEINVAL参数无效。指定了一个无效参数。 也可能表明套接字当前的状态有错 。2)测试参数5参数4是个输出参数,用于告知用户当前收到数据的源端点地址信息。测试目标:我们能否使用这个参数来指定从某个源端点处接收数据?在服务器例程的recvform函数之前,往remote结构里面填写一个远端点地址(注意不能是同小组同学的IP地址和端口地址,或本地客户机的端口地址),测试能否指定(限制)仅从某个端点接受报文。a、填写remote结构,b、启动服务器单步调试c、启动客户机,向服务器发送数据,记录recvfrom的相关数据retval 的值: 5 ,recv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁波十校数学试卷
- 2025年子女抚养权争议调解与财产合理分配执行合同范本
- 二零二五年财务顾问与财务数据分析与优化服务合同
- 去年苏州五年级数学试卷
- 二零二五版建筑工程劳务分包合同技术支持与培训范本
- 青山区期末初一数学试卷
- 二零二五年涉税事项处理与常年顾问服务合同
- 2025版金融服务机构客户信息保密合同下载
- 二零二五年度物流基础设施分期贷款合同样本
- 二零二五年度碧桂园集团全新施工项目合同
- 2025年内江市总工会公开招聘工会社会工作者(14人)笔试模拟试题及答案解析
- (高清版)DZT 0388-2021 矿区地下水监测规范
- 初中物理教师新课程标准测试题及答案
- 胰腺肿瘤影像学课件
- 高效课堂讲座课件
- 口部运动功能评估分级标准
- 有害物质污染源识别与评价表
- 《汉服发展史》PPT课件
- 新编物理基础学王少杰(上、(下册))课后习题答案
- 产品设备安装调试方案
- 电动转向管柱系统项目商业计划书范文参考
评论
0/150
提交评论