欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    PangYing网络编程.ppt

    • 资源ID:2893766       资源大小:520.02KB        全文页数:61页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    PangYing网络编程.ppt

    1,Socket 网络编程,庞莹,2,TCP/IP Socket网络编程,Socket简介 C/S模型 Socket常用函数 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞 TCP 异常,3,Socket网络编程,目标 : 应用进程跨越网络的通信 与Internet 上的程序进行通讯 独立于具体协议的网络编程接口,4,系统调用和应用编程接口,多数操作系统使用系统调用在应用程序和操作系统间传递控制权 对程序员来说,系统调用和程序设计中的函数调用相似,只是系统调用是将控制权传递给了操作系统,5,多个应用进程使用系统调用的机制,应用程序 1,应用程序 2,应用程序 n,由应用程序调用的系统函数,包括 TCP/IP 协议软件的操作系统内核,6,为什么需要Socket,普通的I/O操作过程 打开文件读/写操作关闭文件 TCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作 进行网络操作的两个进程在不同的机器上,如何连接? 网络协议具有多样性,如何进行统一的操作 需要一种通用的网络编程接口:Socket,7,几种应用编程接口 API 提供应用程序使用TCP/IP,Socket Interface Berkeley UNIX 操作系统定义的一种 API,又称插口接口 Windows Socket 微软OS中采用了插口接口 API,形成稍有不同的 API Transport Layer Interface (TLI) AT&T 为其 UNIX 系统 V 定义的一种 API,8,应用进程通过插口接入到网络,TCP,TCP,应用进程,因特网,由操作系统控制,插口,又称为 API,9,插口的作用,当应用进程要进行网络通信时 发出系统调用,请求OS为其创建“插口” 将通信所需系统资源分配给此应用进程 操作系统 将这些资源总和用一个号码表示 将号码返回给应用进程 通信完毕 应用进程通知OS回收“号码”相关的所有资源,10,插口与操作系统,Socket以上的进程 受应用程序控制 应用程序开发者有完全控制权 Socket 以下的 TCP 协议软件及 TCP 使用的缓存和必要的变量 受计算机操作系统控制 只要应用程序使用 TCP/IP 协议进行通信,就必须通过插口与操作系统交互并请求服务,11,服务器的两种工作方式,服务器的两种工作方式 循环方式(iterative mode) 计算机中一次只运行一个服务器进程 当多个客户进程请求服务时,服务器进程按先后顺序依次响应 并发方式(concurrent) 计算机中同时运行多个服务器进程,每个进程都对某特定客户进程做出响应,12,无连接循环服务器,使用UDP 的服务器进程的常用方式 一个进程同一时间只向一客户进程服务 服务器进程收到一客户请求后,发送 UDP 响应 对其他客户进程的请求都在服务器队列中排队 当处理完一个请求时,从队列中读下一客户进程的请求,继续处理,13,无连接循环服务器的特点,UDP,服务器进程,UDP,客户进程,客户插口,服务器插口,UDP,客户进程,客户插口,UDP,客户进程,客户插口,一次一个 客户进程,服务器进程只使用一个服务器插口。每个客户使用自己创建的客户插口(端口号自己设定),14,面向连接并发服务器的特点(1/3) 服务器进程同一时间为多个客户服务,TCP,TCP,客户进程,客户插口,临 时 插 口,TCP,客户进程,客户插口,TCP,客户进程,客户插口,主服务器进程,TCP 连接,创建,从属服务器进程,主进程有时又称父进程,从属进程又称子服务器进程。,15,面向连接并发服务器的特点(2/3) S与C建立多条 TCP 连接,每条在数据传完后释放,TCP,TCP,客户进程,客户插口,临 时 插 口,TCP,客户进程,客户插口,TCP,客户进程,客户插口,主服务器进程,TCP 连接,创建,从属服务器进程,16,面向连接并发服务器的特点(3/3) 使用 TCP 的服务器只能有一个熟知端口,TCP,TCP,客户进程,客户插口,临 时 插 口,TCP,客户进程,客户插口,TCP,客户进程,客户插口,主服务器进程,TCP 连接,仅用于接受 服务请求的插口,创建,从属服务器进程,所有这些插口都使用服务器的熟知端口号,17,并发处理过程,TCP,TCP,客户进程,客户插口,临 时 插 口,TCP,客户进程,客户插口,TCP,客户进程,客户插口,主服务器进程,TCP 连接,仅用于接受 服务请求的插口,创建,从属服务器进程,S收到请求后,创建一从属服务器(用临时插口和客户建立 TCP 连接),主服务器继续在原来熟知端口等待其他客户请求,所有这些插口都使用服务器的熟知端口号,18,C/S model,Client-server model is basis for distributed applications Server is specialized, complex program (process) that offers a service Arbitrary application can become a client by contacting a server and sending a request Most servers are concurrent,19,Socket类型,流式套接字(SOCK_STREAM) 提供面向连接、可靠数据传输服务,无差错、无重复发送且按发送顺序接收 内置流量控制,避免数据流淹没慢接收方。数据被看作是字节流,无长度限制 数据报套接字(SOCK_DGRAM) 提供无连接服务。包独立地发送,可能出错、丢失/重复,无序接收。 原始套接字(SOCK_RAW) 可对较低层次协议,如IP、ICMP直接访问,20,Socket的位置,21,两类系统中使用的Socket,不同操作系统中的Socket Windows Socket (Winsock) Linux Socket (BSD Socket),22,Windows Socket,简称Winsock Windows环境下的一套网络编程规范,基于4.3BSD的BSD Socket API制定 1991年Winsock 1.1,16位,由WINSOCK.DLL支持,主要用在Windows 95中 1997年Winsock 2.2 版,32位,由WSOCK32.DLL支持,用在Windows 98及以后的版本中 已成为Windows环境网络编程的事实标准,23,Windows Socket(续),三类函数 与BSD Socket相兼容的基本函数 与BSD Socket相兼容的网络信息检索函数 Windows专用扩展函数,24,Socket常用的函数,基本函数 网络信息检索函数,25,基本函数 - 网络连接函数,socket 创建套接字 bind 绑定本机端口 connect 建立连接 listen 监听端口 accept 接受连接 recv, recvfrom 数据接收 send, sendto 数据发送 close, shutdown 关闭套接字,26,字节序,大尾端(Big-Endian):字节的高位在内存中放在存储单元的起始位置 小尾端(Little-Endian):与大尾端相反,27,网络字节序与主机字节序,网络字节序(NBO,Network Byte Order) 使用统一的字节顺序,避免兼容性问题 主机字节序(HBO,Host Byte Order) 不同机器HBO不一样,与CPU设计有关 Motorola 68K系列,HBO与NBO是一致的 Intel X86系列,HBO与NBO不一致,28,*基本函数(续) -转换函数,IP地址转换函数 inet_addr() :点分十进制数表示的IP地址转换为网络字节序的IP地址 inet_ntoa() :网络字节序的IP地址转换为点分十进制数表示的IP地址 字节排序函数 htonl 4字节主机字节序转换为网络字节序 ntohl 4字节网络字节序转换为主机字节序 htons 2字节主机字节序转换为网络字节序 ntohs 2字节网络字节序转换为主机字节序,29,*网络信息检索函数,gethostname 获得主机名 getpeername 获得与套接口相连的远程协议地址 getsockname 获得套接口本地协议地址 gethostbyname 根据主机名取得主机信息 gethostbyaddr 根据主机地址取得主机信息 getprotobyname 根据协议名取得主机协议信息 getprotobynumber 根据协议号取得主机协议信息 getservbyname 根据服务名取得相关服务信息 getservbyport 根据端口号取得相关服务信息 getsockopt/setsockopt 获取/设置一个套接口选项 ioctlsocket 设置套接口的工作方式,30,Windows中的Socket编程,Windows中的Socket编程 Winsock 的启动 Winsock API基本函数 TCP/IP网络程序框架(C/S模式) 阻塞与非阻塞通信方式 实例程序说明,31,进程通过系统调用接口进行通信的过程 无连接循环服务器,服务器,recvfrom(),socket(),bind(),recvfrom(),无限制重复,socket(),若需要就重复,sendto(),进程,sendto(),close(),客户,请求,响应,32,面向连接并发服务器,服务器,read(),socket(),bind(),accept(),无限制重复,socket(),若需要就重复,write(),进程,close()接受,close(),客户,请求,响应,listen(),fork(),connect(),write(),read(),socket(),若需要就重复,连接请求,主服务器,close()接受,从属服务器,33,基本套接字函数listen,#include int listen(int sockfd, int backlog) 返回:0成功;-1出错并置errno值; 函数listen仅被服务器调用,它完成两件事情: 函数listen将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求; 函数的第二个参数规定了内核为此套接字排队的最大连接个数; 对于给定的监听套接字,内核要维护两个队列 未完成连接队列 已完成连接队列 两个队列之和不超过backlog;,34,客户,服务器,Connect调用,在未完成队列建立条目,SYN J,SYN K, ack J+1,ack K+1,该条目从未完成队列移至已完成队列,accept,Connect返回,TCP三路握手和监听套接口的两个队列,listen,35,listen函数(续),三路握手完成,两队列之和不能 超过backlog,已完成连接队列 (ESTABLISHED状态),未完成连接队列 (SYN_RCVD状态),新到达的SYN分节,服务器,TCP,accept,TCP为监听套接口维护的两个队列,36,listen函数(续),另外几点说明: 不同的实现对backlog有不同的解释,如源自Berkeley的实现将backlog增加一个模糊因子,把它乘以1.5,再作为两个队列之和; 不要把backlog定义为0,因为有些实现允许1个连接排队,而有些实现不允许有连接排队; 当一个客户SYN到达时,若两个队列都是满的,tcp就忽略此分节,且不发送RST。这是因为,这种情况是暂时的,客户tcp将重发SYN,期望不久的将来就能在队列中找到空闲条目。如果发送RST,将会出现?,要是TCP服务器发送一个RST,客户的connect函数立即返回一个错误,强制应用进程处理这种情况,而不是让TCP正常的重传机制处理。客户区别不了两种情况,作为SYN的响应,意为“此端口上没有服务器”的RST和意为“有服务器在此端口上但其队列满”的RST。,37,基本套接字函数connect,#include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 返回:0成功;-1出错; 函数connect激发TCP的三路握手过程;仅在成功或出错返回;错误有以下几种情况: 如果客户没有收到SYN分节的响应(总共75秒,这之间需要可能需要重发若干次SYN),则返回ETIMEDOUT。 如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连。函数返回错误ECONNREFUSED; 如果客户发出的SYN在中间路由器上引发一个目的地不可达ICMP错误,客户上的内核保存此消息,并按第一种情况,连续发送SYN,直到规定时间,返回保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。,38,connect函数(续),客户在调用connect前不必非得调用bind函数,此时,内核会选择一个合适的IP地址和临时端口号; 如果函数connect失败,则套接字不可再用,必须关闭。不能再对此套接字再调用函数connect。,39,基本套接字函数accept,#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 返回:非负描述字(connfd)OK;-1出错; accept函数由TCP服务器调用;从已完成连接队列头返回下一个已完成连接;如果该队列空,则进程进入睡眠状态。 函数返回的套接字为已连接套接字,应与监听套接字区分开来 该函数最多返回三个值:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由cliaddr所指),以及该地址的大小(这后两个参数是值结果参数);也就是说,服务器可以通过参数cliaddr来得到请求连接并获得成功的客户的地址和端口号;,40,基本套接字函数close,#include int close(int sockfd); 返回:0OK;-1出错; close函数缺省功能是将套接字做上“已关闭”标记,并立即返回到进程。这个套接字不能再为该进程所用。 正常情况下,close将引发向TCP的四分节终止序列,但在终止前将发送已排队的数据; 如果套接字描述符访问计数在调用close后大于0(在多个进程共享同一个套接字的情况下),则不会引发TCP终止序列(即不会发送FIN分节);,41,基本套接字函数-shutdown,#include int shutdown(int sockfd, int howto); 返回:0OK;-1出错,并置相应的errno的值; 该函数立即发送FIN分节(无论其访问计数是否大于0)。shutdown根据参数howto关闭指定方向的数据传输; SHUT_RD:关闭连接的读这一半,不再接收套接字中的数据且现留在接收缓冲区的数据作废; SHUT_WR :关闭连接的写这一半(半关闭),当留在套接字发送缓冲区中的数据都被发送,后跟tcp连接终止序列,不管访问计数是否大于0;此后将不能在执行对套接字的任何写操作; SHUT_RDWR:连接的读、写都关闭,这等效于调用shutdown两次,一次调用是用SHUT_RD,第二次用SHUT_WR。,42,关闭读写通道-shutdown()函数,套接口上读写操作完成后,应首先用shutdown()关闭套接口的读通道、写通道或读写通道 优点:当双方不再发送或接收时,通知对方,防止数据丢失,“优雅”地关闭连接 int shutdown( SOCKET s, int how );,43,shutdown()函数参数说明,s标识一个套接口的描述字 how是一个标志,用于描述禁止哪些操作,取值如下表所示,44,关闭套接口-closesocket()函数,shutdown函数只关闭读写通道,并不关闭套接口,套接口占有资源被一直保留到closesocket()调用之前 对不再使用的套接口一定要关闭,以释放与其关联的所有资源,包括等候处理的数据 int closesocket( SOCKET s ); 参数s表示即将被关闭的套接口,45,数据,数据,FIN,数据和FIN的确认,数据,数据,FIN,数据和FIN的确认,write,write,shutdown,Read返回大于0,Read返回大于0,Read返回0,write,write,close,Read返回大于0,Read返回0,Read返回大于0,客户,服务器,调用shutdown关闭一半TCP连接,46,基本套接字函数read,#include int read(int fd, char *buf, int len); 返回:大于0读写字节大小;-1出错; 调用函数read时,有如下几种情况: 套接字接收缓冲区接收数据,返回接收到的字节数; tcp协议收到FIN数据,返回0; tcp协议收到RST数据,返回1,同时errno为ECONNRESET; 进程阻塞过程中接收到信号,返回1,同时errno为EINTR?。 read(connfd,buff,strlen(buff);,47,基本套接字函数write,#include int write(int fd, char *buf, int len); 返回:大于0读写字节大小;-1出错; 调用函数write,有如下几种情况: 套接字发送缓冲区有足够空间,返回发送的字节数; tcp协议接收到RST数据,返回1,同时errno为ECONNRESET; ; 进程阻塞过程中接收到信号,返回1,同时errno为EINTR。 write(connfd,buff,strlen(buff);,48,数据传输函数send,#include #include ssize_t send (int fd, const void *msg, size_t len, int flags); 返回:非0发送成功的数据长度;-1出错; flags 是传输控制标志,其值定义如下: 0:常规操作,如同write()函数 MSG_OOB,发送带外数据(TCP紧急数据)。 MSG_DONTROUTE:忽略底层协议的路由设置,只能将数据发送给与发送机处在同一个网络中的机器上。,49,数据传输函数recv,#include #include ssize_t recv(int fd, void *buf ,size_t len, int flags); 返回:大于0表示成功接收的数据长度;0: 对方已关闭,-1:出错。 flags是传输控制标志,其值定义如下: 0:常规操作,如同read()函数; MSG_PEEK:只查看数据而不读出数据,后续读操作仍然能读出所查看的该数据; MSG_OOB:忽略常规数据,而只读带外数据; MSG_WAITALL:recv函数只有在将接收缓冲区填满后才返回。,50,阻塞通信与非阻塞通信,阻塞方式: 套接字进行I/O操作时,函数要等到相关操作完成后才返回,处理机利用率不高,但编程简单 非阻塞方式: 套接字进行I/O操作时,无论操作成功与否,调用都会立即返回 一个套接口的默认操作模式为阻塞,可以调用函数ioctlsocket()进行设置,51,并发服务器,52,三种异常情况,下面我们考虑在以下三种异常情况发生后,tcp客户服务器程序的反映; 服务器主机崩溃 服务器主机崩溃后重启 服务器主机关机。,53,服务器主机崩溃,服务器主机崩溃时,已有的网络连接上发不出任何东西。 同时假设应用程序发出数据后,然后阻塞于从套接字读取响应。 由于服务器主机崩溃,因此客户tcp会持续重传数据分节,试图从服务器接收一个ACK:源自Berkeley的实现将重传12次。当客户tcp最终放弃时,返回给客户一个错误,此时错误是ETIMEDOUT,或者是因为中间路由器判定服务器主机不可达,且以一个目的地不可达的ICMP消息响应,则错误是EHOSTUNREACH或ENETUNREACH。 通过设置套接字选项可以更改tcp持续重传等待的超时时间。,54,服务器主机崩溃后重启,在这种情况下,如果客户在主机崩溃重启前不主动发送数据,那么客户是不会知道服务器已崩溃的。在服务器重启后,客户向服务器发送一个数据分节; 由于服务器重启后丢失了以前的连接信息(尽管在服务端口上有进程监听,但连接套接字所在的端口无进程等待),因此导致服务器主机的tcp响应RST; 当客户tcp收到RST,向客户返回错误,ECONNRESET 如果客户对服务器的崩溃情况很关心,即使客户不主动发送数据也这样,就需要其他技术支持(如套接口选项SO_KEEPALIVE或某些客户服务器心跳函数)。,55,服务器主机关机?,当Linux主机关机时,由init进程给所有运行的进程发信号SIGTERM(我们的服务器程序可以捕获该信号,并在信号处理程序中正常关闭网络连接)。 如果服务器程序忽略了SIGTERM信号,则init进程会等待一段固定的时间(通常是5s20s),然后给所有还在运行的程序发信号SIGKILL(该信号不能由服务器程序捕获);服务器将由信号SIGKILL终止,其终止时,所有打开的描述字被关闭,这导致向客户发送FIN分节; 客户收到FIN分节后,能推断出服务器将终止服务。,56,补充:发送RST的原因,1.connect一个不存在的端口,会收到RST 2.send一个已经关掉的连接,会收到RST 3.send一个已经死掉的连接,会收到RST 4.设置SO_LINGER选项? 5.Close 一个缓冲区中还有接受数据的连接,会发送RST,57,几种我测试的异常,server端监听,客户端调用connect成功后调用rcv,然后在任务管理器中结束server,此时rcv函数的返回值为error,GetLastError值为10054。用wireshark抓包看到server向client发送了RST。 Server 与 client 连接成功后,断开server端网卡,调用send函数,返回值为error, GetLastError值为10053。Clientd端调用rcv函数返回error, GetLastError值为10054。当重新连上网卡时发送数据不能成功,58,需要考虑的问题,当client 与 server 端连接过程中,server突然dump了,并且在dump之前 client 与 server 并无数据需交换?会发生什么情况,在客户端上创建的socket连接会永远存在吗?还是会收到什么异常呢?,59,平台和编译器,推荐 Linux PC 上用 GNU 的 gcc 从入门级socket 编程开始动手 参考书籍 Richard Stevens UNIX网络编程清华大学出版社 UNIX环境高级编程清华大学出版社 TCP/IP详解(卷2) 机械工业出版社 网络攻防技术与实践-Windows sockets编程 科学出版社,60,答疑问题,1. Windows tcp 有keeplive 机制吗? 没有,可以用setopt设置 windows 操作系统默认的心跳时间为2小时,如果有需要可以用setopt函数设置心跳时间。 2. 操作一共有多少个port 65536 3. 客户端端口的分配: 客户端一般不用bind()绑定端口。TCP在调用connect后会自动分配一个端口。UDP在调用sendto()后会自动分配端口,如果是静态IP则此端口一直使用到socket关闭,如果是动态IP则每次调用sendto()都会分配新的端口。,61,答疑问题,

    注意事项

    本文(PangYing网络编程.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开