网络接口编程课件整理

上传人:沈*** 文档编号:159181560 上传时间:2022-10-08 格式:PPT 页数:289 大小:12.39MB
收藏 版权申诉 举报 下载
网络接口编程课件整理_第1页
第1页 / 共289页
网络接口编程课件整理_第2页
第2页 / 共289页
网络接口编程课件整理_第3页
第3页 / 共289页
资源描述:

《网络接口编程课件整理》由会员分享,可在线阅读,更多相关《网络接口编程课件整理(289页珍藏版)》请在装配图网上搜索。

1、实验分析:v 客户端客户端IPIP地址和端口号一般无需绑定地址和端口号一般无需绑定客户端程序:客户端程序:#pragma#pragma comment(lib,comment(lib,“ws2_32.libws2_32.lib”)/更多调用的是更多调用的是ws2_32.lib ws2_32.lib 而非而非.DLL.DLL#include#include#include#include void void main()main()WSADATA WSADATA wsaData;wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);WSAStartup(MAKEW

2、ORD(2,2),&wsaData);SOCKET SOCKET connSock=socket(AF_INET,SOCK_STREAM,0);connSock=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN SOCKADDR_IN servAddr;servAddr;servAddr.sin_family=AF_INET;servAddr.sin_family=AF_INET;servAddr.sin_port=htons(9878);servAddr.sin_port=htons(9878);servAddr.sin_addr.s_addr=inet_a

3、ddr(127.0.0.1);servAddr.sin_addr.s_addr=inet_addr(127.0.0.1);connect(connSock,(SOCKADDR connect(connSock,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN);)&servAddr,sizeof(SOCKADDR_IN);char char buf11;buf11;recv(connSock,buf,11,0);recv(connSock,buf,11,0);printf(%s,buf);printf(%s,buf);绪论绪论v 网络工作原理网络工作原理,利用利用

4、TCP/IPTCP/IP协议如何进行网络节点间的数据传输协议如何进行网络节点间的数据传输-分分层次,两种服务、层次,两种服务、C/SC/S模型(理论性的)模型(理论性的)v 套接字套接字APIAPI:基于:基于TCP/IP SocketTCP/IP Socket接口,位于传输层和会话层之间,可接口,位于传输层和会话层之间,可编制出任何基于网络的应用程序编制出任何基于网络的应用程序v 编程要求:编程要求:v 方便:网络协议可以从不同层次切入,越往高层越方便,与硬件的关方便:网络协议可以从不同层次切入,越往高层越方便,与硬件的关系越小。一般地,通信接口编程是介于会话层和传输层之间,对通信系越小。一

5、般地,通信接口编程是介于会话层和传输层之间,对通信进行控制。进行控制。v 可控性:对通信整个过程的控制要强,当然可控性与方便性是一矛盾可控性:对通信整个过程的控制要强,当然可控性与方便性是一矛盾v 通用性:与硬件、与网络系统操作平台、与(底层)通信协议无关(通用性:与硬件、与网络系统操作平台、与(底层)通信协议无关(相关性不大)相关性不大)-跨平台、协议兼容,只与接口类型相关。跨平台、协议兼容,只与接口类型相关。1.1应用编程接口应用编程接口API1.1.1 1.1.1 系统调用系统调用v 基于网络的程序设计需要基于网络的程序设计需要利用利用操作系统集成的操作系统集成的TCP/IPTCP/IP

6、协议协议v 利用如何实现?利用如何实现?-系统调用系统调用v 大多数操作系统使用系统调用的机制在应用程序和操作系大多数操作系统使用系统调用的机制在应用程序和操作系统之间传递控制权。统之间传递控制权。v 对程序员来说,每一个系统调用和一般程序设计中的函数对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系调用非常相似,只是系统调用是将控制权传递给了操作系统统应应用进程使用系统调用的机制用进程使用系统调用的机制应用编程接口应用编程接口API(ApplicationProgrammingInterface)v 当某个应用进程启动系统调用时,控制权就从应

7、用进程当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。传递给了系统调用接口。v 此接口再将控制权传递给计算机的操作系统。操作系统此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程,并执行所请求的操作。将此调用转给某个内部过程,并执行所请求的操作。v 内部过程一旦执行完毕,控制权就又通过系统调用接口内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。返回给应用进程。v 系统调用接口实际上就是应用进程的控制权和操作系统系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口的控制权进行转换的一个接口,即应用编

8、程接口 APIAPI。6硬件硬件网络接口网络接口IPIPTCP UDPTCP UDPTCP/IP模型中的两个分界线模型中的两个分界线WebWeb应用应用 电子邮件电子邮件 文件服务文件服务 .应用层应用层运输层运输层网络层网络层链路层链路层操作系统内核操作系统内核TCP/IPTCP/IP协议协议栈栈应用应用网络接口网络接口协议地址分界线协议地址分界线操作系统分界线操作系统分界线套接字(套接字(SocketSocket)1.2应用进程通过套接字接入到网络应用进程通过套接字接入到网络套接字的作用套接字的作用v 当应用进程需要使用网络进行通信时就发出系统调用,请求操作当应用进程需要使用网络进行通信时

9、就发出系统调用,请求操作系统为其创建系统为其创建“套接字套接字”,以便把网络通信所需要的系统资源分,以便把网络通信所需要的系统资源分配给该应用进程。配给该应用进程。v 操作系统为这些资源的总和用一个号码来表示,并把此号码返回操作系统为这些资源的总和用一个号码来表示,并把此号码返回给应用进程。应用进程所进行的网络操作都必须使用这个号码。给应用进程。应用进程所进行的网络操作都必须使用这个号码。v 通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该系统回收与该“号码号码”相关的所有资源。相关的所有资源。v 套接字套接字Sock

10、etSocket的实质:的实质:为用户提供了一种发送和接受数据的机制为用户提供了一种发送和接受数据的机制,以实现分布式环境下不同主机应用进程之间的通信。以实现分布式环境下不同主机应用进程之间的通信。利用套接字可以实现网络协议在内的网络系统资源的调用利用套接字可以实现网络协议在内的网络系统资源的调用。9第1讲 Windows Sockets API 概述Socket的引入的引入?应用程序应用程序文件文件应用程序应用程序文件文件文件句柄文件句柄FILE*fp=fopen(“a.txt”,“r”);.fscanf(fp,.);.fclose(fp);应用程序应用程序网络接口网络接口SocketSoc

11、ket10第1讲 Windows Sockets API 概述引入引入Socket概念的好处概念的好处v 屏蔽了复杂的网络操作屏蔽了复杂的网络操作通信过程交由操作系统处理通信过程交由操作系统处理v 降低了程序员的开发难度降低了程序员的开发难度只需要关注应用层的业务逻辑只需要关注应用层的业务逻辑v 提高了软件的开发效率提高了软件的开发效率编码和调试工作量大大减少编码和调试工作量大大减少TCP的通信过程的通信过程192.168.0.1:80192.168.0.2:xx等待连接建立连接建立连接SYNSYN ACKACK接收数据发送数据发送数据接收数据关闭连接关闭连接FINFIN ACKACKwait

12、();connect(对端地址对端地址,对端端口对端端口);recv(*缓冲区缓冲区);send(对端地址对端地址,对端端口对端端口,*缓冲区缓冲区);close();close();TCP的通信改进的通信改进192.168.0.1:80192.168.0.2:xx等待连接建立连接建立连接SYNSYN ACKACK接收数据发送数据发送数据接收数据关闭连接关闭连接FINFIN ACKACK创建创建Socket建立与建立与IP地址地址和端口的对应和端口的对应发送发送/接收数据接收数据关闭关闭Socket1.3Windows套接字套接字Winsockv 通信协议的实现往往内嵌于通信系统所用的操作系统

13、中,通信协议的实现往往内嵌于通信系统所用的操作系统中,所以网络编程技术依赖于操作系统平台,如所以网络编程技术依赖于操作系统平台,如WINDOWSWINDOWS、WINCEWINCE、LINUXLINUX平台等平台等v 鉴于鉴于WINDOWSWINDOWS平台的广泛性、因特网的普及和移动计算与平台的广泛性、因特网的普及和移动计算与嵌入式应用的发展,本课程将嵌入式应用的发展,本课程将重点讨论基于重点讨论基于WINDOWSWINDOWS平台平台的的WinsockWinsock网络编程网络编程,过程中捎带介绍,过程中捎带介绍WINCEWINCE平台下的网络平台下的网络编程。编程。v WINDOWS C

14、EWINDOWS CE是一个面向移动计算和嵌入式应用的操作系统,是一个面向移动计算和嵌入式应用的操作系统,支持主流通信协议支持主流通信协议TCP/IPTCP/IP协议,支持协议,支持Winsock1Winsock1(但不支持(但不支持Winsock2Winsock2)1.3Windows套接字套接字Winsockv WinsockWinsock是网络编程接口,而不是协议。该接口基于加利是网络编程接口,而不是协议。该接口基于加利福尼亚大学伯克利分校福尼亚大学伯克利分校BerkeleyBerkeley(BSDBSD)为)为 UnixUnix平台开发平台开发的套接字接口方案,该接口能访问多种网络协议

15、。的套接字接口方案,该接口能访问多种网络协议。v WinsockWinsock包含了大部分的包含了大部分的Berkeley SocketsBerkeley Sockets,并充分利用,并充分利用WindowsWindows的消息机制和的消息机制和Win32Win32平台的高性能平台的高性能I/OI/O模型开发了模型开发了一些扩展性函数(通常一些扩展性函数(通常以以WSAWSA打头打头)v WinsockWinsock现在用的是现在用的是Winsock2Winsock2,可以方便地支持多种底层,可以方便地支持多种底层协议,如协议,如TCP/IPTCP/IP,IPX/SPXIPX/SPX,ATMA

16、TM等等几种应用编程接口几种应用编程接口APIv Berkeley UNIX Berkeley UNIX 操作系统定义了一种操作系统定义了一种 APIAPI,它又称为套,它又称为套接字接口接字接口(socket interface)(socket interface)。v 微软公司在其操作系统中采用了套接字接口微软公司在其操作系统中采用了套接字接口 APIAPI,形成,形成了一个稍有不同的了一个稍有不同的 APIAPI,并称之为,并称之为 Windows SocketWindows Socket。v AT&T AT&T 为其为其 UNIX UNIX 系统系统 V V 定义了一种定义了一种 AP

17、IAPI,简写为,简写为 TLI TLI(Transport Layer Interface)(Transport Layer Interface)。v 虽然利用虽然利用winsockwinsock网络编程接口的好处是因为它是一个与网络编程接口的好处是因为它是一个与协议无关的接口,但仍要考虑相应通信协议的一些特征协议无关的接口,但仍要考虑相应通信协议的一些特征,以便对通信进行更好的控制(以参数化的方式)。,以便对通信进行更好的控制(以参数化的方式)。各各Windows平台支持的平台支持的WinSock版本版本平台WinSock版本Windows 951.1(2.2)Windows 982.2W

18、indows NT 4.02.2Windows 20002.2Windows XP2.21.4面向消息和基于字节流面向消息和基于字节流v 面向消息:,通信协议对应用程序给出的原始消息不拆分面向消息:,通信协议对应用程序给出的原始消息不拆分也不合并,如也不合并,如UDPUDP协议协议,保护消息边界(有时难以满足),保护消息边界(有时难以满足),消息(数据)发送和读取的一致性消息(数据)发送和读取的一致性v 基于字节流:连续的数据传输和读取,不管消息边界存在基于字节流:连续的数据传输和读取,不管消息边界存在与否,传输协议对原始消息可拆分也也可合并,如与否,传输协议对原始消息可拆分也也可合并,如TC

19、PTCP协协议,消息(数据)发送和读取的独立性议,消息(数据)发送和读取的独立性部分消息部分消息v 部分消息只用于面向消息的协议。例如,一发送端计算机部分消息只用于面向消息的协议。例如,一发送端计算机正在传输大型消息,正在传输大型消息,而接收端计算机可能没有足够多的资而接收端计算机可能没有足够多的资源来容纳整条消息,或消息长度超过了协议的最大报文长源来容纳整条消息,或消息长度超过了协议的最大报文长度度(实际上,多数面向消息的协议对数据报的最大长度都(实际上,多数面向消息的协议对数据报的最大长度都有一个合理限制,因此,这一特殊事件不会经常发生),有一个合理限制,因此,这一特殊事件不会经常发生),

20、这时若通信协议支持部分消息就能保证接收端能分次收到这时若通信协议支持部分消息就能保证接收端能分次收到完整消息,否则传送会失败。完整消息,否则传送会失败。1.4面向连接和无连接面向连接和无连接v 面向连接:进行数据交换之前,必须与通信方建立一条路面向连接:进行数据交换之前,必须与通信方建立一条路径。这样既保证了通信方之间存在路由,又保证了通信双径。这样既保证了通信方之间存在路由,又保证了通信双方都是活动的、都可彼此响应,但其特点是在通信双方之方都是活动的、都可彼此响应,但其特点是在通信双方之间建立一个通信信道需要很多开支(时间)。除此之外,间建立一个通信信道需要很多开支(时间)。除此之外,大部分

21、面向连接的协议为保证投递无误,可能会因执行额大部分面向连接的协议为保证投递无误,可能会因执行额外的验证计算而进一步增加开支。外的验证计算而进一步增加开支。v 面向无连接:不保证接收端是否正在收听。类似于邮政服面向无连接:不保证接收端是否正在收听。类似于邮政服务务发信人将信装入邮箱即可。至于收信人是否想收到、发信人将信装入邮箱即可。至于收信人是否想收到、邮局是否因为暴风雨未能按时将信件投递到收信人处等等,邮局是否因为暴风雨未能按时将信件投递到收信人处等等,发信人不得而知。无连接协议的过人之处是速度,此外可发信人不得而知。无连接协议的过人之处是速度,此外可进行多目标传输。进行多目标传输。从容关闭从

22、容关闭(对应于慌慌张张关闭)(对应于慌慌张张关闭)v 只出现在面向连接的协议中(面向无连接不可)。在这种只出现在面向连接的协议中(面向无连接不可)。在这种关闭过程中,一方开始关闭会话,但另一方仍然可以读取关闭过程中,一方开始关闭会话,但另一方仍然可以读取线上或已挂起的数据。线上或已挂起的数据。v 如果面向连接的协议不支持从容关闭,只要其中一方关闭如果面向连接的协议不支持从容关闭,只要其中一方关闭了通信信道,都会导致连接立即中断,数据丢失,接收端了通信信道,都会导致连接立即中断,数据丢失,接收端不能读取数据(哪怕数据已传到接收端)这些情况。不能读取数据(哪怕数据已传到接收端)这些情况。1.4广播

23、数据广播数据v这一特征适合于这一特征适合于无连接协议无连接协议,使用广播消息的不利之,使用广播消息的不利之处是处是LANLAN上的所有机器都必须对该消息进行处理:网卡将上的所有机器都必须对该消息进行处理:网卡将其上传到网络堆栈,然后堆栈将这条消息在所有的网络应其上传到网络堆栈,然后堆栈将这条消息在所有的网络应用中循环,看它们是否应该接收这一消息。而大多数都是用中循环,看它们是否应该接收这一消息。而大多数都是一弃了之(一弃了之(方便,但易造成干扰,慎用方便,但易造成干扰,慎用)。)。一般情况下,一般情况下,路由器都不会转发广播包路由器都不会转发广播包。多播数据多播数据v 多播是指一个进程发送数据

24、的能力,这些数据即将由一个多播是指一个进程发送数据的能力,这些数据即将由一个或多个接收端进行接收。进程加入一个多播会话的方法和或多个接收端进行接收。进程加入一个多播会话的方法和采用的基层协议有关。比如,采用的基层协议有关。比如,IPIP协议下,多播是广播的协议下,多播是广播的一种变形。一种变形。IPIP多播要求对收发数据感兴趣的所有主机加入多播要求对收发数据感兴趣的所有主机加入一个特定的组。一个特定的组。进程希望加入多播组时,网卡上会增添一进程希望加入多播组时,网卡上会增添一个过滤器,个过滤器,这样,只有绑定组地址的数据才会被网络硬件这样,只有绑定组地址的数据才会被网络硬件捡起,并上传到网络堆

25、栈进行恰当处理。捡起,并上传到网络堆栈进行恰当处理。视频会议应用常视频会议应用常常使用多播常使用多播。1.4路由能力路由能力v 一个重要考虑就是协议是否可路由。如果协议可路由,就可在两个工一个重要考虑就是协议是否可路由。如果协议可路由,就可在两个工作站之间建立一条成功的通信路径(要么是面向连接的回路,要么是作站之间建立一条成功的通信路径(要么是面向连接的回路,要么是数据报的数据路径),不管这两个工作站之间存在的网络硬件是什么。数据报的数据路径),不管这两个工作站之间存在的网络硬件是什么。比如,机器比如,机器A A和机器和机器B B分别在各自的子网中。连接两个子网的路由器分别在各自的子网中。连接

26、两个子网的路由器A A把这两台机器分开了。一个可路由的协议意识到机器把这两台机器分开了。一个可路由的协议意识到机器B B和机器和机器A A不在同不在同一个子网上:它就会把数据包定向到路由器,由路由器来决定数据的一个子网上:它就会把数据包定向到路由器,由路由器来决定数据的最佳转发方式,以便数据能抵达机器最佳转发方式,以便数据能抵达机器B B。非路由协议不能作出这样的。非路由协议不能作出这样的规定:路由器会将它收到的非路由协议数据包统统丢弃。路由器不对规定:路由器会将它收到的非路由协议数据包统统丢弃。路由器不对发自非路由协议的数据包进行转发,即便数据包的既定目的地在其连发自非路由协议的数据包进行转

27、发,即便数据包的既定目的地在其连接的子网上。接的子网上。v NetBEUINetBEUI是是Win32Win32平台支持的唯一一个不能路由的协议平台支持的唯一一个不能路由的协议。v WIN32WIN32平台提供的最有用的特征之一是能够同步支持多种不同的网络平台提供的最有用的特征之一是能够同步支持多种不同的网络协议。通常,各个协议又都同时支持多种特征。协议。通常,各个协议又都同时支持多种特征。2.1 Winsock三种套接字类型v 流类型(流类型(Stream SocketsStream Sockets)流式套接字提供了一种可靠的、面向连接的数据传输方式,使用流式套接字提供了一种可靠的、面向连接

28、的数据传输方式,使用TCPTCP传输控制协议传输控制协议v 数据报类型(数据报类型(Datagram SocketsDatagram Sockets)数据包套接字提供了一种非可靠的、面向无连接的数据传输方式,使数据包套接字提供了一种非可靠的、面向无连接的数据传输方式,使用用户报文数据包传输协议用用户报文数据包传输协议v 原始套接字(原始套接字(Raw SocketsRaw Sockets)用于从用于从IPIP头头(而非而非TCP/UDP)TCP/UDP)起构造报文,起构造报文,利用利用“原始套接字原始套接字”可访问可访问位于基层的传输协议,亦可对位于基层的传输协议,亦可对IPIP头信息进行实际

29、的操作,如头信息进行实际的操作,如读写读写ICMPICMP和和IGMPIGMP报文。报文。2.2 面向无连接流程基于基于UDPUDP的的socketsocket编程编程服务器端(接收端)程序:1 1、创建套接字、创建套接字(socket)(socket)2 2、将、将socketsocket绑定到一个本绑定到一个本地地IPIP地址和端口上地址和端口上(bind)(bind)3 3、等待接收数据、等待接收数据(recvfrom)(recvfrom)4 4、关闭、关闭socket(closesocket)socket(closesocket)客户端(发送端)程序:1 1、创建套接字、创建套接字(s

30、ocket)(socket)2 2、向服务器发送数据、向服务器发送数据(sendto)(sendto)3 3、关闭、关闭socket(closesocket)socket(closesocket)2.2 面向连接流程基于基于TCPTCP的的socketsocket编程编程服务器端程序:1 1、创建套接字、创建套接字(socket)(socket)2 2、将、将socketsocket绑定到一个本地绑定到一个本地IPIP地址和端口上地址和端口上(bind)(bind)3 3、将、将socketsocket设为监听模式,准备设为监听模式,准备接收客户请求接收客户请求(listen)(listen)

31、4 4、等待客户请求到来:当请求到、等待客户请求到来:当请求到来后,接收连接请求,返回一个来后,接收连接请求,返回一个新的对应于此次连接的新的对应于此次连接的socket(accept)socket(accept)5 5、用返回的、用返回的socketsocket和客户端进行和客户端进行通信通信(send/recv)(send/recv)6 6、返回,等待另一客户请求、返回,等待另一客户请求7 7、关闭、关闭socket(closesocket)socket(closesocket)客户端程序:1 1、创建套接字、创建套接字(socket)(socket)2 2、向服务器发出连接请求、向服务器

32、发出连接请求(connect)(connect)3 3、和服务器进行通信、和服务器进行通信(send/recv)(send/recv)4 4、关闭、关闭socket(closesocket)socket(closesocket)无连接循环服务器v 使用无连接的使用无连接的 UDP UDP 的服务器通常都工作在循环方式的服务器通常都工作在循环方式 一个服务器在同一时间只能向一个客户提供服务。一个服务器在同一时间只能向一个客户提供服务。v 服务器收到客户的请求后,就发送服务器收到客户的请求后,就发送 UDP UDP 用户数据报响应用户数据报响应该客户。但对其他客户发来的请求则暂时不予理睬,这该客户

33、。但对其他客户发来的请求则暂时不予理睬,这些请求都在服务器端的队列中排队等候服务器的处理。些请求都在服务器端的队列中排队等候服务器的处理。v 当服务器进程处理完毕一个请求时,就从队列中读取来当服务器进程处理完毕一个请求时,就从队列中读取来自下一个客户的请求,然后继续处理。自下一个客户的请求,然后继续处理。无连接循环服务器的特点 UDPUDP 服务器服务器UDPUDP 客户客户临时端口临时端口熟知端口熟知端口UDPUDP 客户客户临时端口临时端口UDPUDP 客户客户临时端口临时端口一次一个一次一个客户客户服务器只使用一个熟知服务器只使用一个熟知端口。每一个客户则使端口。每一个客户则使用自己创建

34、的临时端口用自己创建的临时端口(端口号自己设定)。(端口号自己设定)。面向连接并发服务器v 服务器在同一时间可向多个客户提供服务。服务器在同一时间可向多个客户提供服务。v TCP TCP 是面向连接的,因此在服务器和多个客户之间必是面向连接的,因此在服务器和多个客户之间必须建立多条须建立多条 TCP TCP 连接,而每一条连接,而每一条 TCP TCP 连接要在其数连接要在其数据传送完毕后才能释放。据传送完毕后才能释放。v 使用使用 TCP TCP 的服务器只能有一个熟知端口。因此主服务的服务器只能有一个熟知端口。因此主服务器在熟知端口等待客户发出的请求。一旦收到客户的器在熟知端口等待客户发出

35、的请求。一旦收到客户的请求,就立即创建一个从属服务器,并指明从属服务请求,就立即创建一个从属服务器,并指明从属服务器使用临时端口和该客户建立器使用临时端口和该客户建立 TCP TCP 连接,然后主服务连接,然后主服务器继续在原来的熟知端口等待向其他客户提供服务。器继续在原来的熟知端口等待向其他客户提供服务。面向连接并发服务器的特点 TCPTCPTCPTCP 客户客户临时端口临时端口临临时时端端口口TCPTCP 客户客户临时端口临时端口TCPTCP 客户客户临时端口临时端口 主服务器主服务器TCP TCP 连接连接熟知端口仅用于熟知端口仅用于接受服务请求接受服务请求创建创建从属服务器从属服务器主

36、服务器有时又称为父服务主服务器有时又称为父服务器,而从属服务器又称为子器,而从属服务器又称为子服务器。服务器。进程通过系统调用接口进行通信的过程进程通过系统调用接口进行通信的过程1.无连接循环服务器 服务器服务器recvfrom()socket()bind()recvfrom()无限制重复无限制重复socket()若需要就重复若需要就重复sendto()进程进程sendto()close()客户客户请求请求响应响应2.面向连接并发服务器 服务器服务器read()socket()bind()accept()无限制重复无限制重复socket()若需要就重复若需要就重复write()进程进程clos

37、e()接受接受close()客户客户请求请求响应响应listen()fork()connect()write()read()close()监听监听若需要就重复若需要就重复连接请求连接请求主服务器主服务器close()接受接受从属服务器从属服务器2.3Winsock地址家族地址家族要通过要通过WinsockWinsock建立通信,必须了解如何利用指定的建立通信,必须了解如何利用指定的协议为工作站定址。协议为工作站定址。Winsock2Winsock2引入了几个新的、与协议无引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用,但是多关的函数,它们可和任何一个地址家族一起使用,但是多

38、数情况下,各协议家族都有自己的地址解析机制。数情况下,各协议家族都有自己的地址解析机制。可以说不同协议下可以说不同协议下WinsockWinsock接口编程主要区别就在地接口编程主要区别就在地址结构上的不同,其它接口函数调用都没有什么大的区别,址结构上的不同,其它接口函数调用都没有什么大的区别,这正体现了这正体现了WinsockWinsock接口对通信协议的兼容性。接口对通信协议的兼容性。INET协议族地址结构协议族地址结构sockaddr_inStruct sockaddr_in short sin_family;u_short sin_port;struct in_addr sin_add

39、r;char sin_zero8;地址族端口IP地址8字节全0sin_familysin_family字段一般设为常量字段一般设为常量AF_INETAF_INET,以告知,以告知WinsockWinsock此时此时正在使用正在使用IPIP地址家族地址家族,而非其他协议家族,而非其他协议家族AF_IRDAAF_IRDA、AF_IPXAF_IPX等。等。sin_addrsin_addr字段字段:IP:IP地址地址。sin_portsin_port字段定义使用哪个字段定义使用哪个TCPTCP或或UDPUDP通信端口来标识服务器通信端口来标识服务器服务,端口号服务,端口号字段字段sin_zerosin

40、_zero唯一的作用是充当填充项,以使唯一的作用是充当填充项,以使SOCKADDR_INSOCKADDR_IN结构和结构和SOCKADDRSOCKADDR结构的长度一样(结构的长度一样(1616个字节)。个字节)。与与INETINET协议族地址结构协议族地址结构sockaddr_insockaddr_in相关的是相关的是IPv4IPv4协议族地协议族地址结构址结构in_addrin_addr,也是,也是WinsockWinsock中常用的地址结构中常用的地址结构Struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4;S_un_b;struc

41、t u_short s_w1,s_w2;S_un_w;u_long S_addr;S_un;#define s_addr S_un.S_addr#define s_host S_un.S_un_b.s_b2#define s_net S_un.S_un_b.s_b1 (为简化表示)#define s_imp S_un.S_un_w.s_w2#define s_impno S_un.S_un_b.s_b4#define s_lh S_un.S_un_b.s_b3;32位IP地址点分十进制地址CIDR地址该结构为包含多个结合的联合体,提供了该结构为包含多个结合的联合体,提供了3 3种赋值的接口:种

42、赋值的接口:S_addr S_addr,S_un_b S_un_b 和和S_un_wS_un_wS_addrS_addr为为3232为无符号整数,对应为无符号整数,对应3232位位IPIP地址,同上地址,同上sin_addrsin_addr,S_un_bS_un_b包含包含4 4个个8 8位无符号整数,组合起来表示位无符号整数,组合起来表示IPIP地址地址通用地址结构为增强通用性,一些包含地址参数的为增强通用性,一些包含地址参数的WinsockWinsock接口函数如接口函数如bindbind、connectconnect等常用通用地址结构等常用通用地址结构sockaddrsockaddr:对

43、于程序员来讲,很少直接使用通用地址,对于程序员来讲,很少直接使用通用地址,唯一需要记住的唯一需要记住的是务必要将是务必要将INTINT等其它地址强制转换为通用地址(造型)等其它地址强制转换为通用地址(造型)例:例:struct sockaddr_in from;int len=sizeof(from);if(accept(sock,(struct sockaddr*)&from,&len)=SOCKET_ERROR)printf(“accept:%d”,WSAGetLastError();else printf(“%sn”,inet_ntoa(from.sin_addr);小结sa_famil

44、ysa_familysa_datasa_datasockaddrsockaddr结构体结构体s_b1s_b1s_b2s_b2s_b3s_b3s_b4s_b4s_w1s_w1s_w2s_w2S_addrS_addrin_addrin_addr结构体结构体sin_familysin_familysin_portsin_portsin_addrsin_addrsin_zerosin_zerosockaddr_insockaddr_in结构体结构体常用地址操作函数为用户表达的直观性和方便性,常用以下函数对地址进行转为用户表达的直观性和方便性,常用以下函数对地址进行转换:换:v inet_addr:in

45、et_addr:将点分十进制表示的将点分十进制表示的IPIP地址字符串转换为地址字符串转换为3232位整数(计算机内用)位整数(计算机内用)unsigned long inet_addr(const char FAR unsigned long inet_addr(const char FAR*cp);cp);v inet_ntoa:inet_ntoa:将将3232位整数转换为点分十进制表示的位整数转换为点分十进制表示的IPIP地址地址字符串(显示)字符串(显示)char FAR char FAR*inet_ntoa(struct in_addr in);inet_ntoa(struct in

46、_addr in);v gethostbyname:gethostbyname:域名解析(很重要的功能,其它地址结域名解析(很重要的功能,其它地址结构也是)构也是)struct hostent FAR struct hostent FAR*gethostbyname(const char gethostbyname(const char FAR FAR*name);name);-表示该函数返回的是一个结构体表示该函数返回的是一个结构体例:例:P186P186In_addr addr;In_addr addr;Addr.S_un.S_addr=inet_addr(“202.195.168.70”

47、);Addr.S_un.S_addr=inet_addr(“202.195.168.70”);HOSTENT HOSTENT*host=gethostbyname(“”);host=gethostbyname(“”);域名解析代码(域名解析代码(P186P186)v struct hostent struct hostent char char*h_name;h_name;char char*h_aliases;h_aliases;int h_addrtype;int h_addrtype;int h_length;int h_length;char char*h_addr_list;h_ad

48、dr_list;特殊地址对于特定情况下的套接字行为,有两个特殊对于特定情况下的套接字行为,有两个特殊IP IP 地址可对它地址可对它们产生影响。们产生影响。INADDRANYINADDRANY:表示本地的任意以太网接口,允许服务器监听:表示本地的任意以太网接口,允许服务器监听每个网络接口上的客户机活动,而不必关心具体是哪个接每个网络接口上的客户机活动,而不必关心具体是哪个接口口INADDRBROADCASTINADDRBROADCAST:用于在一个:用于在一个IPIP网络中发送广播网络中发送广播UDPUDP数据报数据报(要使用这个特殊地址,需要应用设置套接字选项(要使用这个特殊地址,需要应用设

49、置套接字选项SOBROADCASTSOBROADCAST)网络字节顺序v 与地址相关的还有一个计算机排序的问题。不同的计算机存放多字节与地址相关的还有一个计算机排序的问题。不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节值的顺序不同,有的机器在起始地址存放低位字节(称为小头称为小头big-big-endian)endian),有的机器在起始地址存放高位字节,有的机器在起始地址存放高位字节(称为小头称为小头little-little-endian)endian)。如,。如,Intel86Intel86处理器上,用处理器上,用“小头小头”形式来表示多字节编号:形式来表示多字节编号

50、:字节的排序是从最无意义的字节到最有意义的字节。字节的排序是从最无意义的字节到最有意义的字节。v 在计算机中把在计算机中把IPIP地址和端口号指定成多字节数时,这个数就按地址和端口号指定成多字节数时,这个数就按“主机主机字节字节”(host-bytehost-byte)顺序来表示(可能是大头,也可能是小头)。)顺序来表示(可能是大头,也可能是小头)。但是,如果在网络上指定但是,如果在网络上指定IPIP地址和端口号,地址和端口号,“互联网联网标准互联网联网标准”指定指定多字节值必须用多字节值必须用“大头大头”形式来表示(从最有意义的字节到最无意义形式来表示(从最有意义的字节到最无意义的字节),一

51、般称之为的字节),一般称之为“网络字节网络字节”(network-bytenetwork-byte)顺序。)顺序。所以为保证数据的正确性,在网络协议中存取地址时需强制所以为保证数据的正确性,在网络协议中存取地址时需强制性地将地址转换为网络字节顺序,常用以下两个函数:性地将地址转换为网络字节顺序,常用以下两个函数:函数函数htonl():htonl():(host to network longhost to network long)是把主机的字节)是把主机的字节顺序转化成网络上的字节顺序,参数为顺序转化成网络上的字节顺序,参数为long intlong int型;型;函数函数htons():

52、htons():(host to network shorthost to network short)同上,只不)同上,只不过参数为过参数为short intshort int型。型。例:例:2.4.1 Windows Socket常用库函数静态链接库静态链接库ws2_32.libws2_32.lib可执行程序可执行程序链接链接动态链接库动态链接库ws2_32.dllws2_32.dll执行执行源程序源程序头文件头文件winsock2.hwinsock2.h目标文件目标文件编译编译#include#pragma comment(lib,ws2_32.lib)WSAStartup();WSAC

53、leanup();3.1 Winsock的初始化每个每个WinsockWinsock应用都必须加载应用都必须加载Winsock DLLWinsock DLL的相应版本,的相应版本,并首先要调用并首先要调用WSAStartupWSAStartup(Winsock2Winsock2中的)函数,该函数中的)函数,该函数完成:完成:链接库的初始化链接库的初始化应用程序或应用程序或DLLDLL与系统与系统WinsockWinsock库之间的版本协商库之间的版本协商该函数的定义为:该函数的定义为:ininwVersionRequestedwVersionRequested参数:用于指定准备加载的参数:用于

54、指定准备加载的WinsockWinsock库的版本。高位字节指定所需要的库的版本。高位字节指定所需要的WinsockWinsock库的副版本,库的副版本,而低位字节则是主版而低位字节则是主版 outoutlpWSADatalpWSAData参数:是参数:是指向指向WSADATAWSADATA结构的指针结构的指针(可获(可获取),取),WSADATAWSADATA为结构数据类型,描述了为结构数据类型,描述了WinsockWinsock底层实现底层实现的的相关信息(如最多可以打开的套接字数和最大报文长度,相关信息(如最多可以打开的套接字数和最大报文长度,但很多时候受其他因素影响该信息无用但很多时候

55、受其他因素影响该信息无用)版本号的表示:版本号的表示:一般用一般用宏宏MAKEWORD(X,Y)MAKEWORD(X,Y)(其中,(其中,X X是高位字节(是高位字节(主版本主版本号号),),Y Y是低位字节(是低位字节(次版本号次版本号)表示)表示wVersion wVersion RequestedRequested的正确值。的正确值。例:例:MAKEWORD(2,2)MAKEWORD(2,2)注意:版本号越高,加载的库函数越多,但:注意:版本号越高,加载的库函数越多,但:考虑应用程序的通用性,不一定要最新版本;考虑应用程序的通用性,不一定要最新版本;高版本可以解决低版本中不可思议的错误高

56、版本可以解决低版本中不可思议的错误。!如果调用!如果调用WinsockWinsock之前,没有加载之前,没有加载WinsockWinsock库,这个函数就库,这个函数就会返回一个会返回一个SOCKET_ERRORSOCKET_ERROR值,错误信息是值,错误信息是WSANOTINITIALISEDWSANOTINITIALISED及比较明确的错误代码:及比较明确的错误代码:WSACleanupWSACleanup函数:函数:与与WSAStartupWSAStartup配套使用的是配套使用的是WSACleanupWSACleanup函数,其作用是清除函数,其作用是清除WinsockWinsock

57、:WSACleanupWSACleanup()()3.2 错误检查和控制v 同一般应用程序一样,对一个编写成功的同一般应用程序一样,对一个编写成功的WinsockWinsock应用程应用程序而言,错误检查和控制是至关重要的,且对序而言,错误检查和控制是至关重要的,且对WinsockWinsock函函数来说,返回错误是非常常见的(但,多数情况下,这些数来说,返回错误是非常常见的(但,多数情况下,这些错误都是无关紧要的,通信仍可进行)错误都是无关紧要的,通信仍可进行)v 不成功的不成功的WinsockWinsock调用返回的最常见的值是常量调用返回的最常见的值是常量SOCKET_ERRORSOCK

58、ET_ERROR,可以此为,可以此为判断,判断,例(函数调用和错误判断一例(函数调用和错误判断一般一并进行):般一并进行):v 如果调用一个如果调用一个WinsockWinsock函数,错误情况发生了,可用函数,错误情况发生了,可用WSAGetLastErrorWSAGetLastError函数函数来获得一段代码来获得一段代码,这段代码明确地,这段代码明确地表明发生的状况,可便于程序调试。表明发生的状况,可便于程序调试。v WSAGetLastErrorWSAGetLastError函数返回值都是已预定义常量值函数返回值都是已预定义常量值,根据,根据WinsockWinsock版本的不同,这些

59、值的声明不在版本的不同,这些值的声明不在Winsock1.hWinsock1.h中,中,就会在就会在Winsock2.hWinsock2.h中。两个头字段的唯一差别是中。两个头字段的唯一差别是Winsock2.hWinsock2.h中包含的错误代码(针对中包含的错误代码(针对Winsock2Winsock2中引入的一中引入的一些新的些新的APIAPI函数和性能)更多。且为各种错误代码定义的函数和性能)更多。且为各种错误代码定义的常量(带有常量(带有#定义指令)定义指令)一般都以一般都以WSAEWSAE开头开头。创建套接字函数socket()创建一个套接字的作用是使应用程序之间能够通过创建一个套

60、接字的作用是使应用程序之间能够通过TCPTCP、UDPUDP和和IPIP等协议进行通信(有了一个通信接口),否则无等协议进行通信(有了一个通信接口),否则无法进行通信。法进行通信。注:很多常量参数都可用0表示无特殊需要说明绑定套接字函数bind()一旦为某种特定协议创建了套接字,就必须将套接字一旦为某种特定协议创建了套接字,就必须将套接字绑定到一个已知地址。绑定到一个已知地址。bindbind函数可将指定的套接字同一个函数可将指定的套接字同一个已知地址绑定到一起。该函数声明如下:已知地址绑定到一起。该函数声明如下:注意:函数调用中要将地址注意:函数调用中要将地址强制转换为强制转换为为为stru

61、ct sockaddrstruct sockaddr常量,例:常量,例:可以依据返回值判断绑定成功与否:!可以依据返回值判断绑定成功与否:!=0=0为错误为错误对对bindbind来说,最常见的错误是来说,最常见的错误是WSAEADDRINUSEWSAEADDRINUSE。如使用的是。如使用的是TCP/IPTCP/IP,那么,那么WSAEADDRINUSEWSAEADDRINUSE就表示另一个进程已经同本就表示另一个进程已经同本地地IPIP接口和端口号绑定到了一起。接口和端口号绑定到了一起。监听函数listen()bind bind函数的作用只是将一个套接字和一个指定的地址函数的作用只是将一个

62、套接字和一个指定的地址关联在一起。指示一个套接字关联在一起。指示一个套接字等候进入等候进入连接的连接的APIAPI函数则函数则是是listenlisten,其定义如下:,其定义如下:例如:例如:假定假定backlogbacklog参数为参数为2 2。如果三个客户机同时发出请求,那么头两。如果三个客户机同时发出请求,那么头两个会被放在一个个会被放在一个“待决待决”(等待处理)队列中,以便应用程序依次为(等待处理)队列中,以便应用程序依次为它们提供服务。而第三个连接会造成一个它们提供服务。而第三个连接会造成一个WSAECONNREFUSEDWSAECONNREFUSED错误。错误。注意,注意,一旦

63、服务器接受了一个连接,那个连接请求就会从队列一旦服务器接受了一个连接,那个连接请求就会从队列中删去中删去,以便其它用户可继续发出请求。,以便其它用户可继续发出请求。其实其实backlogbacklog参数本身就存在限制,这个限制是由基层的协议提参数本身就存在限制,这个限制是由基层的协议提供者决定的。如果出现非法值,那么会用与之最接近的一个合法值来供者决定的。如果出现非法值,那么会用与之最接近的一个合法值来取代。除此以外,对于如何知道实际的取代。除此以外,对于如何知道实际的backlogbacklog值,其实并不存在一值,其实并不存在一种标准手段。种标准手段。接收连接函数accept()如果服务

64、器已做好了如果服务器已做好了接受客户连接接受客户连接的准备,可通过的准备,可通过acceptaccept或或WSAAcceptWSAAccept函数来完与客户的连接。函数来完与客户的连接。acceptaccept格式格式如下:如下:例:例:struct sockaddr_in from;struct sockaddr_in from;int len=sizeof(from);int len=sizeof(from);if(accept(sockif(accept(sock,(struct sockaddr,(struct sockaddr*)&from)&from,&len)=,&len)=S

65、OCKET_ERROR)SOCKET_ERROR)printf(“accept:%d”,WSAGetLastError();printf(“accept:%d”,WSAGetLastError();elseelse printf(“%sn”,inet_ntoa(from.sin_addr);printf(“%sn”,inet_ntoa(from.sin_addr);Winsock 2 Winsock 2引入了一个名为引入了一个名为WSAAcceptWSAAccept的函数。它能根的函数。它能根据一个条件函数的返回值,选择性地接受一个连接。服务据一个条件函数的返回值,选择性地接受一个连接。服务器

66、根据传递给条件函数的参数,作出接受、拒绝还是延后器根据传递给条件函数的参数,作出接受、拒绝还是延后客户机的连接请求的操作和相应反馈。客户机的连接请求的操作和相应反馈。连接请求函数connect()前面几个主要为服务器前面几个主要为服务器APIAPI函数,相对来说客户机建函数,相对来说客户机建立成功连接所需的步骤要少得多,一般只需三步:立成功连接所需的步骤要少得多,一般只需三步:1)1)创建一个套接字。创建一个套接字。2)2)解析服务器名(以基层协议为准)。解析服务器名(以基层协议为准)。3)3)初始化一个连接。初始化一个连接。可见属于客户端的可见属于客户端的APIAPI函数主要是连接请求,用函数主要是连接请求,用connectconnect或或WSAConnectWSAConnect。如果想连接的计算机没有监听指定端口这一进程,调如果想连接的计算机没有监听指定端口这一进程,调用就会失败,并发生错误用就会失败,并发生错误WSAECONNREFUSEDWSAECONNREFUSED。另一个错误可能是另一个错误可能是WSAETIMEDOUTWSAETIMEDOUT,这种情况一般发生,这种情况

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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