资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2011/12/27,#,UNIX,网络编程,UNIX,网络编程,主要内容,1.,基本,TCP,套接字编程,2.I/O,模型,3.UNIX,下高级,I/O,函数,4.IOCTL,操作,5.,客户,/,服务器程序设计范式,TCP/UDP,协议,TCP,1.TCP,连接建立和终止,(,三次握手,),2.TCP,状态转换图,3.TIME_WAIT,状态,TCP,连接建立,TCP,连接终止,TCP,状态转换,TCP,为一个连接,定义了,11,种状态,TCP,状态转换,一个完整的,TCP,连接,所发生的实际分组交换,情况:建立连接、,传送数据和终止连接,缓冲区大小以及限制,IPV4,数据报的最大大小是,65535,字节,IPV6,最大大小为,65575,以太网最大传输单元,(MTU),为,1500,字节,IP,数据报发出时,大小超过对应链路的,MTU,IPV4,和,IPV6,都将执行分片,到目的地被重组,TCP,最大分节大小,(MSS),用于向对端,TCP,通告对端在每个分节中能发送的最大,TCP,数据量,TCP,输出,UDP,输出,基本套接字编程,套接字地址结构,基本套接字编程,SocketAPI,最初是在,BSD UNIX,中开发的,用来为,TCP/IP,协议簇提供应用程序级接口,后来被移植到大多数系统,现在是“事实上”,TCP/IP,上编写进程间通信的标准,基本套接字编程,通用套接字地址结构,基本套接字编程,主机字节序,网络字节序,(,高字节序存储,),字节序转换函数,TCP,套接字编程,TCP,客户端服务器的套接字函数,TCP,套接字编程,Socket,函数,int socket(int family,int type,int protocol),返回非负成功,TCP,套接字编程,Connect,函数,int connect(,SOCKET,s,const struct sockaddr FAR*,name,int,namelen,);,函数,connect,激发,TCP,上次握手过程,阻塞,TCP,套接字编程,Bind,函数,给套接字绑定一个本地协议地址,(IP/,端口,),Int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen),返回,0,成功,-1,失败,TCP,套接字编程,Int listen(int sockfd,int backlog),函数,socket,创建的是主动套接字,,listen,将这个套接字设置为被动,函数第二个参数规定了内核为此套接字排队的最大连接个数 什么是,backlog?,TCP,套接字编程,Listen,函数,监听套接字,内核要维护两个队列:,1.,未完成连接队列,2.,已完成连接队列,TCP,套接字编程,BSD,手册定义,backlog,为待处理连接可能增长的最大数目。但并未解释什么是待处理连接,是出于,SYN_RCVD,还是,ESTABLISHED,状态,还是两者俱可。,Berkeley,的实现加了一个模糊因子:把它,1.5,TCP,套接字编程,MSDN,的解释,backlog,Maximum length of the queue of pending connections.If set to SOMAXCONN,the underlying service provider responsible for socket,s,will set the backlog to a maximum reasonable value.There is no standard provision to obtain the actual backlog value.,TCP,套接字编程,Accept,函数,Int accept(int sockfd,struct sockaddr*cliadrr,socklen_t*addrlen),从已完成连接队列取出一个已完成的连接,若队列为空则阻塞线程,TCP,套接字编程,Close(),TCP,套接字编程,一个典型的服务器程序,TCP,套接字编程,一个并发服务器,UNIX,下写一个并发服务器最简单的方法 就是为每个客户,FORK,一个子进程,I/O,模型,阻塞,非阻塞,I/O,多路复用,(select),信号驱动,异步,I/O,I/0,模型,阻塞模型,系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者错误才返回,I/O,模型,非阻塞,I/O,操作未完成时,系统返回一个错误,进程必须循环调用系统函数去轮询内核,I/O,模型,I/O,复用,
展开阅读全文