好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

试验五WindowsSocket编程.doc

10页
  • 卖家[上传人]:桔****
  • 文档编号:379066466
  • 上传时间:2023-12-07
  • 文档格式:DOC
  • 文档大小:162.50KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 电子信息与通信学院实验指导书实验名称课程名称Wi ndows Socket 编程计算机网络一、 实验目的1.掌握网络应用程序的开发方法2.掌握 Client/ Server 结构软件的设计与开发方法3.掌握 Socket 机制的工作原理4.掌握基于 Client/Server 结构的 Windows Socket TCP/UDP 程序设计方法二、 实验原理( 一 ) Client/ Server 结构在TCP/IP网络环境下,不同主机上的两个应用程序间通信普遍采用客户机 -服务器模型( client/server architecture, C/S ).即通信双方一方作为服务器等待客户提出请求并予以响应, 客户则在需要服务时向服务器提出申请 服务器一般作为守护进程始终运行, 监听网络接口, 一旦有客户请求, 就启动一个服务进程来响应客户, 同时自己继续监听服务端口, 使后续客 户也能及时得到服务采用这种模型主要是由于网络中主机的软硬件资源、 运算能力和信息分布不均匀导致的, 当需要信息共享时, 运算能力强、 拥有众多资源的主机就作为服务器对外提供服务, 资源相 对较少的主机就成为客户机通过请求获得所需资源。

      本编程训练的目的之一是通过编程了解客户机 -服务器结构的网络通信模型 二 ) Windows socket 编程Windows Sockets是Microsoft Windows 的网络程序设计接口, 它是在 Berkeley Sockets的基 础上扩展而来的, 目前已成为 Windows网络编程事实上的标准 Windows Sockets实现包括开 发组件和运行组件开发组件是供程序员开发 Windows Sockets应用程序使用的,它包括介绍 WindowsSockets实现的文档、各种库文件和一些头文件例如,对于使用 Win dows Sockets 2.0版本的应用程序,头文件为 Winsock2.h,库文件为 Ws2_32.lib运行组件是指实现了 windows Sockets规范所描述的全部功能的一套软件系统,在Windows下实现这些功能是通过 DLL来完成的例如,Windows Sockets 2.0版本的动态链接库 文件为Ws2_32.dll,应用程序在执行时通过载入该动态库来实现所需的网络通信功能三)面向连接的同步模式编程(TCP阻塞编程)服务器首先启动,通过调用 socket()建立一个套接口,然后 bind()将该套接口和本地地址(IP地址和端口)绑定在一起,再 listen()使得套接口做好侦听准备,并规定它的请求队列的长度,之后就调用accept。

      来接收连接,并获得客户机的地址信息; 客户机在建立套接口之后就可以调用 conn ect()和服务器建立连接; 连接一旦建立,客户机和服务器之间就可以通过调用 sen d()和recv()来发送和接收数据;最后,待数据传送结束后,双方调用 closesocket()关闭套接口三、服务器socKet()bind()listen()客户机叵瓦吏更勇连接请求accept()recv():F且塞,等待客户请求;服务请求 F 医簸务蒜Isend()close(sacket)socketf)connect()send()recv()服务应答:阻塞,等待服务数据:出二二处理数据:Nclosesocketf)图2-1面向连接的同步模式编程时序图实验内容(一)运行simplex-talk例程,理解代码并观察现象Simplex-talk运行程序示例:Client 端Server 端server.exe[simplex-talk server] server is ready in liste ning …clie nt.exe localhost[simplex-talk server] received a connection from 127.0.0.1 :[simplex-talk clie nt] conn ecti on to localhost is ready[simplex-talk clie nt] please in put yourmessage (empty in put to halt):Adfadf[simplex-talk clie nt] send 7 chars to server[simplex-talk server] received 7 chars adfadfa[simplex-talk clie nt] send 2 chars to server[simplex-talk server] received 2 chars a[simplex-talk clie nt] empty message is send to server[simplex-talk clie nt] conn ecti on is term in ated[simplex-talk server] empty message is received[simplex-talk server] conn ecti on from127.0.0.1 is termi nated(二)修改simplex-talk程序,编制 duplex-talk 程序,支持 client和server的双向通信 Duplex-talk程序运行示例:Client 端Server 端server.exe[duplex-talk] server is ready in liste ning ...clie nt.exe localhost[duplex-talk] received a connection from127.0.0.1 :[duplex-talk] conn ecti on to localhost is ready [duplex-talk] please in put your message (empty in put to halt)[duplex-talk] clie nt: adfadf[duplex-talk] clie nt: adfadf [duplex-talk] server: a[duplex-talk] server: a[duplex-talk] clie nt:[duplex-talk] empty message is send to server[duplex-talk] conn ecti on is term in ated[duplex-talk] empty message is received [duplex-talk] conn ection from 127.0.0.1 is termi nated(三)利用 windows时间函数,编制一个简单的定时器,模拟 client和server之间的stop-and-wait 的动作客户端模仿sender,发送三个报文;服务器模拟 receiver,回复ACK。

      客户端和服务器分别维持各自的时钟(例如5ms),如果超时就报错试模拟下面的四种停止等待协议可能出 现的情况SenderReceiverReceiverSenderidSender Receiveridi四、 Windows socket 常用 API介绍(一)Win sock 的启动和终止---WSAStartup ()和 WSAClea nup ()由于 Win sock服务是以动态链接库的形式实现的,所以在使用前必须调用 WSAStartup函数对其进行初始化,协商 Win sock的版本支持,并分配必要的资源WSAStartup函数声明如下:int WS AStartup(WORD wVersio nRequested, LPWSADATA IpWSAData);参数说明:wVersio nRequested :指定加载的 Win sock 版本,通常高位字节指定 Win sock 的副版本,低位字节指定 Win sock的主版本,然后用 MAKEWORD(X,Y)宏获取该值IpWSAData : WSADATA数据结构指针,其中 WSADATA结构的定义如下:Typedef struct WSAData{WORD wVersio n; // 期望使用的 Win sock 版本WORD wHighVersio n; // 返回现有 Win sock 最高版本char szDescriptio n[ WSADESCRIPTION_LEN+1];〃 套接字实现描述、char szSystemStatus[WSASYS_STATUS_LEN+1];〃 状态或配置信息unsigned short iMaxSockets; // 最大套接字数unsigned short iMaxUdpDg; // 最大数据报长度char FAR * IpVendorlnfo; // 保留}WSADATA,FAR *LPWSADATA;在应用程序关闭套接字连接后,^需要^用 WSACleanup 函数^止M Winsock W的使用, 并释放资源,函数声明如下:int WSACIea nup(void);(二) 创建套接字---socket。

      调用socket创建一个流套接字,该函数声明如下SOCKET socket(int af,int type,int protocol);参数说明:af :指定网络地址族,一般为__AF」NET type :指定套接字类型,可选的取值如下:SOCK_STREAM 流套接字SOCK_DGRAM 数据报套接字protocol :指定网络协议,一般为 0,表示默认的TCP/IP 协议三) 绑定本地地址---bind()成功创建了 Socket之后,就应该选定通信的对象调用bind()函数可以将本地地址绑定到套接字上,该函数声明如下:int bin d(SOCKET s,c onst struct sockaddt FAR* n ame ,int n amele n);参数说明:s :指定一个未绑定的套接字句柄,用于等待客户进程的连接name :指向sockaddr 结构对象的指针namelen :指定 sockaddr 结构的长度其中sockddr 结构随选择的协议的不同而变化, 因此常用的是sockaddr_in 结构,用来标识TCP/IP协议下的地址,该结构定义如下:struct sockaddr_i n{shortu shortstruct in addrsin_family;sin _port;sin _addr;//指定地址族,一般为 AF_INET 指定端口号//指定IP地址填充位//char};其中IP地址结构struct in _addr{ union{struct{u_char s_b1,s_b2,s_b3,s_b4;}S_un_b; struct{u_short s_w1,s_w2;}S_ un_w;u_long S_addr;}S_u n;};sin _zero[8];。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.