收藏 分销(赏)

PangYing网络编程.pptx

上传人:可**** 文档编号:940201 上传时间:2024-04-08 格式:PPTX 页数:60 大小:424.27KB
下载 相关 举报
PangYing网络编程.pptx_第1页
第1页 / 共60页
PangYing网络编程.pptx_第2页
第2页 / 共60页
PangYing网络编程.pptx_第3页
第3页 / 共60页
PangYing网络编程.pptx_第4页
第4页 / 共60页
PangYing网络编程.pptx_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、 1TCP/IP Socket网络编程nSocket简介nC/S模型nSocket常用函数nTCP/IP网络程序框架与实例n通信方式n阻塞n非阻塞nTCP 异常 2Socket网络编程n目标:n应用进程跨越网络的通信n与Internet 上的程序进行通讯n独立于具体协议的网络编程接口 3系统调用和应用编程接口n多数操作系统使用系统调用在应用程序和操作系统间传递控制权n对程序员来说,系统调用和程序设计中的函数调用相似,只是系统调用是将控制权传递给了操作系统 4多个应用进程使用系统调用的机制 应用程序 1应用程序 2应用程序 n由应用程序调用的系统函数用户地址空间中的应用程序系统调用接口系统地址空

2、间中的协议软件包括 TCP/IP 协议软件的操作系统内核 5为什么需要Socketn普通的I/O操作过程n打开文件读/写操作关闭文件nTCP/IP协议被集成到操作系统的内核中,引入了新型的“I/O”操作n进行网络操作的两个进程在不同的机器上,如何连接?n网络协议具有多样性,如何进行统一的操作n需要一种通用的网络编程接口:Socket 6几种应用编程接口 API 提供应用程序使用TCP/IPnSocket Interface nBerkeley UNIX 操作系统定义的一种 API,又称插口接口nWindows Socketn微软OS中采用了插口接口 API,形成稍有不同的 APInTransp

3、ort Layer Interface(TLI)nAT&T 为其 UNIX 系统 V 定义的一种 API 7应用进程通过插口接入到网络 TCPTCP应用进程因特网由操作系统控制插口,又称为 API 8插口的作用 n当应用进程要进行网络通信时n发出系统调用,请求OS为其创建“插口”n将通信所需系统资源分配给此应用进程n操作系统n将这些资源总和用一个号码表示n将号码返回给应用进程n通信完毕n应用进程通知OS回收“号码”相关的所有资源 9插口与操作系统 nSocket以上的进程n受应用程序控制n应用程序开发者有完全控制权nSocket 以下的 TCP 协议软件及 TCP 使用的缓存和必要的变量n受计

4、算机操作系统控制n只要应用程序使用 TCP/IP 协议进行通信,就必须通过插口与操作系统交互并请求服务 10服务器的两种工作方式服务器的两种工作方式n循环方式(iterative mode)n计算机中一次只运行一个服务器进程n当多个客户进程请求服务时,服务器进程按先后顺序依次响应n并发方式(concurrent)n计算机中同时运行多个服务器进程,每个进程都对某特定客户进程做出响应 11无连接循环服务器n使用UDP 的服务器进程的常用方式n一个进程同一时间只向一客户进程服务n服务器进程收到一客户请求后,发送 UDP 响应n对其他客户进程的请求都在服务器队列中排队n当处理完一个请求时,从队列中读下

5、一客户进程的请求,继续处理 12无连接循环服务器的特点 UDP服务器进程UDP客户进程客户插口服务器插口UDP客户进程客户插口UDP客户进程客户插口一次一个客户进程服务器进程只使用一个服务器插口。每个客户使用自己创建的客户插口(端口号自己设定)13面向连接并发服务器的特点(1/3)服务器进程同一时间为多个客户服务TCPTCP客户进程客户插口临时插口TCP客户进程客户插口TCP客户进程客户插口主服务器进程TCP 连接创建从属服务器进程主进程有时又称父进程,从属进程又称子服务器进程。14面向连接并发服务器的特点(2/3)S与C建立多条 TCP 连接,每条在数据传完后释放TCPTCP客户进程客户插口

6、临时插口TCP客户进程客户插口TCP客户进程客户插口主服务器进程TCP 连接创建从属服务器进程 15面向连接并发服务器的特点(3/3)使用 TCP 的服务器只能有一个熟知端口TCPTCP客户进程客户插口临时插口TCP客户进程客户插口TCP客户进程客户插口主服务器进程TCP 连接仅用于接受服务请求的插口创建从属服务器进程所有这些插口都使用服务器的熟知端口号 16并发处理过程 TCPTCP客户进程客户插口临时插口TCP客户进程客户插口TCP客户进程客户插口主服务器进程TCP 连接仅用于接受服务请求的插口创建从属服务器进程S收到请求后,创建一从属服务器(用临时插口和客户建立 TCP 连接),主服务器

7、继续在原来熟知端口等待其他客户请求 所有这些插口都使用服务器的熟知端口号 17C/S modelnClient-server model is basis for distributed applicationsnServer is specialized,complex program(process)that offers a servicenArbitrary application can become a client by contacting a server and sending a requestnMost servers are concurrent 18Socket类型

8、n流式套接字(SOCK_STREAM)n提供面向连接、可靠数据传输服务,无差错、无重复发送且按发送顺序接收n内置流量控制,避免数据流淹没慢接收方。数据被看作是字节流,无长度限制n数据报套接字(SOCK_DGRAM)n提供无连接服务。包独立地发送,可能出错、丢失/重复,无序接收。n原始套接字(SOCK_RAW)n可对较低层次协议,如IP、ICMP直接访问 19Socket的位置 20两类系统中使用的Socketn不同操作系统中的SocketnWindows Socket(Winsock)nLinux Socket(BSD Socket)21Windows Socketn简称WinsocknWin

9、dows环境下的一套网络编程规范,基于4.3BSD的BSD Socket API制定n1991年Winsock 1.1,16位,由WINSOCK.DLL支持,主要用在Windows 95中n1997年Winsock 2.2 版,32位,由WSOCK32.DLL支持,用在Windows 98及以后的版本中n已成为Windows环境网络编程的事实标准 22Windows Socket(续)n三类函数n与BSD Socket相兼容的基本函数n与BSD Socket相兼容的网络信息检索函数nWindows专用扩展函数 23Socket常用的函数n基本函数n网络信息检索函数 24基本函数-网络连接函数n

10、socket创建套接字nbind 绑定本机端口nconnect建立连接nlisten 监听端口naccept 接受连接nrecv,recvfrom数据接收nsend,sendto 数据发送nclose,shutdown关闭套接字 25字节序n大尾端(Big-Endian):字节的高位在内存中放在存储单元的起始位置n小尾端(Little-Endian):与大尾端相反 26网络字节序与主机字节序n网络字节序(NBO,Network Byte Order)n使用统一的字节顺序,避免兼容性问题n主机字节序(HBO,Host Byte Order)n不同机器HBO不一样,与CPU设计有关nMotorol

11、a 68K系列,HBO与NBO是一致的nIntel X86系列,HBO与NBO不一致 27*基本函数(续)-转换函数nIP地址转换函数ninet_addr():点分十进制数表示的IP地址转换为网络字节序的IP地址ninet_ntoa():网络字节序的IP地址转换为点分十进制数表示的IP地址n字节排序函数nhtonl 4字节主机字节序转换为网络字节序nntohl 4字节网络字节序转换为主机字节序nhtons2字节主机字节序转换为网络字节序nntohs2字节网络字节序转换为主机字节序 28*网络信息检索函数ngethostname获得主机名ngetpeername获得与套接口相连的远程协议地址ng

12、etsockname获得套接口本地协议地址ngethostbyname 根据主机名取得主机信息ngethostbyaddr 根据主机地址取得主机信息ngetprotobyname 根据协议名取得主机协议信息ngetprotobynumber根据协议号取得主机协议信息ngetservbyname根据服务名取得相关服务信息ngetservbyport 根据端口号取得相关服务信息ngetsockopt/setsockopt获取/设置一个套接口选项 nioctlsocket 设置套接口的工作方式 29Windows中的Socket编程nWindows中的Socket编程nWinsock 的启动nWin

13、sock API基本函数nTCP/IP网络程序框架(C/S模式)n阻塞与非阻塞通信方式n实例程序说明 30进程通过系统调用接口进行通信的过程 无连接循环服务器 服务器recvfrom()socket()bind()recvfrom()无限制重复socket()若需要就重复sendto()进程sendto()close()客户请求响应 31 面向连接并发服务器 服务器read()socket()bind()accept()无限制重复socket()若需要就重复write()进程close()接受close()客户请求响应listen()fork()connect()write()read()so

14、cket()若需要就重复连接请求主服务器close()接受从属服务器 32基本套接字函数listen#include int listen(int sockfd,int backlog)返回:0成功;-1出错并置errno值;n函数listen仅被服务器调用,它完成两件事情:n函数listen将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求;n函数的第二个参数规定了内核为此套接字排队的最大连接个数;n对于给定的监听套接字,内核要维护两个队列n未完成连接队列n已完成连接队列n两个队列之和不超过backlog;33客户服务器Connect调用在未完成队列建立条目SYN JSY

15、N K,ack J+1ack K+1该条目从未完成队列移至已完成队列,acceptConnect返回TCP三路握手和监听套接口的两个队列listen 34listen函数(续)三路握手完成两队列之和不能超过backlog已完成连接队列(ESTABLISHED状态)未完成连接队列(SYN_RCVD状态)新到达的SYN分节服务器TCPacceptTCPTCP为监听套接口维护的两个队列为监听套接口维护的两个队列 35listen函数(续)另外几点说明:n不同的实现对backlog有不同的解释,如源自Berkeley的实现将backlog增加一个模糊因子,把它乘以1.5,再作为两个队列之和;n不要把b

16、acklog定义为0,因为有些实现允许1个连接排队,而有些实现不允许有连接排队;n当一个客户SYN到达时,若两个队列都是满的,tcp就忽略此分节,且不发送RST。这是因为,这种情况是暂时的,客户tcp将重发SYN,期望不久的将来就能在队列中找到空闲条目。如果发送如果发送RSTRST,将,将会出现?会出现?要是TCP服务器发送一个RST,客户的connect函数立即返回一个错误,强制应用进程处理这种情况,而不是让TCP正常的重传机制处理。客户区别不了两种情况,作为SYN的响应,意为“此端口上没有服务器”的RST和意为“有服务器在此端口上但其队列满”的RST。36基本套接字函数connect#in

17、clude int connect(int sockfd,const struct sockaddr*addr,socklen_t addrlen);返回:0成功;-1出错;n函数connect激发TCP的三路握手过程;仅在成功或出错返回;错误有以下几种情况:n如果客户没有收到SYN分节的响应(总共75秒,这之间需要可能需要重发若干次SYN),则返回ETIMEDOUT。n如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连。函数返回错误ECONNREFUSED;n如果客户发出的SYN在中间路由器上引发一个目的地不可达ICMP错误,客户上的内核保存此消息,并按

18、第一种情况,连续发送SYN,直到规定时间,返回保存的消息(即ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。37connect函数(续)n客户在调用connect前不必非得调用bind函数,此时,内核会选择一个合适的IP地址和临时端口号;n如果函数connect失败,则套接字不可再用,必须关闭。不能再对此套接字再调用函数connect。38基本套接字函数accept#include int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);返回:非负描述字(connfd)OK;-1出错;n

19、accept函数由TCP服务器调用;从已完成连接队列头返回下一个已完成连接;如果该队列空,则进程进入睡眠状态。n函数返回的套接字为已连接套接字,应与监听套接字区分开来n该函数最多返回三个值返回三个值:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由cliaddr所指),以及该地址的大小(这后两个参数是值结果参数);也就是说,服务器可以通过参数cliaddr来得到请求连接并获得成功的客户的地址和端口号;39基本套接字函数close#include int close(int sockfd);返回:0OK;-1出错;nclose函数缺省功能是将套接字做上“已关闭”标记,并立即

20、返回到进程。这个套接字不能再为该进程所用。n正常情况下,close将引发向TCP的四分节终止序列,但在终止前将发送已排队的数据;n如果套接字描述符访问计数在调用close后大于0(在多个进程共享同一个套接字的情况下),则不会引发TCP终止序列(即不会发送FIN分节);40基本套接字函数-shutdown#include int shutdown(int sockfd,int howto);返回:0OK;-1出错,并置相应的errno的值;n该函数立即发送FIN分节(无论其访问计数是否大于0)。shutdown根据参数howto关闭指定方向的数据传输;nSHUT_RD:关闭连接的读这一半,不再接

21、收套接字中的数据且现留在接收缓冲区的数据作废;nSHUT_WR:关闭连接的写这一半(半关闭),当留在套接字发送缓冲区中的数据都被发送,后跟tcp连接终止序列,不管访问计数是否大于0;此后将不能在执行对套接字的任何写操作;nSHUT_RDWR:连接的读、写都关闭,这等效于调用shutdown两次,一次调用是用SHUT_RD,第二次用SHUT_WR。41关闭读写通道-shutdown()函数n套接口上读写操作完成后,应首先用shutdown()关闭套接口的读通道、写通道或读写通道n优点:当双方不再发送或接收时,通知对方,防止数据丢失,“优雅”地关闭连接int shutdown(SOCKET s,i

22、nt how);42shutdown()函数参数说明ns标识一个套接口的描述字nhow是一个标志,用于描述禁止哪些操作,取值如下表所示关闭方式参数值说明SD_RECEIVE0不允许再调用接收函数,关闭读通道。套接口接收缓冲区中的所有数据都被丢弃,有新数据到达时,也被TCP协议层丢弃,但对发送缓冲区没有影响,进程仍然可在套接口上发送数据SD_SEND1不允许再调用发送函数,关闭写通道。在套接口发送缓冲区中的数据都被发出,得到确认后,生成一个FIN包关闭连接。但它对接收缓冲区没有影响,进程仍可在套接口上接收数据SD_BOTH2关闭读写通道,相当于执行了上面SD_RECEIVE和SD_SEND两个命

23、令 43关闭套接口-closesocket()函数nshutdown函数只关闭读写通道,并不关闭套接口,套接口占有资源被一直保留到closesocket()调用之前n对不再使用的套接口一定要关闭,以释放与其关联的所有资源,包括等候处理的数据int closesocket(SOCKET s);n参数s表示即将被关闭的套接口 44数据数据FIN数据和FIN的确认数据数据FIN数据和FIN的确认writewriteshutdownRead返回大于0Read返回大于0Read返回0writewritecloseRead返回大于0Read返回0Read返回大于0客户服务器调用shutdown关闭一半TC

24、P连接 45基本套接字函数read#include int read(int fd,char*buf,int len);返回:大于0读写字节大小;-1出错;n调用函数read时,有如下几种情况:n套接字接收缓冲区接收数据,返回接收到的字节数;ntcp协议收到FIN数据,返回0;ntcp协议收到RST数据,返回1,同时errno为ECONNRESET;n进程阻塞过程中接收到信号,返回1,同时errno为EINTR?。read(connfd,buff,strlen(buff);46基本套接字函数write#include int write(int fd,char*buf,int len);返回:

25、大于0读写字节大小;-1出错;n调用函数write,有如下几种情况:n套接字发送缓冲区有足够空间,返回发送的字节数;ntcp协议接收到RST数据,返回1,同时errno为ECONNRESET;n进程阻塞过程中接收到信号,返回1,同时errno为EINTR。write(connfd,buff,strlen(buff);47数据传输函数send#include#include ssize_t send(int fd,const void*msg,size_t len,int flags);返回:非0发送成功的数据长度;-1出错;nflags 是传输控制标志,其值定义如下:n0:常规操作,如同wri

26、te()函数nMSG_OOB,发送带外数据(TCP紧急数据)。nMSG_DONTROUTE:忽略底层协议的路由设置,只能将数据发送给与发送机处在同一个网络中的机器上。48数据传输函数recv#include#include ssize_t recv(int fd,void*buf,size_t len,int flags);返回:大于0表示成功接收的数据长度;0:对方已关闭,-1:出错。nflags是传输控制标志,其值定义如下:n0:常规操作,如同read()函数;nMSG_PEEK:只查看数据而不读出数据,后续读操作仍然能读出所查看的该数据;nMSG_OOB:忽略常规数据,而只读带外数据;n

27、MSG_WAITALL:recv函数只有在将接收缓冲区填满后才返回。49阻塞通信与非阻塞通信n阻塞方式:n套接字进行I/O操作时,函数要等到相关操作完成后才返回,处理机利用率不高,但编程简单n非阻塞方式:n套接字进行I/O操作时,无论操作成功与否,调用都会立即返回n一个套接口的默认操作模式为阻塞,可以调用函数ioctlsocket()进行设置 50并发服务器 51三种异常情况n下面我们考虑在以下三种异常情况发生后,tcp客户服务器程序的反映;n服务器主机崩溃n服务器主机崩溃后重启n服务器主机关机。52服务器主机崩溃n服务器主机崩溃时,已有的网络连接上发不出任何东西。n同时假设应用程序发出数据后

28、,然后阻塞于从套接字读取响应。n由于服务器主机崩溃,因此客户tcp会持续重传数据分节,试图从服务器接收一个ACK:源自Berkeley的实现将重传12次。当客户tcp最终放弃时,返回给客户一个错误,此时错误是ETIMEDOUT,或者是因为中间路由器判定服务器主机不可达,且以一个目的地不可达的ICMP消息响应,则错误是EHOSTUNREACH或ENETUNREACH。n通过设置套接字选项可以更改tcp持续重传等待的超时时间。53服务器主机崩溃后重启n在这种情况下,如果客户在主机崩溃重启前不主动发送数据,那么客户是不会知道服务器已崩溃的。在服务器重启后,客户向服务器发送一个数据分节;n由于服务器重

29、启后丢失了以前的连接信息(尽管在服务端口上有进程监听,但连接套接字所在的端口无进程等待),因此导致服务器主机的tcp响应RST;n当客户tcp收到RST,向客户返回错误,ECONNRESETn如果客户对服务器的崩溃情况很关心,即使客户不主动发送数据也这样,就需要其他技术支持(如套接口选项SO_KEEPALIVE或某些客户服务器心跳函数)。54服务器主机关机?n当Linux主机关机时,由init进程给所有运行的进程发信号SIGTERM(我们的服务器程序可以捕获该信号,并在信号处理程序中正常关闭网络连接)。n如果服务器程序忽略了SIGTERM信号,则init进程会等待一段固定的时间(通常是5s20

30、s),然后给所有还在运行的程序发信号SIGKILL(该信号不能由服务器程序捕获);服务器将由信号SIGKILL终止,其终止时,所有打开的描述字被关闭,这导致向客户发送FIN分节;n客户收到FIN分节后,能推断出服务器将终止服务。55补充:发送RST的原因1.connect一个不存在的端口,会收到RST2.send一个已经关掉的连接,会收到RST3.send一个已经死掉的连接,会收到RST4.设置SO_LINGER选项?5.Close 一个缓冲区中还有接受数据的连接,会发送RST 56几种我测试的异常nserver端监听,客户端调用connect成功后调用rcv,然后在任务管理器中结束serve

31、r,此时rcv函数的返回值为error,GetLastError值为10054。用wireshark抓包看到server向client发送了RST。nServer 与 client 连接成功后,断开server端网卡,调用send函数,返回值为error,GetLastError值为10053。Clientd端调用rcv函数返回error,GetLastError值为10054。当重新连上网卡时发送数据不能成功 57需要考虑的问题n当client 与 server 端连接过程中,server突然dump了,并且在dump之前 client 与 server 并无数据需交换?会发生什么情况,在客

32、户端上创建的socket连接会永远存在吗?还是会收到什么异常呢?58平台和编译器n推荐nLinux PC 上用 GNU 的 gccn从入门级socket 编程开始动手 n参考书籍n Richard Stevens nUNIX网络编程清华大学出版社nUNIX环境高级编程清华大学出版社n TCP/IP详解(卷2)机械工业出版社n 网络攻防技术与实践-Windows sockets编程 科学出版社 59答疑问题1.Windows tcp 有keeplive 机制吗?没有,可以用setopt设置windows 操作系统默认的心跳时间为2小时,如果有需要可以用setopt函数设置心跳时间。2.操作一共有多少个port655363.客户端端口的分配:客户端一般不用bind()绑定端口。TCP在调用connect后会自动分配一个端口。UDP在调用sendto()后会自动分配端口,如果是静态IP则此端口一直使用到socket关闭,如果是动态IP则每次调用sendto()都会分配新的端口。60答疑问题

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服