![LINUX网络编程.ppt_第1页](http://file1.renrendoc.com/fileroot2/2020-1/20/50f67172-70eb-4168-98d7-82f0d6dd8c13/50f67172-70eb-4168-98d7-82f0d6dd8c131.gif)
![LINUX网络编程.ppt_第2页](http://file1.renrendoc.com/fileroot2/2020-1/20/50f67172-70eb-4168-98d7-82f0d6dd8c13/50f67172-70eb-4168-98d7-82f0d6dd8c132.gif)
![LINUX网络编程.ppt_第3页](http://file1.renrendoc.com/fileroot2/2020-1/20/50f67172-70eb-4168-98d7-82f0d6dd8c13/50f67172-70eb-4168-98d7-82f0d6dd8c133.gif)
![LINUX网络编程.ppt_第4页](http://file1.renrendoc.com/fileroot2/2020-1/20/50f67172-70eb-4168-98d7-82f0d6dd8c13/50f67172-70eb-4168-98d7-82f0d6dd8c134.gif)
![LINUX网络编程.ppt_第5页](http://file1.renrendoc.com/fileroot2/2020-1/20/50f67172-70eb-4168-98d7-82f0d6dd8c13/50f67172-70eb-4168-98d7-82f0d6dd8c135.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LINUX网络编程,行业事业部 黄文举 2010.10.26,套接口,在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,而套接口就是系统进程和文件描述符通信的一种方法,目前最常用的套接口:字节流套接口和数据报套接口、原始套接口。,TCP套接口,TCP套接口使用TCP建立连接,建立一个TCP连接需要三次握手,基本过程是服务器先建立一个套接口并等待客户端的连接请求;当客户端调用 connect进行主动连接请求时,客户端TCP发送一个SYN,告诉服务器客户端将在连接中发送的数据的初始序列号;当服务器收到这个SYN后也给客户端发一个SYN,里面包
2、含了服务器将在同一连接中发送的数据的初始序列号;最后客户在确认服务器发的SYN。到此为止,一个TCP连接被建立。,UDP套接口,UDP套接口 UDP套接口是无连接的、不可靠的数据报协议;既然它不可靠为什么还要用呢?其一:当应用程序使用广播或多播是只能使用UDP协议;其二:由于他是无连接的,所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。 在编写UDP套接口程序时,有几点要注意:建立套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口;由于 UDP是无连接的,所以服务器端并不需要listen或acce
3、pt函数;当UDP套接口调用connect函数时,内核只记录连接放的IP地址和端口,并立即返回给调用进程,SOCKET的位置,应用层程序,TCP,UDP,IP,数据链路层及物理层,流式套 接口,数据报 套接口,原 始 套 接 口,网络函数及用法,socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。 #include #include int socket(int family,int type,int protocol); 返回:非负描述字成功-1失败,网络函数及用法,connect函数:当用socket建立了套接口后,可以调用conne
4、ct为这个套接字指明远程端的地址。 #include #include int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen); 返回:0成功-1失败,网络函数及用法,bind函数:为套接口分配一个本地IP和协议端口。 #include #include int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen); 返回:0成功-1失败,网络函数及用法,listen函数:listen函数仅被TCP服务器调用,它的作用是将用s
5、ocket创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。 #include int listen(int sockfd,int backlog); 返回:0成功-1失败,网络函数及用法,accept函数:accept函数由TCP服务器调用, 从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。 int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen); 返回:非负描述字成功-1失败,网络函数及用法,connect函数: connect函数是客户端用来同服务端连接的.成功时
6、返回0,sockfd是同服务端通讯的文件描述符,失败时返回-1. int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符. serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址 addrlen:serv_addr的长度 返回:非负描述字成功-1失败,网络函数及用法,inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。 int inet_pton(int family,const char * st
7、rptr,void * addrptr); 返回:1成功 0输入不是有效的表达格式 -1失败,网络函数及用法,inet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。 const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len); 返回:指向结果的指针成功 NULL失败,网络理论,数据进入协议栈时的封装过程,封装,当应用程序用TCP传送数据时,数据被送入协议栈中,然后 逐个通过每一层直到被当做一串比特流送入网络。其中每一层对收到的
8、数据都要增加一些首部的信息(有时还要增加尾部信息),此过程为封装。 UDP和TCP数据基本一致。唯一不同的是UDP传给IP的信息单元称作UDP数据报,而且UDP的首部长度为8字节。,以太网数据帧的分用过程,网络理论,分用 当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上,同时去掉各层协议加上的报文首部。每层协议盒都要去掉检查报文首部中的协议标识,以确定接收数据的上层协议,这个过程就是分用。,面向连接的C/S 程序的工作流程(TCP),面向连接的C/S 程序的工作流程(TCP),面向连接的C/S 程序的工作流程图(TCP),无连接的C/S 程序的工作流程(UDP),无连接的C/S
9、程序的工作流程(UDP),无连接的C/S 程序的工作流程图(UDP),UDP服务器端,UDP客户端,TCP服务器端,TCP客户端,输入输出模型,LINUX的输入输出主要有4种模型: 阻塞式、非阻塞式、多路复用和信号驱动,阻塞式的输入/输出,在套接字上执行以下4种函数调用会阻塞 a.读操作:read、readv、recv、 recvfrom和recvmsg 这些操作的过程如图a-1所示(以read为例),阻塞式的读操作过程,阻塞式的写操作过程,b.写操作:write、writev、send、sendto和sendmsg 这些操作的过程如图b-1所示(以write为例),阻塞式的写操作过程,阻塞式
10、的接收连接:accept,c. TCP套接字接收连接:accept 函数accept的执行过程如图c-1所示,阻塞式的接收操作过程,阻塞式的连接:connect,d. 建立连接connect,操作过程如图d-1所示,阻塞式输入/输出优缺点,优点:编程模型清晰,结构简单,通信双方比较容易保持同步 缺陷:进程可能永远阻塞、进程的效率比较低,非阻塞式输入输出,在一个非阻塞式套接字上进行输入/输 出操作时,如果操作不能完成,那么操作 将以错误返回。图1-1描述了在非阻塞式套 接字进行读操作的过程。,非阻塞式的读操作过程,非阻塞式读、写、接收、连接,(1)读操作,如果套接字接收缓冲区没有数据,函数将以错
11、误(EWOULDBLOCK)返回。 (2)写操作,如果发送缓冲区中没有空间,函数以错误(EWOULDBLOCK )返回。 (3)接收连接操作,如果没有新的连接,函数也是错误( EWOULDBLOCK )返回 (4)连接操作,函数将启动TCP 协议3次握手过程,但是不等待连接的建立,而是立即以错误返回,错误类型为EINPROGRESS。,设置非阻塞套接字,两种方法: (1)函数fcntl,操作如下: int flags; flag = fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flag|O_NONBLOCK); (2)函数ioctl,操作如下: int on = 1; ioctl(sockfd,FIONBIO,多路复用输入/输出,多路复用输入/输出综合了阻塞与非阻塞式输入输出的优点。使用函数seclect可以同时检查多个描述符是否就绪。当有描述符就绪时,函数seclet成功返回。图3-1描述了输入输出多路复用模型。,多路复用select操作过程,信号驱动输入输出模型,图4-3 信号驱动通信过程,信号驱动输入输出模型,在一个套接字上使用信号驱动输入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届高中语文一轮复习学案8 《阿房宫赋》《六国论》(含答案)
- 护理三基三严理论知识试题库含答案
- 初级经济法基础试题库+答案
- 生产过程质量与数据的监控与分析
- 知识产权纠纷解决与风险防范策略
- 出纳转正申请工作总结
- 内勤人员年终工作总结
- 社交媒体平台在企业文化建设中的作用
- 社区公共交通设施的隐患防范
- 电力人力资源工作总结
- DB32∕T 2948-2016 水利工程卷扬式启闭机检修技术规程
- 2023届高考复习之文学类文本阅读训练
- 建筑施工图设计教程
- 高中化学必修一复习提纲
- 皮带输送机检修及维护
- 压力容器设计综合知识要点 (1)
- 工程款支付报审表
- 同位角内错角同旁内角专项练习题有答案
- 常用抗凝药物的应用及护理PPT课件
- 浅谈压力容器产品监督检验工作要点
- 食品分析实验讲义(1)
评论
0/150
提交评论