版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、11.1.2 TCP/IP模型模型应用层应用层表示层表示层会话层会话层传输层传输层终端机终端机网络层网络层链路层链路层物理层物理层应用层应用层传输层传输层终端机终端机网络层网络层网络访问网络访问OSI模型模型TCP/IP模型模型2应应用用层层应应用用层层表表示示层层会会话话层层传传输输层层传传输输层层网网络络层层网网络络层层数据数据链路链路层层物物理理层层网网络络接接入入层层超文本超文本传输传输文件文件传输传输电子电子邮件邮件终端终端仿真仿真域名域名文件文件传输传输客户客户/服务器服务器网络网络管理管理HTTP Rfc2068FTPRfc959SMTPRfc854TELNETRfc854DNS
2、Rfc10341035TFTPRfc783NSFRfc101410571094SNMPRfc1157190110227175传输控制协议(传输控制协议(TCP) rfc 793用户数据报协议(用户数据报协议(UDP) rfc 768地址解释协议(地址解释协议(ARP) rfc 826 903互联网协议(互联网协议(IP) rfc 791 互联网控制报文互联网控制报文协议(协议(ICMP) rfc 792网卡:以太网、令牌环、网卡:以太网、令牌环、ARCNET、MAN和和WAN rfc 894 1042 1201传输介质:双绞线、同轴、光纤、无线介质传输介质:双绞线、同轴、光纤、无线介质ARPA
3、层层OSI层层32.1 IP2.1 IP地址地址IP地址分类(保留)42.1 IP2.1 IP地址地址特殊IP地址网络部分主机部分地址类型用 途127any全“0”全“1”Any全“0”Any全“1”网络地址代表一个网段广播地址特定网段的所有节点环回地址环回测试广播地址本网段所有节点所有网络通常用于指定默认路由5A A类地址类地址 前前8 8位表示网络地址,取值由位表示网络地址,取值由NICNIC决定,第一位固定为决定,第一位固定为0 0,剩余剩余7 7为可表示为可表示2 27 7 = 128 = 128个个A A类网络。类网络。A A类地址一般分配给政类地址一般分配给政府部门、大型网络或大型
4、机构使用(如府部门、大型网络或大型机构使用(如IBMIBM公司、公司、DECDEC公司公司等),目前已经分配完了。等),目前已经分配完了。A A类地址的后类地址的后2424位指主机的地址。位指主机的地址。2424位的主机地址共有位的主机地址共有2 22424=16777216=16777216个主机地址。个主机地址。 B B类地址的前类地址的前1616位表示网络地址,由位表示网络地址,由NICNIC决定,其中前决定,其中前2 2位位固定为固定为1010。所以可以表示。所以可以表示2 21414=16384=16384个个B B类网络。后类网络。后1616位表示位表示机器地址,共有机器地址,共有
5、2 21616=65536=65536个主机地址。个主机地址。B B类地址一般分配给类地址一般分配给中型网络或中型机构使用中型网络或中型机构使用 B B类地址类地址 6C C类地址类地址 C C类地址的前类地址的前2424位组成网络地址,由位组成网络地址,由NICNIC决定,其中前决定,其中前2 2位位为为1111,剩余,剩余2222位,所以应该有位,所以应该有2 22222=4194304=4194304个个C C类网络。但是在类网络。但是在C C类地址的前类地址的前4 4位中,位中,11101110保留给组播保留给组播(Multicase, 224-Multicase, 224-23923
6、9), ,11111111保留给实验用保留给实验用(240240,255255),所以真正可用的),所以真正可用的C C类类网络地址数为应有的网络地址数网络地址数为应有的网络地址数 保留的地址数,即保留的地址数,即2 22222-2-22121 = 2097152= 2097152个网络地址。个网络地址。C C类地址的后类地址的后8 8为是主机地址。应有为是主机地址。应有2 28 8=256=256个主机地址。但是需要扣除个主机地址。但是需要扣除网络地址网络地址(1 1个)和个)和广播地广播地址址(1 1个),所以真正可用的个),所以真正可用的C C类网络的主机地址,最多可以有类网络的主机地址
7、,最多可以有254254个个 7根据分配的网络地址前根据分配的网络地址前8 8位位快速判定网络的类型快速判定网络的类型 前8位值类型说明0 - 127A类IP地址开头是0 127,就是A类网络地址128 - 191B类IP地址开头是128 191,就是B类网络地址192 - 223C类IP地址开头是192 223,就是C类网络地址224 239D类保留给Multicast(组播)使用240 - 255E类保留给实验用82. 2. 子网掩码子网掩码 使用子网掩码可以判定IP地址是否属于某一子网。例如局域网中的一个主机在发送IP包时,包头中携带有目的IP地址,通过子网掩码,就可以判定包是发送到本网
8、内的某个主机,还是发送到网外的主机,从而选择不同的处理.。子网掩码的形式为:网络及子网地址部分置1,主机地址置0形成的IP地址。如一个B类网络的子网掩码为:2552550 0一个C类网络的子网掩码为:25525525501、根据子网数计算子网掩码例题:如将B类IP地址划分为27个子网,其步骤为1)将子网数目转换为2进制:27=110112)得出N=53)将B类地址的子网掩码为的主机地址前N=5位置1,即得到子网掩码:2、根据主机数计算子网掩码例题: B类IP地址划分为若干个子网,每个子网有主机700台,
9、其计算步骤为:1)700=1010 1111 002)得出N=103)将B类地址的子网掩码为的主机地址全部置1,然后从后向前将N=10位置0得到子网掩码:103端口号的分配机制端口号的分配机制l网络进程通信前必须获知对方的进程地址。网络进程通信前必须获知对方的进程地址。l由于网络应用程序大多采用C/S模式开发,通信总是由客户机发起,因此事先只需让客户机知道服务器的进程地址即可。lInternet中为客户服务的众所周知的服务有限。lTCP/IP协议采用了协议采用了全局分配(静态分配)全局分配(静态分配)和和本地本地分配(动态分配)分配(动态分配)相
10、结合的分配方法。相结合的分配方法。l对于对于TCP或或UDP,将它们的全部,将它们的全部65535个端口号分个端口号分为为保留端口号保留端口号和和自由端口号自由端口号两部分。两部分。11l保留端口号,保留端口号,范围是范围是01023,又称为,又称为众所周知的众所周知的端口端口或或熟知端口(熟知端口(well-known port),),只占少数,只占少数,采用全局分配或集中控制的方式,由一个采用全局分配或集中控制的方式,由一个公认的中公认的中央机构央机构根据需要进行统一分配,静态地分配给因特根据需要进行统一分配,静态地分配给因特网上著名的众所周知的服务器进程,并将结果公布网上著名的众所周知的
11、服务器进程,并将结果公布于众。于众。 表表1.1 一些典型的应用层协议分配到的保留端口一些典型的应用层协议分配到的保留端口 TCP的保留端口UDP的保留端口FTP21DNS53HTTP80TFTP69SMTP25SNMP161POP3110 12l自由端口号,自由端口号,范围是范围是102465535,采用本地分配,采用本地分配,又称为动态分配。又称为动态分配。lTCP或或UDP端口的分配规则是:端口的分配规则是:l端口0:不使用,或者作为特殊的使用;l端口1-255:保留给特定的服务,TCP和UDP均规定,小于256的端口号才能分配给网上著名的服务;l端口256-1023:保留给其他的服务,
12、如路由;l端口1024-4999:可用作任意客户的端口;l端口5000-65535:可用作用户的服务器端口。 TCP UDP特点及编程步骤特点及编程步骤 TCP特点:特点: TCP 是面向连接的运输层协议。 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。 TCP 提供可靠交付的服务。 TCP 提供全双工通信。 面向字节流。 TCP不保证最小传输速率,TCP不允许发送进程以设想的速率发送数据 TCP不提供任何延时保障 UDP 特点:特点: UDP 是无连接的,即发送数据之前不需要建立连接。 UDP 使用尽最大努力交付,即不保证可靠交付,同时
13、也不使用拥塞控制。 UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。 UDP 支持一对一、一对多、多对一和多对多的交互通信。 UDP 的首部开销小,只有 8 个字节。 UDP也不提供延时保障TCPUDP 客户客户/服务器端编程主要步骤:服务器端编程主要步骤:CSocket类,从CAsyncSocket类派生,是对Windows Sockets API的高级封装。CSocket类继承了CAsyncSocket类的许多成员函数,用法一致。CSocket类的高级表现在三个方面:(1)CSocket结合archive类来使用套接字。(2)CSocket管理了通信的许多方面,如字节顺
14、序问题和字符串转换问题。 (3)CSocket类为Windows消息的后台处理提供了阻塞的工作模式。 创建创建CSocket对象对象 分为两个步骤: (1)调用CSocket类的构造函数,创建一个空的CSocket对象。 (2)调用此CSocket对象的Create()成员函数,创建对象的底层套接字。调用格式是: BOOL Create( UINT nSocketPort = 端口号, Int nSocketPort = SOCK_STREAM | SOCK_DGRAM, LPCTSTR lpszSocketAddress = 套接字所用的网络地址 ); 如果打算使用CArchive对象和套接
15、字一起进行数据传输工作,必须使用流式套接字。 5.2.2 建立连接建立连接 CSocket类使用基类CAsyncSocket的同名成员函数Connect()、Listen()、Accept()来建立服务器和客户机套接字之间的连接,使用方法相同。不同的是:CSocket类的Connect()和Accept()支持阻塞调用。比如:在调用Connect()函数时会发生阻塞,直到成功地建立了连接或有错误发生才返回,在多线程的应用程序中,一个线程发生阻塞,其他的线程仍能处理Windows事件。 CSocket对象从不调用OnConnect()事件处理函数。 5.2.3 发送和接收数据。发送和接收数据。在
16、创建CSocket类对象后,对于数据报套接字,直接使用CSocket类的SendTo()、ReceiveFrom()成员函数来发送和接收数据。对于流式套接字,首先在服务器和客户机之间建立连接,然后使用CSocket类的Send()、Receive()成员函数来发送和接收数据,它们的调用方式与CAsyncSocket类相同。 不同的是:CSocket类的这些函数工作在阻塞的模式。比如,一旦调用了Send()函数,在所有的数据发送之前,程序或线程将处于阻塞的状态。一般将CSocket类与CArchive类和CSocketFile类结合,来发送和接收数据,这将使编程更为简单。CSocket对象从不调
17、用OnSend()事件处理函数。 5.2.4 CSocket类与类与CArchive类和类和CSocketFile类类使用CSocket类的最大优点在于,应用程序可以在连接的两端通过CArchive对象来进行数据传输。具体做法是:(1)创建CSocket类对象(2)创建一个基于CSocketFile类的文件对象,并把它的指针传给上面的已创建的CSocket对象。(3)分别创建用于输入和输出的CArchive对象,并将它们与这个CSocketFile文件对象连接。 (4)利用CArchive对象来发送和接收数据。 下面是一段示例代码:CSocket exSocket; / 创建一个空的CSock
18、et对象。CSocketFile* pExFile; / 定义一个CSocketFile对象指针。CArchive* pCArchiveIn; / 定义一个用于输入的Carchive对象指针。CArchive* pCArchiveOut;/ 定义一个用于输出的Carchive对象指针。exSocket.Create(); / 创建Csocket对象的底层套接字。 / 创建CSocketFile对象,并将CSocket对象的指针传递给它。pExFile = new CSocketFile( & exSocket,TRUE);/创建用于输入的CArchive对象pCArchiveIn = new
19、CArchive(pExFile, CArchive:load);/创建用于输出的CArchive对象。pCArchiveOut = new CArchive(pExFile, CArchive:store); 图5.3 CSocket、CArchive和CSocketFile类在传输数据时的作用 5.2.5 关闭套接字和清除相关的对象,关闭套接字和清除相关的对象,在使用完CSocket对象以后,应用程序应调用它的Close()成员函数来释放套接字占用的系统资源,也可以调用它的ShutDown()成员函数来禁止套接字读写。而对于相应的CArchive对象、CSocketFile对象和CSock
20、et对象,可以将它们销毁;也可以不作处理,因为当应用程序终止时,会自动调用这些对象的析构函数,从而释放这些对象占用的资源。 5.3 CSocket类的编程模型类的编程模型下面给出针对流式套接字的CSocket类的编程模型。分为服务器端和客户端。1服务器端服务器端(1)CSocket sockServ; / 创建空的服务器端监听套接字对象。/ 用众所周知的端口,创建监听套接字对象的底层套接字句柄。(2)sockServ.Create( nPort ); (3)sockServ.Listen(); / 启动对于客户端连接请求的监听。(4)CSocket sockRecv; / 创建空的服务器端连接
21、套接字对象。 / 接收客户端的连接请求,并将其他的任务转交给连接套接字对象。sockServ.Accept( sockRecv); (5)CSockFile* file ;file = new CSockFile( &sockRecv); /创建文件对象并关联到连接套接字对象。(6)CArchive* arIn, arOut;arIn = CArchive(&file, CArchive:load); / 创建用于输入的归档对象,arOut = CArchive( &file, CArchive:store); / 创建用于输出的归档对象。/ 归档对象必须关联到文件对象。(7)arIn dwV
22、alue; / 进行数据输入。adOut dwValue; / 进行数据输入。adOut dwValue; / 进行数据输出。输入或输出可以反复进行。(7)sockClient.Close(); / 传输完毕,关闭套接字对象。 3.1套接字套接字 套接字,是支持套接字,是支持TCP/IP的网络通信的基本操的网络通信的基本操作单元,可以看做是不同主机之间的进程进作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完方的一种约定,用套接字中的相关函数来完成通信过程。成通信过程。流套接字(SOCK_ST
23、REAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。数据包套接字(SOCK_DGRAM):数据包套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据包套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢
24、失情况,需要在程序中做相应的处理。原始套接字(SOCK_RAW):原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。主要函数主要函数SOCKET()创建一个套接字,并返回套接字的标识符BIND()把套接字绑定到特定的网络地址上LISTEN()启动指定的套接字,监听到来的连接请求ACCEPT()*接收一个连接请求,并新建一个套接字,原来的套接字返回监听状态CONNECT()*请求讲本地套接字连
25、接到一个指定的远方套接字上SEND()*向一个已经与对方建立连接的套接字发送数据SENDTO()*向一个未与对方建立连接的套接字发送数据,并指定对方网络地址RECV()*从一个已经与对方建立连接的套接字接收数据RECVFROM()*从一个未与对方建立连接的套接字接收数据,并返回对方网络地址SHOTDOWN()有选择的关闭套接字的全双工连接CLOSESOCEKT()*关闭套接字,释放相应的资源表表3.1 WinSock 1.1继承继承Berkeley Sockets的函数的函数辅助函数HTONL()把32位无符号数从主机字节序转换为网络字节序HTONS()把16位无符号数从主机字节序转换为网络字
26、节序NTOHL()把32位无符号数从网络字节序转换为主机字节序NTOHS()把16位无符号数从网络字节序转换为主机字节序INET_ADDR()把标准的点分十进制的IP转换成长整形地址数据INET_NTOA()把长整形的IP地址数据转换成点分十进制的字符串GETPEERNAME()获得套接字连接上对方的网络地址GETSOCKENAME()获得指定套接字的网络地址控制函数GETSOCKOPT()获得指定套接字的属性选项SETSOCKOPT()设置与指定套接字相关的属性选项IOCTLSOCKET()为套接字提供控制SELECT()*执行同步I/O多路复用表表3.1 WinSock 1.1继承继承Be
27、rkeley Sockets的函数的函数(cont.)(2) 数据库函数 表3.2列出了Winsock规范定义的数据库查询函数。 其中六个采用的形式,大多要借助网络上的数据库来获得信息, 函数名说明gethostname()用来返回本地计算机的标准主机名gethostbyname()*返回对英语给定主机名的主机信息gethostbyaddr()*根据一个IP地址取回相应的主机信息getservbyname()*返回对应于给定服务名和协议名的相关服务信息getservbyport()*返回对应于给定端口号和协议名的相关服务信息getportbyname()*返回对应于给定协议名的相关服务信息ge
28、tportbynumber()*返回对应于给定协议号的相关服务信息TCP/IP协议及网络编程技术41套接字模式 套接口I/O 模式: 套接口进行输入、输出时调用的那些函数进行操作的工作模式。 Winsock 支持两种I/O模式: 阻塞(BLOCK):I/O操作完成前,执行该操作的Winsock 函数(比如sent/sendto和recv / recvfrom)会一直等待下去直到所需进行的操作完成为止 非阻塞(NONBLOCK)。 Winsock函数无论操作是否己完成,都会立即返回。通常会发现这些函数操作失败,并且会得到WSAEWOULDBLOCK 的错误码。它意味着所进行的函数操作在函数调用的
29、这段时间内没有完成,必须重新进行尝试。TCP/IP协议及网络编程技术42套接字模式 阻塞模式 便于应用; 效率低:所在的线程会阻塞(可能是整个进程阻塞) 非阻塞模式 使用比较麻烦; 效率高。 默认情况 Winsock 函数都以阻塞模式进行工作 主要函数connect、accept 、recv/recvfrom、send/sendto、closesocket等。TCP/IP协议及网络编程技术43套接字模式修改套接字模式 套接字的默认模式是阻塞模式 ioctlsocket 函数可以改变套接口的I/O 模式。函数定义: int iocltlsocket ( SOCKET s , long cmd ,
30、 u _ long FAR *argp ) ; s 是待处理的套接口描述字, cmd 是对该套接口进行的操作(模式修改),可以是FIONBIO 、FIONREAD 或者SIOCATMARK 。FIONBIO 用于开启禁止套接口的非阻塞I/O 模式。 argp 是cmd 的参数。 举例: u _ lonq bNonblock = 1 ; /阻塞模式ioctlsocket ( sock , FIONBIO , & bNonblock )linux下采用fcntl函数 fcntl(socket_id, F_SETFL, O_NONBLOCK)TCP/IP协议及网络编程技术44windows下套接字I
31、/O模型 阻塞模型 select模型 WSAAsyncSelect模型 WSAEventSelect模型 重叠I/O模型 I/O完成端口模型TCP/IP协议及网络编程技术45阻塞模型 线程直接使用阻塞方式发起 I/O 调用-基本模型 将阻塞在 该 I/O 调用上直至该操作结束,期间无法发起其他 I/O 操作或执行其他逻辑。 例如阻塞方式在套接字上调用 recv() 读取远端发送的数据时,调用线程将一直阻塞直至套接字缓冲区中接收到对端发送的数据时为止。 低并发量时: 使用 “阻塞多线程模型” 构建应用服务器:使用多个线程一 对一地为客户端提供服务,各个线程内使用阻塞 I/O 。 高并发量时: 过
32、多的线程将占用大量内存作为线 程堆栈 线程切换的开销大 和线程共享数据的同步开销降低应用服务器的伸缩性。 TCP/IP协议及网络编程技术46 I/ O 复用select模型 使用select 函数 系统会阻塞在该函数上 超时或者预设定的某个I/O条件(如套接口上有数据可读)得到满足,此时可以进行相应的I/O 操作(如读数据)并能立即得到结果。 select可以防止在在阻塞模式的套接字里被锁死,避免在非阻塞套接字里重复检查WSAEWOULDBLOCK错误 与阻塞模型相比,该模型的优势主要体现在它能同时判断多个套接口的多种I/O状态(read 、write 、exception )。 select
33、 成功返回,至少有一个套接口、满足了一个I/O状态要求。 哪些I/O条件得到了满足需要进行检测, select 为I/O复用。 TCP/IP协议及网络编程技术47select函数 select()函数的格式: int select(int nfds,fd_set FAR* readfds,fd_set FAR* writefds,fd_set FAR* exceptfds,const struct timeval FAR* timeout ); nfds:传入参数,本参数被忽略,仅起到与Berkeley API套接口兼容的作用。TCP/IP协议及网络编程技术48 I/ O 复用select模型
34、 readfds 调用了listen 函数,并且一个TCP 连接正等待接受(三步握手己完成),这时调用accept 将成功。 有数据可读(包括带外数据(开启SO_OOBINLINE). TCP 连接被关闭、复位或者中止。 writefds 数据可以被发出。 内核正处理一个非阻塞的connect ,并且连接成功。 exceptfds 内核正处理一个非阻塞的connect ,但是连接失败。 有带外数据可读(未开启SO_OOBINLINE 选项)TCP/IP协议及网络编程技术49 I/ O 复用select模型 select 函数返回值有3 种情况。 SOCKET_ERROR :select 函数调
35、用出错,用WSAGetLastError 函数来获得错误码。 0:select 等待超时,如果第5 个参数为NULL ,则不会出现该返回值的情况。 其余均为正常返回,说明下列情况中至少有一种事件发生了,并且返回值表示满足I/O 操作的套接口数。TCP/IP协议及网络编程技术50select模型的应用过程示意图TCP/IP协议及网络编程技术51 消息机制 WSAAsyncSelect 提供了一种基于Windows 消息机制的异步I/O模型,可以为特定套接口上发生的特定网络事件指定系统通知消息。1.函数定义:int WSAAsynSelect(SOCKET s, HWND hWnd, unsign
36、ed int wMsg, long lEvent);2. 参数说明 参数均为输入参数。 第一个参数s 是套接口描述字 函数的成功调用会将s 自动设置为非阻塞模式。TCP/IP协议及网络编程技术52 消息机制WSAAsyncSelect 第二个参数hWnd是用户指定的接收系统通知消息wMsg的窗体句柄。 第三个参数wMsg是用户为套接口网络事件lEvent设定的通知消息,通常wMsg指定一个用户定义的消息(WM_USER + n),例如: #define WM_USER_SERVER WM_USER+1 第四个参数IEvent 用于设定用户所关心的套接口s 上的网络事件。lEvent可由下列事件
37、值通过位或(1)而来,例如,如果关心套接口上的数据可读和关闭事件,那么lEvent=FD_READ|FD_CLOSE。TCP/IP协议及网络编程技术53 消息机制WSAAsyncSelect3. 函数返回结果 如果函数调用成功,WSAAsyncSelect 返回0 否则返回SOCKET_ERROR ,这时可以调用WSAGetLastError 来获得具体的错误码。 在成功调用WSAAsyncSelect后,当有特定网络事件发生时,指定的窗体就会收到指定的用户消息。 在成功地发送了一次消息后,消息通知机制会暂停工作直到用户进程调用了特定的Winsock 的I/O 处理函数,这些函数一方面对网络事
38、件进行相应的I/O 处理,另一方面会重新激活(re-enable )消息通知机制。 TCP/IP协议及网络编程技术54 事件机制WSAEventSelect WSAEventSelect 与WSAAsyncSelect模型类似,同样是系统为套接口上的网络事件FD_XXX 向用户进程提供通知服务。 当收到通知时,进程就可以进行相应的I/O操作并立即返回得到结果。 两者的差别: 对于WSAEventSelect ,系统发送事件对象通知(Event_Object ) ,并且在内部的网络事件记录中加以记录; 对于WSAAsyncSelect ,系统向指定窗体发送用户定义的Windows 消息。TCP/
39、IP协议及网络编程技术55 事件机制WSAEventSelect1. 函数定义:int WSAEventSelect(SOCKET s, WSAEVENT hEventObject,long lNetworkEvents ) ; 2. 参数说明 三个参数均为输入参数。 第一个参数s 是套接口描述字。 第三个参数INetworkEvents是套接口网络事件,所有可能的事件值以及值的组合均与WSAAsyncSelect 函数的IEvent 参数相同。 如果该值设为0,那么将取消在套接口s 上的所有网络事件与事件句柄之间的联系设定。 无论该值是否为0 ,成功的调用WSAEventSelect 都会将
40、s 设置为非阻塞模式。TCP/IP协议及网络编程技术56 事件机制WSAEventSelect 第二个参数hEventObject 是一个winsock 的事件对象。 当套接口s上发生了lEvent 中指定的网络事件时,系统会发送hEventObject 并将其记录在内部事件记录中。 在使用WSAEventSelect 函数之前,首先需要创建hEventobject 。 关于Winsock 事件对象的三个基本操作 WSACreateEvent :创建事件对象 WSAResetEvent :复位事件对象 WSACloseEvent :关闭事件对象。TCP/IP协议及网络编程技术57各I/O模型的
41、缺点 select模型:需要建立fd_set,且管理的套接字有数量限制。 WSAAsyncSelect模型:需要一个窗口。 WSAEventSelect模型:同时等待的事件对象个数有限制。 重叠I/O模型: 基于事件机制,每次最多只能等待64个事件; 基于完成例程机制:完成例程不能太复杂,否则负载重时,完成例程不能尽快运行。 完成端口:性能最好,编程复杂TCP/IP协议及网络编程技术58I/O模型的选择 客户端 若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如开发的是一个以Windows为基础
42、的应用程序,要进行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一种最好的选择,因为WSAAsyncSelect本身便是从Windows消息模型借鉴来的。采用这种模型,程序需具备消息处理功能。 服务器端 若开发的是一个服务器应用,要在一个给定的时间,同时控制多个套接字,建议采用重叠I/O模型,这同样是从性能角度考虑的。但是,如果服务器在任何给定的时间,都会为大量I/O请求提供服务,便应考虑使用I/O完成端口模型,从而获得更佳的性能。TCP/IP协议及网络编程技术59Linux和Windows socket编程差异 支持阻塞模式和IO复用 不需要WSAStartup和WSAClean
43、up 关闭套接字不一样:close和closesocket linux下支持read和write进行收发 windows下具有优化的WSA系列函数,更多模型 windows下的头文件不一样winsock2.h 设置非阻塞不一样ioctlsocket和fcntl select的第一个参数无效,为0 其他:套接字类型,获取错误,链接库604.1获取主机名和获取主机名和IP地址地址 gethostname() gethostbyname()61gethostname() 该函数把本地主机名存放入由该函数把本地主机名存放入由name参数指定的缓冲区中。参数指定的缓冲区中。返回的主机名是一个以返回的主机
44、名是一个以NULL结束的字符串。主机名的形式结束的字符串。主机名的形式取决于取决于Windows Sockets实现它可能是一个简单的主机名,实现它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在或者是一个域名。然而,返回的名字必定可以在gethostbyname()和和WSAAsyncGetHostByName()中使用。中使用。 返回值:返回值: 如果没有错误发生,如果没有错误发生,gethostname()返回返回0。否则它返回。否则它返回SOCKET_ERROR。应用程序可以通过。应用程序可以通过WSAGetLastError()来得来得到一个特定的错误代码。到一个特
45、定的错误代码。62gethostname() 错误代码:错误代码: WSAEFAULT 名字长度参数太小。名字长度参数太小。 WSANOTINTIALISED 在应用这个在应用这个API前,必须成功地调用前,必须成功地调用WSAStartup()。 WSAENTDOWN Windows Sockets实现检测到了网络子实现检测到了网络子系统的错误。系统的错误。 WSAEINPROGRESS 一个阻塞的一个阻塞的Windows Sockets操作正在进操作正在进行。行。634.2 获取网卡类型和子网掩码获取网卡类型和子网掩码 RegOpenKeyEx() 函数功能描述函数功能描述:打开一个指定的
46、注册表键打开一个指定的注册表键 RegCloseKey 函数功能描述函数功能描述:释放指定注册键的句柄释放指定注册键的句柄 RegCreateKeyEx 该函数用来创建注册表键,如果该键已经存该函数用来创建注册表键,如果该键已经存在,则打开它(注册表键不区分大小写)在,则打开它(注册表键不区分大小写)644.2 获取网卡类型和子网掩码获取网卡类型和子网掩码 RegDeleteKey 功能:用来删除一个注册表键值。功能:用来删除一个注册表键值。 RegQueryValueEx 获取一个项的设置值获取一个项的设置值 返回值返回值 Long,零(,零(ERROR_SUCCESS)表示成)表示成功。其
47、他任何值都代表一个错误代码功。其他任何值都代表一个错误代码 655.1 GetNetworkParams 获取本地计算机的网络参数。获取本地计算机的网络参数。 参数参数Info out 一个指向缓冲的指针,它包含一个一个指向缓冲的指针,它包含一个FIXED_INFO 结构,如果结构,如果函数成功的话,该结构接收本地计算机的网络参数。该缓函数成功的话,该结构接收本地计算机的网络参数。该缓冲必须在之前由冲必须在之前由GetNetworkParams 函数分配。函数分配。 pOutBufLen in 一个指向一个一个指向一个ULONG变量的指针,该变量指定变量的指针,该变量指定FIXED_INFO结
48、构的大小。如果不够大,则该函数会以合适的大小来填结构的大小。如果不够大,则该函数会以合适的大小来填充这个变量,并返回一个充这个变量,并返回一个ERROR_BUFFER_OVERFLOW的错误的错误代码。代码。665.2网络管理接口网络管理接口 获取本地计算机网络接口数量的函数获取本地计算机网络接口数量的函数 DWORD GetNumberOfInterfaces(PDWORD pdwNumIf); 获取本地主机名、域名和获取本地主机名、域名和DNS服务器信息的函数服务器信息的函数 DWORD GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULON
49、G dwOutBufLen );675.3 获取和设置特定的接口获取和设置特定的接口 GetIfEntry()是取一个特定()是取一个特定Index接口的信接口的信息。息。 SetIfEntry ()设置管理一个特定()设置管理一个特定Index接口接口的信息。的信息。 GetIfTable() 是取本机所有接口的信息。是取本机所有接口的信息。685.4管理管理IP地址地址 使用使用GetIpAddrTable获取获取IP地址地址列表列表 GetIpAddrTable函数返回与系统关联的函数返回与系统关联的IP地址地址信息,填充一个信息,填充一个MIB_IPADDRTABLE结构指针结构指针
50、。 使用使用AddIPAddrress, DeleteIPAddrress 添加或添加或删除删除IP地址地址695.5实践拓展实践拓展 获取网络适配器名称获取网络适配器名称 写写IP信息入注册表,查看配置的改变信息入注册表,查看配置的改变 主要用到函数主要用到函数 GetAdaptersInfo使用使用GetAdaptersInfo获取网获取网卡详细信息(包括:卡详细信息(包括:Adapter Name,Mac,Ip,NetMask,NetGate) RegSetIP,自定义函数,修改,自定义函数,修改IP地址地址 DhcpNotifyConfigChange自定义函数,通知配自定义函数,通知
51、配置改变置改变 ARP是是Address Resolution Protocol(地址转换协地址转换协议议)的简称的简称,是是TCP IP协议中最底层的协议之一。协议中最底层的协议之一。它的作用是完成它的作用是完成IP地址到地址到MAC(物理地址物理地址)的转的转换。换。 原理:原理:当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也
52、就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主机B的IP地址/MAC地址对保存在自己的ARP缓存内。716.2 对对ARP表操作的函数表操作的函数 GetIpNetTable 功能:使用IP帮助来获取和修改ARP表信息 SetIpNetEntry 向ARP表添加入口 DeleteIpNetEntry 删除ARP入口函数 SendARP 发送一个带有目的IP地址的ARP请求去获取一个MAC地址727.3 多线程多线程C/S编程编程-补充加强补充加强网络编程与进程通信1进程与线程的基本概念n进程是处于运行过
53、程中的程序实例,是操作系统调度和分配资源的基本单位。n一个进程实体由三部分构成。n程序代码:规定进程所做的计算。n数据:计算的对象。n进程控制块:是操作系统为了控制进程建立的数据结构,用来管理进程的内核对象,系统用来存放关于进程的统计信息。737.3 多线程多线程C/S编程编程n操作系统给进程分配内存空间:n静态分配空间:用来装入进程所有的可执行模块或动态链接库模块的代码及数据。n动态分配空间:如线程堆栈和堆分配空间。n各种计算机应用程序在运行时,都以进程的形式存在,网络应用程序也不例外。nWindows系统不但支持多进程,还支持多线程。n进程是分配资源的单位;n线程是执行和调度的单位。n由线
54、程负责执行包含在进程的地址空间中的代码.747.3 多线程多线程C/S编程编程n多线程:多线程:n一一个进程可以包含若干个线程,同时执行进个进程可以包含若干个线程,同时执行进程地址空间中的代码。程地址空间中的代码。n当创建一个进程时,系统会自动创建它的第一个当创建一个进程时,系统会自动创建它的第一个线程,称为线程,称为主线程主线程。n然后,该线程可以创建其他的线程,而这些线程然后,该线程可以创建其他的线程,而这些线程又能创建更多的线程。又能创建更多的线程。n每个线程拥有自己的一组每个线程拥有自己的一组CPU寄存器寄存器和和堆栈堆栈。n进程至少拥有一个线程,否则将被撤销。进程至少拥有一个线程,否
55、则将被撤销。nWindows 2000能在有多个CPU的计算机上运行,每个CPU上运行不同的线程,达到多线程运行。 多线程定义多线程定义 在在Windows操作系统中,线程是指系统中最小的功能操作系统中,线程是指系统中最小的功能执行单元,其可以独立的完成某一项功能。执行单元,其可以独立的完成某一项功能。 在在Windows操作系统中,所有程序的功能都是由每个操作系统中,所有程序的功能都是由每个程序中的多个线程共同完成。从某种特定的意义上而程序中的多个线程共同完成。从某种特定的意义上而言,线程才是是计算机真正意义上的功能执行者。而言,线程才是是计算机真正意义上的功能执行者。而从线程执行的数目而言
56、,线程可以分为单线程和多线从线程执行的数目而言,线程可以分为单线程和多线程。其中,多线程是由多个单线程组成。如果从线程程。其中,多线程是由多个单线程组成。如果从线程的执行效率而言,多线程较单线程的执行效率高很多。的执行效率而言,多线程较单线程的执行效率高很多。那么用户在编程时,使用多线程技术可以提高程序的那么用户在编程时,使用多线程技术可以提高程序的执行效率。执行效率。 3.2 实现线程同步 线程同步是指同一进程中的多个线程互相协调工作达到一致性。当用户编写程序时,有时会使用多个代码段同时读取或修改相同地址空间中的共享数据。此时,在操作系统中,可能会出现一个代码段在读取数据,而另一个代码段却正
57、在修改数据。这样的情况会导致程序发生读写错误,造成程序异常退出。用户为了避免出现类似情况,需要使用到线程同步技术。即当一个线程程序对资源进行读写时,其他的线程程序则处于等待状态。 (重点)多线程同步方法:临界区对象、互斥对重点)多线程同步方法:临界区对象、互斥对象、事件对象象、事件对象3.2.1 临界区对象 临界区对象是指用户使用某个线程访问共享资源时,必须使代码段独享该资源,不允许其他线程程序再访问该资源。待该代码段访问完资源后,其他程序才能对资源进行访问。1使用API函数操作临界区 2使用CCriticalSection类操作临界区3.2.2 事件对象 事件对象是指用户在程序中使用内核对象
58、的有无信号状态实现线程的同步。在本节中,将向用户介绍利用时间对象实现线程同步技术的相关API函数以及MFC类。 1使用API函数操作事件对象 2使用CEvent类实现线程同步3.2.3 互斥对象 互斥对象与前面所学的临界区对象和事件对象的作用一样,实现线程同步。但是,互斥对象还可以进程之间使用。在互斥对象中,包含一个线程ID和一个计数器。线程ID表示拥有该互斥对象的线程,计数器用于表示该互斥对象被同一线程所使有的次数。用户在程序中,同样可以使用API函数或者MFC类操作互斥对象,实现线程同步。 1使用API函数操作互斥对象 2使用CMutex类3.3 进程间通信 进程间通信是指在系统中两个或多
59、个进程之间通过第三方进行数据共享。用户在实际编程中,除了可以使用套接字进行网络通信以外。还可以使用进程间的通信方式实现网络通信。例如,邮槽、命名管邮槽、命名管道、匿名管道道、匿名管道等。 在Windows操作系统中,每个进程启动时,系统都会为其分配大约4GB的私有地址空间。由于每个进程的地址空间是私有的,所以进程之间不能互相访问对方的数据。但是,在Windows操作系统中已经为用户提供了多种进程通信机制。例如,邮槽、匿名管道等。在本章中,将主要向用户介绍这些通信机制的用法以及实现方法等。8112.1 FTP工作原理工作原理n1、数据传输模式(书)nASCII传输模式n二进制传输模式。n2、文件
60、传输模式(PPT,以EOF结束)n1二进制模式n2文件模式n3压缩模式 FTP具有以下特点:具有以下特点: (1)文件传送协议只提供文件传送的一些基本的服务,它是面向连接的服务,使用TCP作为传输协议,以提供可靠的运输服务。 (2)FTP的主要作用是在不同计算机系统间传送文件,它与这两台计算机所处的位置、连接的方式以及使用的操作系统无关。 (3)FTP使用客户/服务器方式。8312.1 FTP工作原理工作原理n1、文件结构:n二进制结构:文件中没有内部结构,一般被看作为二进制流;n文件式结构:由许多记录组成的文件;n页面结构:由不同的索引页组成文件。n2、FTP工作模式nStandard模式(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年淮北理工学院专任教师等招聘73名考试备考试题及答案解析
- 2026江苏泰州泰兴农村商业银行招聘80人考试参考试题及答案解析
- 湖南省艺术研究院2026年高层次人才招聘2人考试参考试题及答案解析
- 2026年哈尔滨市征仪路学校临聘教师招聘5人考试备考试题及答案解析
- 2025江西南昌市建设投资集团有限公司招聘20人考试参考题库及答案解析
- 2026浙江宁波市奉化区甬台众创小镇开发建设有限公司招聘1人考试备考试题及答案解析
- 2026湖南常德市自来水有限责任公司遴选9人笔试备考试题及答案解析
- 2026广东龙门产业投资集团有限公司招聘职工3人考试参考题库及答案解析
- 2026黑龙江省文化和旅游厅所属事业单位招聘21人考试备考试题及答案解析
- 2026四川成都市成华区市场监督管理局招聘编外人员1人考试备考试题及答案解析
- 土木工程科学数据分析方法 课件 第3章 试验数据误差及处理 -
- 2026届辽宁省辽南协作校高一数学第一学期期末监测试题含解析
- 2026中国中式餐饮白皮书-
- 2025年北京航空航天大学马克思主义基本原理概论期末考试模拟题带答案解析(必刷)
- 江苏省2025年普通高中学业水平合格性考试语文试卷(含答案)
- 高一物理(人教版)试题 必修二 阶段质量检测(一) 抛体运动
- 2025年山东省枣庄市检察院书记员考试题(附答案)
- 医药连锁年终总结
- 2025-2026学年人教版七年级生物上册知识点梳理总结
- 工业设计工作流程及标准教程
- 《好睡新的睡眠科学与医学》阅读笔记
评论
0/150
提交评论