Windows Socket编程实验要求.ppt

上传人:hyn****60 文档编号:87333657 上传时间:2023-04-16 格式:PPT 页数:35 大小:202.50KB
返回 下载 相关 举报
Windows Socket编程实验要求.ppt_第1页
第1页 / 共35页
Windows Socket编程实验要求.ppt_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《Windows Socket编程实验要求.ppt》由会员分享,可在线阅读,更多相关《Windows Socket编程实验要求.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Windows Socket编程实验要求Windows Sockets编程简介Windows Sockets简介简介基本概念基本概念数据结构数据结构WinSock WinSock 库函数库函数程序结构程序结构Windows Sockets简介Windows Sockets(套接字)是在Windows下一套开放的、支持多种协议的网络编程接口规范。为 Windows下网络异步通信提供了一种方便的开发和运行环境。Windows Sockets规范建立在 BSD UNIX 中实现的 Berkeley 套接字模型上,这个模型现在已是TCP/IP网络的标准。它独立于底层的协议。许多网络供应商在网络协议中支

2、持 Windows Sockets,包括TCP/IP、DECNet、IPX/SPX 等。目前主要是TCP/IP Windows Sockets DLL。原理示意图工作模式TCP/IP应用服务采用客户机/服务器工作模式,服务器端启动守护进程,等待客户端的请求;服务器对应客户端的请求,派生子进程与客户进程进行数据通信,提供服务。客户机/服务器工作模式服务器先启动:1)打开一通道,告之本地主机愿意在某一公认的地址(端口,如FTP为21)接收客户请求。2)等待客户请求到达该端口。3)接收客户请求,处理请求。4)转2),等待另一客户请求。客户方:1)打开一通道,并连接到服务器的端口上。2)向服务器发服务

3、请求报文,等待应答;继续请求3)请求结束,关闭通道。基本概念套接字(Socket):网络通信的基本构件,它是可以被命名和寻址的通信端点,每一个套接字与一个进程相连。TCP/IP应用程序之间的通信通过Socket进行。服务器拥有全局公认的Socket,任何客户端都可以向它发出连接请求和信息请求。客户端向操作系统申请一个Socket,系统为之分配一个Socket号。套接字类型 流式套接字流式套接字 SOCK_STREAMSOCK_STREAM 面向连接,可靠,数据无错,无重复的发送,且按面向连接,可靠,数据无错,无重复的发送,且按发送顺序接收的服务。发送顺序接收的服务。数据报式套接字数据报式套接字

4、 SOCK_DGRAMSOCK_DGRAM 无连接服务。数据包以独立方式发送,数据可能有无连接服务。数据包以独立方式发送,数据可能有错、有重复、有丢失,接收顺序混乱。错、有重复、有丢失,接收顺序混乱。在 WinSock 1.1#define SOCK_STREAM 1 /*stream socket*/#define SOCK_DGRAM 2 /*datagram socket*/端口端口传输层和网络层在功能上的最大区别是传输层传输层和网络层在功能上的最大区别是传输层提供了进程通信能力。网络通信的最终地址不提供了进程通信能力。网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种仅仅是主

5、机地址,还包括可以描述进程的某种标识符;标识符;端口是一种抽象的软件结构(包括一些数据结端口是一种抽象的软件结构(包括一些数据结构和构和 I/O I/O 缓冲区)。缓冲区)。每个端口都有一个端口号,每个端口都有一个端口号,TCP/IPTCP/IP的的 TCP TCP 和和 UDP UDP 的端口号互相独立。小于的端口号互相独立。小于255 255 的端口号作的端口号作为保留端口。为保留端口。相关五元组半相关(三元组)半相关(三元组)(协议、本地地址、本地端口号协议、本地地址、本地端口号)它在网络中可以全局唯一地标志一个进它在网络中可以全局唯一地标志一个进程,它指定了连接的每半部分。程,它指定了

6、连接的每半部分。全相关全相关(相关五元组相关五元组)(协议、本地地址、本地端口号、远程协议、本地地址、本地端口号、远程地址、远程端口号地址、远程端口号)创建一个套接字通过套接字与远程应用建立连接阻塞阻塞(blocking)两种模式:两种模式:阻塞模式阻塞模式(blocking mode)非阻塞模式非阻塞模式(non-blocking mode)。阻塞模式阻塞模式(或称同步模式或称同步模式 Synchronous)的的socket的函数直的函数直到操作完成才返回。调用返回之前,该到操作完成才返回。调用返回之前,该 socket 不能做任不能做任何其它事情。在何其它事情。在Berkeley Soc

7、kets 中,套接字的默认工中,套接字的默认工作模式是阻塞模式作模式是阻塞模式非阻塞模式非阻塞模式(异步操作异步操作 operating asynchronously),则调则调用立即返回。用立即返回。Windows Sockets 鼓励使用非阻塞的异步操作,用消息鼓励使用非阻塞的异步操作,用消息来驱动可能引起阻塞的网络连接和数据传输函数。来驱动可能引起阻塞的网络连接和数据传输函数。基本数据结构Winsock.h 定义了Winsock.dll 使用的数据结构和函数SOCKET 句柄数据类型(套接字描述符/套接字号)typedef unsigned int u_int;typedef u_int

8、 SOCKET;网络地址结构:WinSock 使用 SOCKADDR_IN 结构来指定本地或与之建立socket 连接的远程端点地址。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;typedef struct sockaddr_in SOCKADDR_IN;/*Socket address,internet style.*/struct sockaddr_in short sin_family;/地址族 AF_INET u_s

9、hort sin_port;/端口 struct in_addr sin_addr;/IP 地址 char sin_zero8;/填充位;WinSock WinSock 库函数库函数Windows Sockets 库函数分为三类库函数分为三类:1.套接字函数套接字函数2.数据库函数数据库函数3.扩展函数扩展函数-为适应为适应 Windows 下基于消下基于消息的网络编程的异步扩展函数息的网络编程的异步扩展函数标准标准 socket 函数函数(23个个)accept()使服务器等待来自某客户进程的实际连接。使服务器等待来自某客户进程的实际连接。bind()将一个本地地址分配给一个套接字将一个本地

10、地址分配给一个套接字(即命名即命名)closesocket()关闭套接字关闭套接字connect()Client 端向端向Server 发出连接请求发出连接请求ioctlsocket()控制套接字模式控制套接字模式getpeername()获取与指定套接字连接的对等方的名字获取与指定套接字连接的对等方的名字(SOCKADDR结构结构)getsockname()获取指定套接字的当前本地名字获取指定套接字的当前本地名字(SOCKADDR结构结构)getsockopt()获取与指定套接字相关的选项获取与指定套接字相关的选项htonl()将将32位长整数从主机字节顺序转为网络字节顺序位长整数从主机字节

11、顺序转为网络字节顺序htons()将将16位短整数从主机字节顺序转为网络字节顺序位短整数从主机字节顺序转为网络字节顺序inet_addr()将将 Internet 地址转换为地址转换为网络字符串地址网络字符串地址inet_ntoa()将网络字符串地址转换为将网络字符串地址转换为 Internet 地址地址listen()面向连接的服务器监听连接面向连接的服务器监听连接ntohl()将将32位长整数从网络字节顺序转为主机字节顺序位长整数从网络字节顺序转为主机字节顺序ntohs()将将32位长整数从网络字节顺序转为主机字节顺序位长整数从网络字节顺序转为主机字节顺序recv()在已建立连接的本地数据

12、报或流套接字在已建立连接的本地数据报或流套接字 s 上接收输入数据。上接收输入数据。recvfrom()给一个连接或未连接的套接字接收数据给一个连接或未连接的套接字接收数据select()执行多路执行多路同步同步I/O(复用复用)。用来检测一个或多个套接字的状态。用来检测一个或多个套接字的状态。send()在已建立连接的本地数据报或流套接字在已建立连接的本地数据报或流套接字 s 上发送输出数据。上发送输出数据。sendto()给一个连接或未连接的套接字发送数据给一个连接或未连接的套接字发送数据setsockopt()设置与指定套接字相关的选项设置与指定套接字相关的选项shutdown()关闭全

13、双工连接的一部分关闭全双工连接的一部分socket()创创建一个套接字建一个套接字数据库函数(7个)gethostbyaddr()通过网络地址获取名字和地址通过网络地址获取名字和地址gethostbyname()通过主机名获取名字和地通过主机名获取名字和地址址gethostname()获取本地主机获取本地主机getservbyport()通过端口号获取服务名和端口通过端口号获取服务名和端口getservbyname()通过主机名获取名字和地址通过主机名获取名字和地址getprotobynumber()通过协议号获取协议名和协议号通过协议号获取协议名和协议号getprotobyname()通过协

14、议名获取协议名和协议号通过协议名获取协议名和协议号专有扩展函数专有扩展函数(16个个WSA:Windows Sockets Asynchronous)1.WSAStartup()初始化隐含的初始化隐含的 Windows Sockets DLL。2.WSACleanup()终止使用隐含的终止使用隐含的 Windows Sockets DLL。3.WSASetLastError()设置设置 Windows Sockets API 最近的错误号。最近的错误号。4.WSAGetLastError()获取获取 Windows Sockets API 最近的错误号。最近的错误号。5.WSAIsBlocki

15、ng()检测隐含的检测隐含的 WinSock DLL 是否阻塞了一个当前的线程的调用。是否阻塞了一个当前的线程的调用。6.WSAUnhookBlockingHook()恢复原来的恢复原来的阻塞处理函数。阻塞处理函数。7.WSASetBlockingHook()设置应用程序自己的阻塞处理函数。设置应用程序自己的阻塞处理函数。8.WSAAsyncGetServByName()9.WSAAsyncGetServByPort()10.WSAAsyncGetProtoByName()11.WSAAsyncGetProtoByNumber()12.WSAAsyncGetHostByName()13.WSA

16、AsyncGetHostByAddr()14.WSACancelAsyncRequest()取消取消 WSAAsyncGetXByY()执行中的实例。执行中的实例。15.WSAAsyncSelect()select()的异步版本。的异步版本。16.WSACancelBlockingCall()取消一个执行中的阻塞取消一个执行中的阻塞 API 调用。调用。主要库函数创建套接字创建套接字 socket()socket()SOCKET SOCKET socket(intsocket(int af,intaf,int type,inttype,int protocol);protocol);afaf:

17、通讯区域,通讯区域,AF_UNIXAF_UNIX,AF_INET,AF_NS.AF_INET,AF_NS.DOS,Windows DOS,Windows支持下支持下AF_INET.AF_INET.type:type:套接字类型套接字类型,默认为默认为0 0(SOCK_STREAMSOCK_STREAM)。)。protocol:protocol:套接字用特定协议,默认为套接字用特定协议,默认为0 0(不用特定协议)。(不用特定协议)。指定本地地址指定本地地址 bind()bind()将创建的套接字与本地地址连接。将创建的套接字与本地地址连接。intint bind(SOCKET s,const

18、bind(SOCKET s,const structstruct sockaddrsockaddr FAR*name,FAR*name,intint namelennamelen););与一个指定套接字建立连接与一个指定套接字建立连接 connect()connect()客户进程用客户进程用connectconnect竭力与服务进程的连接竭力与服务进程的连接 intint connect(SOCKET s,const connect(SOCKET s,const structstruct sockaddrsockaddr FAR*name,FAR*name,intint namelenname

19、len););监听连接监听连接 listen()面向连接服务进程表示它愿意接收请求,面向连接服务进程表示它愿意接收请求,listen()listen()在在 acceptaccept()()前调用。前调用。intint listen(SOCKET listen(SOCKET s,ints,int backlog);backlog);s:s:创建的创建的SocketSocket。backlog:backlog:请求连接队列的最大长度。请求连接队列的最大长度。acceptaccept()()用于面向服务的服务器,表示服务进程等待用户请求用于面向服务的服务器,表示服务进程等待用户请求 intint

20、accept(SOCKET s,accept(SOCKET s,const const structstruct sockaddrsockaddr FAR*name,FAR*name,int FAR*addrlen)主要库函数数据传输数据传输 intint send(SOCKET s,const char FAR*send(SOCKET s,const char FAR*buf,intbuf,int lenlen,intint flags);flags);intint recv(SOCKETrecv(SOCKET s,const char FAR*s,const char FAR*buf,in

21、tbuf,int lenlen,intint flags);flags);intint recvfromrecvfrom(SOCKET(SOCKET s s,char FAR*,char FAR*bufbuf,intint lenlen,intint flags flags,structstruct sockaddrsockaddr FAR*FAR*from from,intint FAR*FAR*fromlenfromlen ););intint sendtosendto(SOCKET(SOCKET s s,const char FAR*,const char FAR*bufbuf,inti

22、nt lenlen,intint flags flags,const const structstruct sockaddrsockaddr FAR*FAR*to to,intint tolentolen ););关闭套接字关闭套接字 closesocketclosesocket()()intint closesocket(SOCKETclosesocket(SOCKET s);s);主要库函数注册应用程序感兴趣的网络事件注册应用程序感兴趣的网络事件:WSAAsyncSelect()用于请求用于请求WinSock DLL 每当检测到由参数每当检测到由参数 lEvent描述的任何一网络描述的任何

23、一网络事件时,向窗口事件时,向窗口hWnd 发送一个消息。发送的消息由参数发送一个消息。发送的消息由参数 wMsg 描述,要描述,要求接到通知的套接字由求接到通知的套接字由 s 标识。此函数自动设置套接字标识。此函数自动设置套接字 s 处于非阻塞方式。处于非阻塞方式。int WSAAsyncSelect(SOCKET s,HWND hWnd,int wMsg,long lEvent);可注册的网络事件有:可注册的网络事件有:FD_READ:期望在读准备好时接到通知;期望在读准备好时接到通知;FD_WRITE:期望在写准备好时接到通知;期望在写准备好时接到通知;FD_OOB:期望在外带数据到来时

24、接到通知;期望在外带数据到来时接到通知;FD_ACCEPT:期望在连接到来时接到通知;期望在连接到来时接到通知;FD_CONNECT:期望在连接建立完成时接到通知;期望在连接建立完成时接到通知;FD_CLOSE:期望在套接字关闭时接到通知。期望在套接字关闭时接到通知。如:如:long lEvent=FD_READ|FD_WRITE;地址转换函数:地址转换函数:inet_addr()/inet_ntoa()完成网络字符串地址和完成网络字符串地址和 Internet 地址之间的转换地址之间的转换.网络字符串地址:网络字符串地址:Internet 标准的分点表示法的地址字符串标准的分点表示法的地址字

25、符串 a.b.c.d 如如“162.105.183.61”(abcd 均在均在0255之间之间)Internet 地址:网络字节顺序的无符号长整数。地址:网络字节顺序的无符号长整数。unsigned long inet_addr(const char FAR*cp);char FAR*inet_ntoa(struct in_addr in);使用方法使用方法面向连接的面向连接的 socket socket 编程模式编程模式socket(),bind(),connect(),accept()这四个套接字系统调这四个套接字系统调用,可以完成一个完全五元组的建立。用,可以完成一个完全五元组的建立。s

26、ocket()-指定协议元,用法与是否是指定协议元,用法与是否是 C/S、是否是是否是面向连接无关;面向连接无关;bind()-指定五元组中的本地二元,即本地主机地址指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接在服务器方,无论是否面向连接,均要用,均要用 bind();在客户方,在客户方,若采用面向连接,则可以不调用若采用面向连接,则可以不调用 bind(),而通而通过过 connect()自动完成。自动完成。若采用无连接,客户方必须使用若采用无连接,客户方必须使用 bind()以获得以获得一个唯一的地

27、址。一个唯一的地址。无连接的无连接的 socket socket 编程模式编程模式client 不调用不调用 connect(),在发送数据之前,在发送数据之前,client 与与 server 之间尚未建立全相关,而只是各自调用之间尚未建立全相关,而只是各自调用 socket()和和 bind()建立了半相关建立了半相关(half league)。在发送数据时,发送方除了指定本地在发送数据时,发送方除了指定本地 socket 号之外,号之外,还需指定接收方的还需指定接收方的 socket 号,从而在发送数据的过程号,从而在发送数据的过程中动态地建立了全相关中动态地建立了全相关(full le

28、ague)。TCP/IP协议核心与应用程序关系应用程序1应用程序2网络应用编程界面(socket)TCP/IP核心协议物理介质实验一实验一 数据链路层协议的理解与实现数据链路层协议的理解与实现实验目的加深对流量控制、差错处理方法的理解熟悉TCP/IP编程,将书本知识运用到实验中;开拓学生的创新意识,培养学生的独立动手操作的能力 实验内容利用已有的模拟信道程序,编制发送、接收程序的部分模块,使系统具有可靠的收发功能。实验说明采用无连接Socket编程地址与端口发送端:地址:127.0.0.1 端口:8001接收端地址:127.0.0.1 端口:6001实验说明数据帧格式:应答帧格式:001111

29、00序号数据校验位长度00111100 1B 1B 1B 1B 00111100应答00111100 1B 1B 1B实验说明需考虑的异常情况:出错、丢失、延时采用停等协议序号采用8位编码单工方式ACK/NAK的表示ACK:0 x06NAK:0 x15实验说明#define MAX_MSG_SIZE 1000#define MAX_FRAME_LEN 100#define WM_MY_ACCEPT(WM_USER+100)#define WM_MY_SENDER_SEND(WM_USER+101)#define WM_MY_RECEIVER_SEND(WM_USER+102)#define W

30、M_MY_CHANNEL_SEND(WM_USER+103)#define ACK 0 x06#define NAK 0 x15#define DATA_FRAME_LEN 6#define ANS_FRAME_LEN 3#define HEADER 0 x3c在stdAfx.h中定义实验说明extern int sender_socket;/*sender SOCKET*/extern int receiver_socket;/*receiver channel SOCKET*/extern int channelsendersocket,channelreceiver_socket;/*c

31、hannel SOCKET*/地址地址extern struct sockaddr_in sender_addr,receiver_addr,channelsender_addr,channelreceiver_addr;extern BOOL bSending;/发送标志,发送标志,0:未发送信息:未发送信息 1:有未获得确认的发送帧:有未获得确认的发送帧 extern char str_sendMAX_MSG_SIZE;/待发送的报文信息待发送的报文信息extern char now_sendMAX_FRAME_LEN;/已已发送的帧信息发送的帧信息extern int iSendno;/

32、已正确发送的帧数已正确发送的帧数extern int msglen;/待待发送的报文总长度发送的报文总长度extern int nTimer;/定时器的事件标识定时器的事件标识extern int iSendTime;/事件计数器事件计数器extern int iRevno;/已接收的正确帧数已接收的正确帧数extern char rev_dataMAX_FRAME_LEN;/接收的信息接收的信息待完成的模块(发送程序)功能功能偶校验偶校验编码编码发送、接收发送、接收差错处理、流量控制差错处理、流量控制函数说明:函数说明:BOOL check_data(char*msg);/检查检查/编码编码

33、,结果为结果为newmsg:帧序号帧序号no,数据数据msg,总长度总长度len,void Encode(char msg,int no,int len,char*newmsg);int SendMsg(char*msg,int len);/发送发送msg中长为中长为len的信息的信息int ReceiveMsg(char*msg);/接收信息接收信息/接收模拟通道发送的信息,处理接收模拟通道发送的信息,处理LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)待完成的模块(接收程序)功能功能检查偶校验检查偶校验应答应答发送、接收发送、接收

34、函数说明:函数说明:BOOL check_data(char*msg);/检查检查/编码:结果为编码:结果为newmsg,帧,帧序号序号no,数据数据msg,总长总长度度lenvoid Encode(char msg,int no,int len,char*newmsg);int SendMsg(char*msg,int len);/发送发送msg中长为中长为len的信息的信息int ReceiveMsg(char*msg);/接收信息接收信息/接收模拟通道发送的信息,处理接收模拟通道发送的信息,处理LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)

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

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁