Linux网络编程_参考.ppt
《Linux网络编程_参考.ppt》由会员分享,可在线阅读,更多相关《Linux网络编程_参考.ppt(251页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教师:曾卫华教师:曾卫华第第5章章Linux套接字网络套接字网络编程接口编程接口中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()第第5章章Linux套接字网络编程接口套接字网络编程接口l网络编程接口的产生与发展网络编程接口的产生与发展l套接字基础套接字基础l面向连接的传输层套接字面向连接的传输层套接字编程编程l无连接的套接字编程无连接的套接字编程l高级套接字函数高级套接字函数l服务器的服务器的I/O模型模型l网络层的原始套接字网络层的原始套接字l面向数据链路层的套接字面向数据链路层的套接字教师:曾卫华教师:曾卫华网络编程接口网络编程接口产生与发展产生与发展中国地质大学中国
2、地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展l问题的提出问题的提出站在应用程序实现的角度,应用程序如何方便地站在应用程序实现的角度,应用程序如何方便地使用协议栈软件进行通信呢?使用协议栈软件进行通信呢?如果能在应用程序与协议栈软件之间提供一个软如果能在应用程序与协议栈软件之间提供一个软件接口,就可以方便客户与服务器软件的编程。件接口,就可以方便客户与服务器软件的编程。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展l套接字编程接口套接字编程接口套接字应用程序编程接口是
3、网络应用程序通过网套接字应用程序编程接口是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口与协议栈软件之间的接口,简称套接字编程接口(SocketAPI)。它定义了应用程序与协议栈软件进行交互时可以它定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度。这些功能的程序的难度。中国地质大学中国地质大学(北京北京)地信学院地信学院
4、曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展lSocket 的历史的历史在在80 年代早期,远景研究规划局(年代早期,远景研究规划局(Advanced Research Projects Agency,ARPA)资助了佳利福尼亚大学伯克利分校的一个研究组,)资助了佳利福尼亚大学伯克利分校的一个研究组,让他们将让他们将TCP/IP 软件移植到软件移植到UNIX 操作系统中,并将结果提供给操作系统中,并将结果提供给其他网点。其他网点。作为项目的一部分,设计者们创建了一个接口,应用进程使用这作为项目的一部分,设计者们创建了一个接口,应用进程使用这个接口可以方便的进行通信。他们决
5、定,只要有可能就使用以有个接口可以方便的进行通信。他们决定,只要有可能就使用以有的系统调用,对那些不能方便的容入已有的函数集的情况,就再的系统调用,对那些不能方便的容入已有的函数集的情况,就再增加新的系统调用以支持增加新的系统调用以支持TCP/IP 功能。功能。这样做的结果就出现了插口接口(这样做的结果就出现了插口接口(Berkeley Socket),这个系统被),这个系统被称为称为Berkeley UNIX或或BSD UNIX。(TCP/IP 首次出现在首次出现在BSD 4.1 版版本本release 4.1 of Berkeley SoftwareDistribution)。由许多计算机
6、厂商,都采用了由许多计算机厂商,都采用了Berkeley UNIX,于是许多机器上都,于是许多机器上都可以使用可以使用Socket 了。这样,了。这样,Socket 接口就被广泛使用,到现在已接口就被广泛使用,到现在已经成为事实上的标准。经成为事实上的标准。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展l要想实现套接字编程接口,可以采用两种实要想实现套接字编程接口,可以采用两种实现方式现方式:一种是在操作系统的内核中增加相应的软件来实一种是在操作系统的内核中增加相应的软件来实现,现,一种是通过开发操作系统之外的函数库来实现
7、。一种是通过开发操作系统之外的函数库来实现。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展lLinux系统是通过提供套接字系统是通过提供套接字(socket)来进行来进行网络编程的网络编程的.lSocket技术提供了在技术提供了在TCP/IP模型各个层上的模型各个层上的编程支持。编程支持。l该技术是在内核处理收到的各层协议数据,该技术是在内核处理收到的各层协议数据,然后应用程序以文件的方式接受内核传来的然后应用程序以文件的方式接受内核传来的数据。数据。l应用程序的文件处理是通过一个文件句柄来应用程序的文件处理是通过一个文件
8、句柄来进行的。进行的。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()网络编程接口的产生与发展网络编程接口的产生与发展l网络程序通过网络程序通过socket和其它几个函数的调用和其它几个函数的调用,会返回一个会返回一个 通讯的文件描述符通讯的文件描述符,l我们可以将这个描述符看成普通的文件的描我们可以将这个描述符看成普通的文件的描述符来操作述符来操作,l这就是这就是linux的设备无关性的好处的设备无关性的好处.我们可以通我们可以通过向描述符读写操作实现网络之间的数据交过向描述符读写操作实现网络之间的数据交流流.教师:曾卫华教师:曾卫华套接字基础套接字基础中国地质大学中国
9、地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l什么是套接字(什么是套接字(SOCKET)l套接口是对网络中不同主机上应用进程之间进行双套接口是对网络中不同主机上应用进程之间进行双向通信的端点的抽象,一个套接口就是网络上进程向通信的端点的抽象,一个套接口就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交通信的一端,提供了应用层进程利用网络协议栈交换数据的机制换数据的机制。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础lSocket Socket 的功能的功能Socket 的英文原意就是的英文原意就是“孔孔”或或“插
10、座插座”,将电话系统与面向连接的,将电话系统与面向连接的Socket 机制相比,有着惊人相似的地方。以一个国家级的电话网为例。机制相比,有着惊人相似的地方。以一个国家级的电话网为例。电话的通话双方相当于相互通信的两个进程;通话双方所在的地区(享电话的通话双方相当于相互通信的两个进程;通话双方所在的地区(享有一个全局唯一的区号)相当于一个网络,区号是它的网络地址;区内有一个全局唯一的区号)相当于一个网络,区号是它的网络地址;区内的一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码的一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于相当于Socket 号号.任何用户在通话
11、之前,首先要占有一部电话机,相当于申请一个任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket 号;同时要知道对方的电话号码,相当于对方有一个号;同时要知道对方的电话号码,相当于对方有一个Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通
12、话,相当于连接成功。可以正式通话,相当于连接成功。双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向当于向Socket 发送数据和从发送数据和从Socket 接受数据。通话结束后,一方挂起电接受数据。通话结束后,一方挂起电话机,相当于关闭话机,相当于关闭Socket,撤消连接。,撤消连接。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l我们应当从多个层面来理解套接字这个概念的内涵。我们应当从多个层面来理解套接字这个概念的内涵。l从套接字所处的地位来讲,套接字上联应用进程,
13、从套接字所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应用程序与网络协议栈进行交互的通信的接口,是应用程序与网络协议栈进行交互的接口。接口。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l从实现的角度来讲,非常复杂。从实现的角度来讲,非常复杂。套接字是一个复杂的软件机构,包含了一定的数套接字是一个复杂的软件机构,包含了一定的数据结构,包含许多选项,由操作系统内核管理。据结构,包含许多选项,由操作系统内核管理。l从使用的角度来讲,非常简单。从使用的角度来讲,非常
14、简单。对于套接字的操作形成了一种网络应用程序的编对于套接字的操作形成了一种网络应用程序的编程接口(程接口(API)。)。l本书把这一套操作套接字的编程接口函数称本书把这一套操作套接字的编程接口函数称作套接字编程接口,套接字是它的操作对象。作套接字编程接口,套接字是它的操作对象。l总之,套接字是网络通信的基石。总之,套接字是网络通信的基石。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l常用的常用的socket:流式套接字:流式套接字:u它提供基于它提供基于TCP协议的双向、可靠、有序且不重复的协议的双向、可靠、有序且不重复的无记录边界的数据流。无记录
15、边界的数据流。数据报套接字:数据报套接字:u它提供基于它提供基于UDP协议的双向数据流,但不一定可靠、协议的双向数据流,但不一定可靠、有序和不重复。有序和不重复。原始套接字:原始套接字:u它提供网络下层通信协议的直接访问。一般用于开发它提供网络下层通信协议的直接访问。一般用于开发新的网络层协议,如新的新的网络层协议,如新的IP协议等。协议等。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字
16、使用的数据类型和相关的问题套接字使用的数据类型和相关的问题l1三种表示套接字地址的结构三种表示套接字地址的结构在套接字编程接口中,专门定义了三种结构型的在套接字编程接口中,专门定义了三种结构型的数据类型,用来存储协议相关的网络地址,在套数据类型,用来存储协议相关的网络地址,在套接字编程接口的函数调用中要用到它们。接字编程接口的函数调用中要用到它们。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l(1)struct sockaddr这个结构用来存储套接字地址。这个结构用来存储套接字地址。数据定义:数据定义:struct sockaddr unsigne
17、d short sa_family;/*address族族,AF_xxx*/char sa_data14;/*14 bytes的协议地址的协议地址*/;sa_family 一般来说,都是一般来说,都是“AF_INET”。sa_data 包含了一些远程电脑的地址、端口和套包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一切的。接字的数目,它里面的数据是杂溶在一切的。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l(2).(2).struct sockaddr_in为了处理为了处理struct sockaddr,程序员建立了另外一个相似
18、程序员建立了另外一个相似的结构的结构struct sockaddr_in:struct sockaddr_in(“in”代表代表“Internet”)struct sockaddr_in short int sin_family;/*Internet地址族地址族*/unsigned short int sin_port;/*端口号端口号*/struct in_addr sin_addr;/*Internet地址地址*/unsigned char sin_zero8;/*添添0(和(和struct sockaddr一一样大小)样大小)*/;这个结构提供了方便的手段来访问这个结构提供了方便的手段来
19、访问socket address(struct sockaddr)结构中的每一个元素。)结构中的每一个元素。中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l(3)struct in_addr专门用来存储专门用来存储IP地址,其定义如下:地址,其定义如下:/*因特网地址因特网地址(a structure for historical reasons)*/struct in_addr unsigned long s_addr;如果你声明了一个如果你声明了一个“ina”作为一个作为一个struct sockaddr_in 的结构,的结构,那么那么“ina.
20、sin_addr.s_addr”就是就是4 个字节的个字节的IP 地址(按网地址(按网络字节顺序排放)。络字节顺序排放)。需要注意的是,即使你的系统仍然使用联合而不是结构来表示需要注意的是,即使你的系统仍然使用联合而不是结构来表示struct in_addr,你仍然可以用上面的方法得到,你仍然可以用上面的方法得到4 个字节的个字节的IP 地址地址.中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字基础套接字基础l(4).这些数据结构的一般用法:这些数据结构的一般用法:首先,定义一个首先,定义一个Sockaddr_in的结构实例,并将的结构实例,并将它清零。比如:它清零
21、。比如:structsockaddr_inmyad;memset(&myad,0,sizeof(structsockaddr_in);然后,为这个结构赋值,比如:然后,为这个结构赋值,比如:myad.sin_family=AF_INET;myad.sin_port=htons(8080);myad.sin_addr.s_addr=htonl(INADDR-ANY);第三步:在函数调用中使用时,将这个结构强制第三步:在函数调用中使用时,将这个结构强制转换为转换为sockaddr类型。如:类型。如:accept(listenfd,(sockaddr*)(&myad),&addrlen);中国地质大
22、学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字使用的数据类型和相关的问题套接字使用的数据类型和相关的问题l2本机字节顺序和网络字节顺序本机字节顺序和网络字节顺序在具体计算机中的多字节数据的存储顺序,称为本机字节在具体计算机中的多字节数据的存储顺序,称为本机字节顺序。多字节数据在网络协议报头中的存储顺序,称为网顺序。多字节数据在网络协议报头中的存储顺序,称为网络字节顺序。络字节顺序。u在网络上面有着许多类型的机器在网络上面有着许多类型的机器,这些机器在表示数据这些机器在表示数据的字节顺序是不同的的字节顺序是不同的,比如比如i386芯片是低字节在内存地芯片是低字节在内存地址的低
23、端址的低端,高字节在高端高字节在高端,而而alpha芯片却相反芯片却相反.为了统一起来为了统一起来,在在Linux下面下面,有专门的字节转换函数有专门的字节转换函数.unsigned long unsigned long intint htonl(unsignedhtonl(unsigned long long intint hostlonghostlong)unsigned short unsigned short intint htons(unisgnedhtons(unisgned short short intint hostshorthostshort)unsigned long u
24、nsigned long intint ntohl(unsignedntohl(unsigned long long intint netlongnetlong)unsigned short unsigned short intint ntohs(unsignedntohs(unsigned short short intint netshortnetshort)在这四个转换函数中在这四个转换函数中,h 代表代表host,n 代表代表 network.s 代表代表short l 代表代表long 第一个函数的意义是将本机器上的第一个函数的意义是将本机器上的long数数据转化为网络上的据转化为网
25、络上的long.其他几个函数的意义也差不多其他几个函数的意义也差不多.中国地质大学中国地质大学(北京北京)地信学院地信学院曾卫华(曾卫华()套接字使用的数据类型和相关的问题套接字使用的数据类型和相关的问题l3点分十进制的点分十进制的IP地址的转换地址的转换(1)inet_atonu将将strptr所指的字符串转换成所指的字符串转换成32位的网络字节序二进制位的网络字节序二进制值。值。include int inet_aton(const char*strptr,struct in_addr*addrptr);(2)inet_addru功能同上,返回地址。功能同上,返回地址。int_addr_t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 网络 编程 参考
限制150内