《LINUX网络编程.ppt》由会员分享,可在线阅读,更多相关《LINUX网络编程.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LINUX网络编程行业事业部黄文举2010.10.26套接口n在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,而套接口就是系统进程和文件描述符通信的一种方法,目前最常用的套接口:字节流套接口和数据报套接口、原始套接口。TCP套接口nTCP套接口使用TCP建立连接,建立一个TCP连接需要三次握手,基本过程是服务器先建立一个套接口并等待客户端的连接请求;当客户端调用connect进行主动连接请求时,客户端TCP发送一个SYN,告诉服务器客户端将在连接中发送的数据的初始序列号;当服务器收到这个SYN后也给客户端发一个SYN,里面包含了服务器将
2、在同一连接中发送的数据的初始序列号;最后客户在确认服务器发的SYN。到此为止,一个TCP连接被建立。UDP套接口nUDP套接口UDP套接口是无连接的、不可靠的数据报协议;既然它不可靠为什么还要用呢?其一:当应用程序使用广播或多播是只能使用UDP协议;其二:由于他是无连接的,所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。在编写UDP套接口程序时,有几点要注意:建立套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口;由于UDP是无连接的,所以服务器端并不需要listen或accept函数;当UDP套
3、接口调用connect函数时,内核只记录连接放的IP地址和端口,并立即返回给调用进程SOCKET的位置应用层程序TCPUDPIP数据链路层及物理层流式套接口数据报套接口原始套接口网络函数及用法nsocket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。#include#includeintsocket(intfamily,inttype,intprotocol);返回:非负描述字成功-1失败网络函数及用法nconnect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址。#include#includein
4、tconnect(intsockfd,conststructsockaddr*servaddr,socklen_taddrlen);返回:0成功-1失败网络函数及用法nbind函数:为套接口分配一个本地IP和协议端口。#include#includeintbind(intsockfd,conststructsockaddr*myaddr,socklen_taddrlen);返回:0成功-1失败网络函数及用法nlisten函数:listen函数仅被TCP服务器调用,它的作用是将用socket创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。#includeintlisten(ints
5、ockfd,intbacklog);返回:0成功-1失败网络函数及用法naccept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);返回:非负描述字成功-1失败网络函数及用法nconnect函数:connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符,失败时返回-1.intconnect(intsockfd,structsockaddr*serv_addr
6、,intaddrlen)nsockfd:socket返回的文件描述符.nserv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址naddrlen:serv_addr的长度返回:非负描述字成功-1失败网络函数及用法ninet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。intinet_pton(intfamily,constchar*strptr,void*addrptr);返回:1成功0输入不是有效的表达格式-1失败网络函数及用法ninet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络
7、字节序二进制值转换成点分十进制串。constchar*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);返回:指向结果的指针成功NULL失败网络理论数据进入协议栈时的封装过程数据进入协议栈时的封装过程封装当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当做一串比特流送入网络。其中每一层对收到的数据都要增加一些首部的信息(有时还要增加尾部信息),此过程为封装。UDP和TCP数据基本一致。唯一不同的是UDP传给IP的信息单元称作UDP数据报,而且UDP的首部长度为8字节。以太网数据帧的分用过程网络理论
8、n分用当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上,同时去掉各层协议加上的报文首部。每层协议盒都要去掉检查报文首部中的协议标识,以确定接收数据的上层协议,这个过程就是分用。面向连接的C/S程序的工作流程(TCP)面向连接的C/S程序的工作流程(TCP)面向连接的C/S程序的工作流程图(TCP)无连接的C/S程序的工作流程(UDP)无连接的C/S程序的工作流程(UDP)无连接的C/S程序的工作流程图(UDP)UDP服务器端UDP客户端TCP服务器端TCP客户端输入输出模型LINUX的输入输出主要有4种模型:阻塞式、非阻塞式、多路复用和信号驱动阻塞式的输入/输出在套接字上执行以下
9、4种函数调用会阻塞a.读操作:read、readv、recv、recvfrom和recvmsg这些操作的过程如图a-1所示(以read为例)阻塞式的读操作过程阻塞式的写操作过程b.写操作:write、writev、send、sendto和sendmsg这些操作的过程如图b-1所示(以write为例)阻塞式的写操作过程阻塞式的接收连接:acceptc.TCP套接字接收连接:accept函数accept的执行过程如图c-1所示阻塞式的接收操作过程阻塞式的连接:connectd.建立连接connect,操作过程如图d-1所示阻塞式输入/输出优缺点优点:编程模型清晰,结构简单,通信双方比较容易保持同步
10、缺陷:进程可能永远阻塞、进程的效率比较低非阻塞式输入输出在一个非阻塞式套接字上进行输入/输出操作时,如果操作不能完成,那么操作将以错误返回。图1-1描述了在非阻塞式套接字进行读操作的过程。非阻塞式的读操作过程非阻塞式读、写、接收、连接(1)读操作,如果套接字接收缓冲区没有数据,函数将以错误(EWOULDBLOCK)返回。(2)写操作,如果发送缓冲区中没有空间,函数以错误(EWOULDBLOCK)返回。(3)接收连接操作,如果没有新的连接,函数也是错误(EWOULDBLOCK)返回(4)连接操作,函数将启动TCP协议3次握手过程,但是不等待连接的建立,而是立即以错误返回,错误类型为EINPROG
11、RESS。设置非阻塞套接字两种方法:(1)函数fcntl,操作如下:intflags;flag=fcntl(sockfd,F_GETFL,0);fcntl(sockfd,F_SETFL,flag|O_NONBLOCK);(2)函数ioctl,操作如下:inton=1;ioctl(sockfd,FIONBIO,&on);多路复用输入/输出多路复用输入/输出综合了阻塞与非阻塞式输入输出的优点。使用函数seclect可以同时检查多个描述符是否就绪。当有描述符就绪时,函数seclet成功返回。图3-1描述了输入输出多路复用模型。多路复用select操作过程信号驱动输入输出模型图4-3信号驱动通信过程信号驱动输入输出模型在一个套接字上使用信号驱动输入/输出时,需要执行以下几步操作:(1)为信号SIGIO建立一个信号处理函数(2)设置套接字的所有者(3)允许这个套接字进行信号驱动输入/输出小结讨论套接字的4种输入/输出方式:阻塞式套接字:编程模型简单,单效率不高非阻塞套接字:效率比较高,进程永远不会阻塞,但是编程模型复杂套接字多路复用:理想的编程方式信号驱动:效率高,但增加了编程的难度谢谢!
限制150内