网络编程技术(西电课件)_第8章-1.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 技术 课件
- 资源描述:
-
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,网络编程技术,第,8,章,WinSock,的,I/O,模型,(1),本次课内容:,回顾阻塞和非阻塞套接字,WinSock,的,I/O,模型介绍,select,模型,WSAAsyncSelect,模型,8.1,套接字的阻塞和非阻塞操作,阻塞,阻塞的,accept(),操作,非阻塞的,recv(),操作,套接字,I/O,模型,问题:套接字何时可以进行读写等操作?,Winsock2,提供,5,种,I/O,模型,选择模型(,select Model,),异步选择模型(,WSAAsyncSelect Model,),事件选择模型(,WSAEventSelect Model,),重叠模型(,Overlapped Model,),完成端口模型(,Completion Port Model,),非阻塞模式,WinSock,给异步模式提供了五种,I/O,操作模型,可以灵活的用于各类应用需求,非阻塞模式套接字除具备阻塞套接字已有的各项优点之外,还进行了少许扩充,功能更强。,决定了,就用非阻塞的!,How,?,ioctlsocket(),函数设置阻塞,/,非阻塞,创建套接字后,要将套接字设置为非阻塞,函数:,int ioctlsocket(SOCKET,s,long,cmd,u_long FAR,*argp,);,用于设置和获取与套接字相关的操作参数。,参数,s,:,套接字描述符。,cmd,:,对套接字,s,的操作命令。,argp,:指向,cmd,命令所带参数的指针。,成功返回,0,否则,返回,SOCKET_ERROR,。,cmd,FIONBIO,:允许或禁止套接字,s,的非阻塞模式。,argp is zero,禁止非阻塞模式;,argp is nonzero,允许非阻塞模式;,当一个套接字建立时,默认为阻塞模式;,FIONREAD,:确定套接字,s,可读入的数据量。,argp,指向一个无符号长整型。,如果,s,是,SOCKET_STREAM,类型,则,FIONREAD,返回在一次,recv(),中所接收的所有数据量。,如果,s,是,SOCK_DGRAM,型,则,FIONREAD,返回套接字上排队的第一个数据报大小。,ioctlsocket,使用举例,unsigned long mode=0;/,禁止非阻塞,ioctlsocket(sockfd,FIONBIO,unsigned long mode=1;/,允许非阻塞,ioctlsocket(sockfd,FIONBIO,unsigned long arg;/,取得数据量,ioctlsocket(sockfd,FIONREAD,阻塞与非阻塞通信小结,通信包括阻塞和非阻塞两种模式。在网络编程时,选择通信模式是一件很重要的事情。对于不同的协议,阻塞通信和非阻塞通信有不同的表现。,对于,UDP,协议而言,由于,UDP,没有发送缓存,因此所有,UDP,协议即使在阻塞模式下也不会发生阻塞。,对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。,在连接建立阶段,不管是阻塞模式还是非阻塞模式,发起连接请求的一方总是会使调用它的进程阻塞,阻塞间隔最少等于到达服务器的一次往返时间。,通信模式对应用程序的设计方法也有直接的影响。在非阻塞模式下,应用程序必须不断地轮询是否有数据到达或有连接请求到达。,这种轮询的方式耗费的,CPU,资源较大,要尽可能避免使用,而在阻塞模式下则不存在这一问题,但其缺点是进程或线程在执行,I/O,操作时将被阻塞而不能执行其他的工作,因此在单进程或单线程应用中不能使用这种模式。,在多线程应用中比较适合采用阻塞模式,一个线程被阻塞不影响其他线程的工作。,8.2,套接字的,I/O,模型,套接字,I/O,模型,套接字处于非阻塞模式时,何时可以读,/,写套接字?,使用套接字,I/O,模型来确定,Winsock2,提供,5,种,I/O,模型,选择模型(,select Model,),异步选择模型(,WSAAsyncSelect Model,),事件选择模型(,WSAEventSelect Model,),重叠模型(,Overlapped Model,),完成端口模型(,Completion Port Model,),五种,I/O,模型的概述,选择模型:,程序自发,select,查询多个套接字状态,异步选择模型:,套接字有事件,通知指定窗口程序,事件选择模型:,套接字有事件,通知指定事件对象,重叠模型:,提交多个,I/O,请求,完成后通知事件或执行指定程序,完成端口模型:,创建指定数目的线程,组成线程池,池内的空闲线程对提交的,I/O,请求逐个处理。,操作系统对套接字,I/O,模型的支持情况,所有,Windows,平台都支持套接字以阻塞或非阻塞方式工作。然而,并非每种平台都支持每一种,I/O,模型。在当前版本的,Windows CE,中,仅提供了一个,I/O,模型。,套接字的,select,模型,select,模型,select,模型是,WinSock,中最常见的,I/O,模型。,程序调用,select,函数自发查询一个或多个套接字的状态,判断套接字上是否存在数据,或者能否向一个套接字写入数据。,既能防止应用程序在套接字处于阻塞模式时,在一次,I/O,操作后被阻塞,同时也能防止在套接字处于非阻塞模式时,产生,WSAEWOULDBLOCK,错误。,select,函数如下:,int,select,(,intnfds,,,/,描述符值域,,Windows,下可忽略,fd_set *readfds,,,/,检查,可读性集合,fd_set *writefds,,,/,检查,可写性集合,fd_set *exceptfds,,,/,检查,错误集合,const struct timeval *timeout/,等待时间,);,select,函数如下:,int,select,(,intnfds,,,/,描述符值域,,Windows,下可忽略,fd_set *readfds,,,/,检查,可读性集合,fd_set *writefds,,,/,检查,可写性集合,fd_set *exceptfds,,,/,检查,错误集合,const struct timeval *timeout/,等待时间,);,fd_set,数据类型代表着一系列特定套接字的集合。,typedef struct fd_set,u_int fd_count;,/,反映,fd_array,的实际元素数量,SOCKET fd_arrayFD_SETSIZE;,/,套接字句柄数组,fd_set;,此函数用于检测一个或多个套接字的状态。套接字的状态包括可读、可写、出错。,需要检测状态的套接字集合由一个,fd_set,结构指示,分别为,readfds,,,writefds,,,exceptfds,(不能同时为,NULL,),。,参数,timeout,指向,timeval,结构,用于指定,select,等待,I/O,操作完成的时间。如,timeout,是一个空指针,,select,调用会无限期地,直到至少有一个套接字满足条件。,timeval,结构的格式为:,struct timeval,long tv_sec;/,秒,(s),long tv_usec;/,毫秒,(ms),;,select,函数调用失败,返回,SOCKET_EEROR;,超时返回,0,;成功,返回,所有集合中,满足条件的套接字数量,。同时,传入的套接字集合被更新,,集合中,保留满足条件的套接字,readfds,集合,包括等待可读性检查的套接口:,有数据可以读入。,连接已经关闭、重设或中止。,侦听套接字调用了,listen(),,若有连接请求到达,那么,accept,函数调用会成功。,writefds,集合,包括等待可写性检查的套接口:,未处于,connect(),调用中,意味着,send(),和,sendto(),调用可以无阻塞的发出数据。,如果正在,connect(),连接(非阻塞),可写性意味着连接顺利建立。,exceptfds,集合,包括满足下述任何一个条件套接字:,假如套接口正在进行,connect(),(非阻塞),则连接试图的失败将会表现在,exceptfds,参数中。,有带外,(Out-of-band,OOB),数据可供读取。,readfds,writefds,exceptfds,套接字集合,有事情发生,有未决的连接请求,数据可读,连接关闭,/,重启,/,中断,连接成功,(connect),可写数据,连接失败,(connect),带外数据可读,选择,(select),模型处理方式,select(),假定想测试一个套接字是否“可读”,必须将该套接字增添到,readfds,集合,再等待,select,函数完成。,select,完成之后,必须判断该套接字是否仍在,readfds,集合中,若在,便表明该套接字“可读”,可从它上面读取数据。,Winsock,提供了下列宏操作,对,fd_set,套接字集合进行处理与检查:,FD_CLR(s,*set),:从,set,中删除套接字,s,。,FD_ISSET(s,*set),:检查,s,是否在,set,集合中,若是返回,TRUE,,否则返回,FALSE,。,FD_SET(s,*set),:将套接字,s,加入集合,set,。,FD_ ZERO(*set),:将,set,初始化成空集合,使用,select,模型的编程步骤:,建立,fd_set,集合,s,,用来存放待使用的套接字。,将套接字添加到集合,s,中。,确定要检查的套接字集合,X,i,(,1=i=3,)。,使用,FD_ZERO,宏,初始化,X,i,。,使用,FD_SET,宏,根据需要将套接字句柄添加到,X,i,中,调用,select,函数,根据,select,函数的返回值进行处理,当成功返回时,判断,s,中套接字是否在,X,i,中,并进行相应处理,回到,4,select,模型实例分析,select,模式实例,实现一个阻塞的,TCP,套接字服务器,端口,5150;,主线程不断的接受客户端的连接,;,工作线程利用,select(),函数不断检查是否有数据可以读取;有则读取,原样发送给客户端。,select,模式实例,/,头文件,#include stdafx.h,#include winsock2.h,#include stdio.h,#define PORT 5150,#define MSGSIZE 1024,#pragma comment(lib,ws2_32.lib),int g_iTotalConn=0;/,全局计数器,SOCKET g_CliSocketArrFD_SETSIZE;,/,全局通信套接字,DWORD WINAPI,WorkerThread,(LPVOID lpParam);,/,声明处理数据接收的线程函数,int main(int argc,char*argv),WSADATA wsaData;,SOCKET sListen,sClient;,SOCKADDR_IN local,client;,int iAddrSize=sizeof(SOCKADDR_IN);,DWORD dwThreadId;,/,初始化,Winsock,动态链接库,WSAStartup,(0 x0202,/,创建套接字,sListen=,socket,(AF_INET,SOCK_STREAM,IPPROTO_TCP);,/,绑定到,IP,和端口,local.sin_family=AF_INET;,local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);,local.sin_port=htons(PORT);,bind,(sListen,(sockaddr*),/,侦听,队列为,3,listen,(sListen,3);,/,创建新线程,运行,WorkerThread,函数来处理,socket,的数据接收,CreateThread,(NULL,0,WorkerThread,NULL,0,while(TRUE),/,接受客户端连接,sClient=,accept,(sListen,(sockaddr*),printf(Accepted client:%s:%d/n,inet_ntoa(client.sin_addr),ntohs(client.sin_port);,/,将生成的通信套接字,保存到套接字数组,g_CliSocketArr,g_iTotalConn+,=sClient,;,return 0;,DWORD WINAPI WorkerThread(LPVOID lpParam),int i;,fd_set fdread;,/,定义一个,FD,集合,用于测试,read,int ret;,struct timeval tv=1,0;/1,秒的间隔,char szMessageMSGSIZE;/,接收缓冲区,while(TRUE),FD_ZERO(,/,将集合清,0,for(i=0;i g_iTotalConn;i+),/,将所有通信套接字放入,FD,集合,FD_SET(g_CliSocketArri,/,我们只关心这些套接字里面有没有数据可以,read,ret=,select(0,if(ret=0),/,定时时间到,continue;,for(i=0;i g_iTotalConn;i+),/,逐个检查通信套接字是否还在,FD,集合中,if(FD_ISSET(g_CliSocketArri,&fdread),/,在,就意味着有数据可读,ret=,recv,(g_CliSocketArri,szMessage,MSGSIZE,0);,if(ret=0|(ret=SOCKET_ERROR&WSAGetLastError()=WSAECONNRESET),/,如果收到数据为,0,,或者套接字出错,printf(Client socket%d closed./n,g_CliSocketArri);,closesocket(g_CliSocketArri);/,关闭相应的套接字,if(i 0,,没出错,收到,ret,个字节,szMessageret=/0;,send(g_CliSocketArri,szMessage,strlen(szMessage),0);,select,模型的,优点,:可以在单线程内管理多个套接字,最大套接字数量取决于,FD_SETSIZE,的大小,,Winsock2.h,中定义为,64,,用户也可自行定义,但不能超过,1024,。,缺点,:调用,select,前后对所有套接字都要进行遍历操作,以便设置和检查。当,FD_SETSIZE,太大时,服务器性能明显下降。,最通俗浅显的,“,IO,模式,”,解析,老陈有几个在外地工作的女儿,不能经常回来,老陈和她们通过信件联系。她们的信会被邮递员投递到老陈的信箱里。,情况与,Socket,模型非常类似。,select,模型,老陈非常想看到女儿的信。以至于,他每隔,10,分钟就下楼检查信箱,,看是否有女儿的信,在这种情况下,“下楼检查信箱”然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。,select,模型和老陈的这种情况非常相似:,周而复始地去检查,.,如果有数据,.,接收,/,发送,.,套接字的,WSAAsyncSelect,模型,WSA,Async,Select,模型,WSAAsyncSelect,模型是,WinSock,中另一个常用的异步,I/O,模型。,该模型可在套接字上接收以,Windows,消息为基础的网络事件通知。,调用,WSAAsyncSelect,函数自动将套接字设置为非阻塞模式,并向,WinSock DLL,注册一个或多个感兴趣的网络事件,同时提供接收通知时使用的窗口句柄,当注册的网络事件发生时,对应的窗口将收到一个基于消息的通知。,WSAAsyncSelect,函数如下:,int WSAAPI WSAAsyncSelect(,SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent,);,s,为需要事件通知的套接字,hWnd为接收消息的窗口句柄,wMsg为要接收的消息,lEvent,为掩码,指定应用程序感兴趣的网络事件组合,用于WSAAsyncSelect函数的网络事件类型,事件值,含义,触发条件,FD_READ,套接字有可读消息通知,recv,、,recvfrom,、,WSARecv,或,WSARecvFrom,FD_WRITE,套接字有可发消息通知,send,、,sendto,、,WSASend,或,WSASendTo,FD_OOB,套接字有外带数据消息通知,recv,、,recvfrom,、,WSARecv,或,WSARecvFrom,FD_ACCEPT,套接字有链接请求消息通知,accept,或,WSAAccept(,错误码不能,WSATRY_AGAIN),FD_CONNECT,希望得到,connect,或多点,join,操作完成信息通知,无,FD_CLOSE(,面向连接,),套接字关闭消息通知,无,FD_QOS,套接字,QOS,状态发生变化消息通知,WSAIoctl(SIO_GET_QOS),用法举例,要接收读写通知:,#define WM_SOCKET WM_USER+101,int nResult=WSAAsyncSelect(s,hWnd,WM_SOCKET,FD_READ|FD_WRITE),;,if(nResult=SOCKET_ERROR),/,错误处理,问题,1,:对监听套接字和通信套接字应如何设置消息通知?设置哪些事件?,监听套接字:,WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE),;,通信套接字:,WSAAsyncSelect(sComm,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE),;,注意,:,多个事件务必在套接字上一次注册!,一旦在某个套接字上允许了事件通知,除非以后明确调用,closesocket(),,或者由应用程序针对该套接字调用了,WSAAsyncSelect,,从而更改了注册的网络事件类型,否则的话,事件通知会永远有效!,若将,lEvent,参数设为,0,,效果相当于停止在套接字上进行的所有网络事件通知。,只接受一个消息设置,.,下面的代码将不会工作,;,第二个调用将会使第一次调用的作用失效,只有,FD_WRITE,会通过,wMsg2,消息通知到。,1,、,WSAAsyncSelect(s,hWnd,wMsg1,FD_READ);2,、,WSAAsyncSelect(s,hWnd,wMsg2,FD_WRITE);,如果要取消所有的通知,也就是指出,Windows Sockets,的实现不再在套接口上发送任何和网络事件相关的消息,则,lEvent,应置为,0.,WSAAsyncSelect(s,hWnd,0,0);,应用程序在一个套接字上成功调用了,WSAAsyncSelect,之后,应用程序会在与,hWnd,窗口句柄参数对应的窗口处理函数中,以,Windows,消息的形式,接收网络事件通知。,窗口处理函数定义如下:,LRESULT CALLBACK,WindowProc,(,HWND hwhd,,,UINT uMsg,,,WPARAM wParam,,,LPARAM IParam,),参数:,hwnd,:指向窗口的句柄。,uMsg,:指定消息类型。,wParam,:指定消息的附加信息。该参数的内容与,UMsg,参数值有关。,IParam,:指定消息的附加信息。该参数的内容与,uMsg,参数值有关。,返回值:返回值就是消息处理结果,它与发送的消息有关。,wParam,,,IParam,参数在,uMsg,WM_SOCKET,时的含义:,wParam,指定发生网络事件的套接字。,IParam,指定发生的网络事件和错误代码。,其中,高字位,指出,网络错误,。采用宏:,WSAGETSELECTERROR,,可用它返回高字节包含的错误信息,如下:,#define WSAGETSELECTERROR(lParam)HIWORD(lParam),低字位,指出发生的,网络事件,,采用宏:,WSAGETSELECTEVENT,,返回网络事件,#define WSAGETSELECTEVENT(lParam)LOWORD(lParam),收到,FD_READ,事件通知的情况:,(,1,)调用,WSAAsyncSelect,(),对,socket,设,定 FD_R,EAD,事件时,,接收缓冲区中,已有,数据,。,(,2,),接收缓冲区由空变为有数据,(3)调用 recv()或,recvfro,m,()从,接收缓冲区读,取,数据时,没有,读完。,收到,FD_WRITE,事件通知的情况:,使用,connect,或,WSAConnect,,一个套接字首次建立了连接。,使用,accept,或,WSAAccept,,套接字被接受以后。,若,send,、,WSASend,、,sendto,或,WSASendTo,操作失败,返回了,WSAEWOULDBLOCK,错误,而且缓冲区的空间变得可用。,应用程序,自收到首条,FD_WRITE,消息开始,便应认为自己必然能在一个套接字上发出数据,直至一个,send,、,WSASend,、,sendto,或,WSASendTo,返回套接字错误,WSAEWOULDBLOCK,。经过了这样的失败以后,系统要再用另一条,FD_WRITE,通知应用程序再次发送数据。,使用,WSAAsyncSelect,模型编程步骤:,Winsock,初始化,自定义,WM_SOCKET,消息,创建窗口,必须有窗体才有消息处理,创建套接字,调用,WSAAsyncSelect(),定义需要响应的,Socket,动作,编写,WindowProc(),完成,Socket,相关动作处理,示例:,WSAAsyncSelect,模式的服务器,#pragma once,#include,#include,#define PORT 5150,#define MSGSIZE 1024,#define WM_SOCKET WM_USER+0,#pragma comment(lib,ws2_32.lib),LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);,int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow),static TCHAR szAppName=_T(AsyncSelect Model);,HWND hwnd;,MSG msg;,WNDCLASS wndclass;,/,此处省略了,wndclass,的风格定义,if(!,RegisterClass(&wndclass),),MessageBox(NULL,TEXT(This program requires Windows!),szAppName,MB_ICONERROR);,return 0;,hwnd=,CreateWindow,(szAppName,/window class name,TEXT(AsyncSelect Model),/window caption,WS_OVERLAPPEDWINDOW,/window style,CW_USEDEFAULT,/initial x position,CW_USEDEFAULT,/initial y position,CW_USEDEFAULT,/initial x size,CW_USEDEFAULT,/initial y size,NULL,/parent window handle,NULL,/window menu handle,hInstance,/program instance handle,NULL);/creation parameters,ShowWindow,(hwnd,iCmdShow);,UpdateWindow,(hwnd);,while(GetMessage(&msg,NULL,0,0),TranslateMessage(,DispatchMessage(,return msg.wParam;,LRESULT CALLBACK,WndProc,(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam),WSADATA wsd;,static SOCKET sListen;,SOCKET sClient;,SOCKADDR_IN local,client;,int ret,iAddrSize=sizeof(client);,char szMessageMSGSIZE;,switch(message),case WM_CREATE:,WSAStartup(0 x0202,/,初始化,Winsock,sListen=,socket,(AF_INET,SOCK_STREAM,IPPROTO_TCP);,local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);,local.sin_family=AF_INET;,local.sin_port=htons(PORT);,bind,(sListen,(struct sockaddr*),listen,(sListen,3);,/,为,sListen,套接字定义,FD_ACCEPT,事件的消息触发,WSAAsyncSelect,(sListen,hwnd,WM_SOCKET,FD_ACCEPT);,return 0;,case WM_SOCKET:,if(WSAGETSELECTERROR(lParam),closesocket(wParam);,break;,switch(,WSAGETSELECTEVENT,(lParam),case FD_ACCEPT:,sClient=,accept,(wParam,(struct sockaddr*),/,为,sClient,套接字关联,FD_READ|FD_CLOSE,事件,WSAAsyncSelect,(sClient,hwnd,WM_SOCKET,FD_READ|FD_CLOSE);,break;,case FD_READ:,ret=,recv,(wParam,szMessage,MSGSIZE,0);,if(ret=0|ret=SOCKET_ERROR&WSAGetLastError()=WSAECONNRESET),closesocket(wParam);,else,szMessageret=0;,send,(wParam,szMessage,strlen(szMessage),0);,break;,case FD_CLOSE:,closesocket(wParam);,break;,/,其他代码省略。具体代码可以参照,MFC,生成的框架,异步选择模型的优缺点,优点,:,WSAAsyncSelect,提供了读写数据能力的异步通知,不需要像,select,模型那样去遍历多个套接字,缺点,:必须要使用一个窗口接收消息,如果处理成千上万的套接字就力不从心了,展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




网络编程技术(西电课件)_第8章-1.ppt



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/13189354.html