linux套接字编程.ppt
《linux套接字编程.ppt》由会员分享,可在线阅读,更多相关《linux套接字编程.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章 套接字套接字套接字是一种网络套接字是一种网络套接字是一种网络套接字是一种网络APIAPI(应用程序编程接口)。(应用程序编程接口)。(应用程序编程接口)。(应用程序编程接口)。它定义了许多函数和例程,程序员可以用它开发它定义了许多函数和例程,程序员可以用它开发它定义了许多函数和例程,程序员可以用它开发它定义了许多函数和例程,程序员可以用它开发网络应用程序。套接字接口本意在于提供一种进网络应用程序。套接字接口本意在于提供一种进网络应用程序。套接字接口本意在于提供一种进网络应用程序。套接字接口本意在于提供一种进程间通信的方法,使得在相同或不同主机上的进程间通信的方法,使得在相同或不同
2、主机上的进程间通信的方法,使得在相同或不同主机上的进程间通信的方法,使得在相同或不同主机上的进程能以相同的规范进行双向信息传送。程能以相同的规范进行双向信息传送。程能以相同的规范进行双向信息传送。程能以相同的规范进行双向信息传送。进程通过调用进程通过调用进程通过调用进程通过调用套接字接口套接字接口套接字接口套接字接口APIAPI来实现相互之间的来实现相互之间的来实现相互之间的来实现相互之间的通信。套接字接口又利用下层的网络通信协议功通信。套接字接口又利用下层的网络通信协议功通信。套接字接口又利用下层的网络通信协议功通信。套接字接口又利用下层的网络通信协议功能和系统调用实现实际的通信工作。能和系
3、统调用实现实际的通信工作。能和系统调用实现实际的通信工作。能和系统调用实现实际的通信工作。进程通信与套接字接口进程通信与套接字接口进程通信与套接字接口进程通信与套接字接口2processTCP withbuffers,variablessocket由应用程序由应用程序开发者控制开发者控制由操作系统控制由操作系统控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercontrolled byoperatingsystemhost orserverinternet1.套接字是一个主
4、机本地应用程序所创建的套接字是一个主机本地应用程序所创建的,为操作系为操作系统所控制的接口统所控制的接口(“门门”).2.应用进程通过这个接口应用进程通过这个接口,使用传输层提供的服务使用传输层提供的服务,跨网跨网络发送络发送(/接收接收)消息到消息到(/从从)其他应用进程。其他应用进程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.3本章内容本章内容3.1 套接字类型套接字类型3.2 套接字地址结构套接字地址结构3.3 位顺序调整位顺序调整3.4 带外数据带外数据3.5 连接类型连接类型3.6 TCP套接字套接字3.7 UDP套接字套接字3.8 小结小结43
5、.1 套接字类型套接字类型套接字支持各种通信域,即多种不同的通信协套接字支持各种通信域,即多种不同的通信协议。目前议。目前UNIX系统主要支持以下几种协议:系统主要支持以下几种协议:UNIXUNIX:UNIXUNIX系统内部协议系统内部协议系统内部协议系统内部协议INET:IPINET:IP版本版本版本版本4 4INET6:IPINET6:IP版本版本版本版本6 65UNIXUNIX系统支持多种套接字类型。系统支持多种套接字类型。系统支持多种套接字类型。系统支持多种套接字类型。套接字类型:是指创建套套接字类型:是指创建套套接字类型:是指创建套套接字类型:是指创建套接字的应用程序所希望的通信服务
6、类型。接字的应用程序所希望的通信服务类型。接字的应用程序所希望的通信服务类型。接字的应用程序所希望的通信服务类型。目前,目前,目前,目前,UNIXUNIX系统系统系统系统主要定义如下:主要定义如下:主要定义如下:主要定义如下:SOCK_STREAM:SOCK_STREAM:提供可靠的面向连接传输的数据流,保证数据在传提供可靠的面向连接传输的数据流,保证数据在传输过程中无丢失、无损坏和无冗余。输过程中无丢失、无损坏和无冗余。INETINET地址簇中的地址簇中的TCPTCP协议支持该协议支持该套接字。套接字。SOCK_DGRAM:SOCK_DGRAM:提供数据的双向传输,但不保证消息地准确到达,即
7、提供数据的双向传输,但不保证消息地准确到达,即使消息能够到达,也无法保证其顺序性,并可能有冗余或损坏。使消息能够到达,也无法保证其顺序性,并可能有冗余或损坏。INETINET地址簇中的地址簇中的UDPUDP协议支持该套接字。协议支持该套接字。SOCK_RAM:SOCK_RAM:是低于传输层的低级协议或物理网络提供的套接字类型。是低于传输层的低级协议或物理网络提供的套接字类型。它可以访问内部网络接口。例如,可以接收和发送它可以访问内部网络接口。例如,可以接收和发送ICMPICMP报。报。SOCK_SEQPACKET:SOCK_SEQPACKET:提供可靠的、双向的、顺序化的以及面向连接提供可靠的
8、、双向的、顺序化的以及面向连接的数据通信。类似于的数据通信。类似于STREAMSTREAM方式,但它的报文大小可变(最大报文方式,但它的报文大小可变(最大报文长度固定)。长度固定)。SOCK_RDM:SOCK_RDM:类似于类似于SOCK_DGRAMSOCK_DGRAM,但它可保证数据的正确到达。,但它可保证数据的正确到达。63.2 套接字地址结构套接字地址结构多数套接字函数需要一个指向地址结构的参数。多数套接字函数需要一个指向地址结构的参数。对应于不同的协议簇,有不同的地址结构。在头对应于不同的协议簇,有不同的地址结构。在头文件文件中定义了以下结构来保持中定义了以下结构来保持套接字函数调用参
9、数的一致性。套接字函数调用参数的一致性。struct sockaddrstruct sockaddr unsigned short sa_family;unsigned short sa_family;/*/*地址类型,格式为地址类型,格式为AF_XXX*/AF_XXX*/char sa_data14;char sa_data14;/*14/*14字节的协议地址字节的协议地址*/*/;其中的其中的其中的其中的sa_familysa_family为套接字的协议簇地址类型,为套接字的协议簇地址类型,为套接字的协议簇地址类型,为套接字的协议簇地址类型,TCP/IPTCP/IP的协议对的协议对的协议对
10、的协议对于于于于IPv4IPv4地址类型为地址类型为地址类型为地址类型为AF_INETAF_INET。sa_datasa_data中存储具体的协议地址,中存储具体的协议地址,中存储具体的协议地址,中存储具体的协议地址,不同的协议簇有不同的地址格式。不同的协议簇有不同的地址格式。不同的协议簇有不同的地址格式。不同的协议簇有不同的地址格式。7但一般编程中并不直接针对此数据结构操作,而是使但一般编程中并不直接针对此数据结构操作,而是使但一般编程中并不直接针对此数据结构操作,而是使但一般编程中并不直接针对此数据结构操作,而是使用另一个与用另一个与用另一个与用另一个与sockaddrsockaddr等价
11、的数据结构等价的数据结构等价的数据结构等价的数据结构sockaddr_in(sockaddr_in(在在在在netinet/in.hnetinet/in.h中定义中定义中定义中定义):struct sockaddr_instruct sockaddr_in unsigned short int sin_len;unsigned short int sin_len;/*IPv4/*IPv4地址长度地址长度地址长度地址长度*/*/short int sin_family;short int sin_family;/*/*地址类型地址类型地址类型地址类型*/*/unsigned short int
12、sin_port;unsigned short int sin_port;/*/*存储端口号存储端口号存储端口号存储端口号*/*/struct in_addr sin_addr;struct in_addr sin_addr;/*/*存储存储存储存储IPIP地址地址地址地址*/*/unsigned char sin_zero8;unsigned char sin_zero8;/*/*空字节空字节空字节空字节*/*/;在编程中大多数是使用在编程中大多数是使用在编程中大多数是使用在编程中大多数是使用sockaddr_insockaddr_in这个结构来设置这个结构来设置这个结构来设置这个结构来设置
13、/获取地址信息。获取地址信息。获取地址信息。获取地址信息。sin_familysin_family指代协议族,在指代协议族,在指代协议族,在指代协议族,在TCPTCP套接字编程中只能是套接字编程中只能是套接字编程中只能是套接字编程中只能是AF_INET;AF_INET;sin_portsin_port存储端口号(使用网络字节顺序),数据类型是一个存储端口号(使用网络字节顺序),数据类型是一个存储端口号(使用网络字节顺序),数据类型是一个存储端口号(使用网络字节顺序),数据类型是一个1616位的无符号整数类型;位的无符号整数类型;位的无符号整数类型;位的无符号整数类型;sin_addrsin_a
14、ddr存储存储IPIP地址,地址,IPIP地址使用地址使用in_addrin_addr这个数据结构:这个数据结构:struct in_addr unsigned long s_addr;struct in_addr unsigned long s_addr;这个数据结构是由于历史原因保留下来,主要用作与以前的格式兼容。这里这个数据结构是由于历史原因保留下来,主要用作与以前的格式兼容。这里的的s_addrs_addr按照网络字节顺序存储按照网络字节顺序存储IPIP地址。地址。sin_zerosin_zero是为了让是为了让是为了让是为了让sockaddrsockaddr与与与与sockaddr_
15、insockaddr_in两个数据结构保持两个数据结构保持两个数据结构保持两个数据结构保持大小相同而保留的空字节。大小相同而保留的空字节。大小相同而保留的空字节。大小相同而保留的空字节。8在在在在IPv6IPv6中套接字地址结构采用另外的定义:中套接字地址结构采用另外的定义:中套接字地址结构采用另外的定义:中套接字地址结构采用另外的定义:#DEFINE SIN6_LEN#DEFINE SIN6_LEN/*/*如果系统支持套接字地址结构中的长度成员,如果系统支持套接字地址结构中的长度成员,则此常值必须定义则此常值必须定义*/*/struct sockaddr_in6struct sockaddr
16、_in6 unsigned short int sin6_len;unsigned short int sin6_len;/*IPv6/*IPv6结构体长度结构体长度*/*/short int sin6_family;short int sin6_family;/*/*地址类型地址类型*/*/unsigned short int sin6_port;unsigned short int sin6_port;/*/*存储端口号,网络字节顺序存储端口号,网络字节顺序*/*/unsigned short int sin6_flowinfo;unsigned short int sin6_flowin
17、fo;/*/*优先级和流量标志,网络字优先级和流量标志,网络字节顺序节顺序*/*/struct in6_addr sin6_addr;struct in6_addr sin6_addr;/*IPv6/*IPv6地址,网络字节顺序地址,网络字节顺序*/*/;struct in6_addrstruct in6_addr unsigned long s6_addr;unsigned long s6_addr;/*128/*128位位IPv6IPv6地址,网络字节顺序地址,网络字节顺序*/*/;其中其中sin6_lensin6_len是一个无符号的是一个无符号的8 8位整数,表示位整数,表示12812
18、8位位IPv6IPv6地址长度;地址长度;sin6_familysin6_family是是IPv6IPv6的地址类型;结构中的成员是有序排列的,都是的地址类型;结构中的成员是有序排列的,都是6464位对齐的;位对齐的;sin6_flowinfosin6_flowinfo的的结构是:低结构是:低2424位是流量标号,然后位是流量标号,然后4 4位的优先级标志,剩下位的优先级标志,剩下4 4位保留。位保留。9qq比较比较比较比较IPv4IPv4和和和和IPv6IPv6的地址结构的地址结构的地址结构的地址结构长度长度AF_INETAF_INET1616位端口号位端口号3232位位IPv4IPv4地址
19、地址sin_zerosin_zero未用未用长度长度AF_INET6AF_INET61616位端口号位端口号3232位流量标志位流量标志128128位位IPv6IPv6地址地址 IPv4IPv4地址解构的固定长度是地址解构的固定长度是地址解构的固定长度是地址解构的固定长度是1616字节,而字节,而字节,而字节,而IPv6IPv6的地址结构的的地址结构的的地址结构的的地址结构的固定长度是固定长度是固定长度是固定长度是2424字节。字节。字节。字节。10设置地址信息的实例(设置地址信息的实例(IPv4)struct sockaddr_in mysock;struct sockaddr_in mys
20、ock;/*/*设置设置设置设置sockaddr_insockaddr_in的结的结的结的结构体变量构体变量构体变量构体变量mysock*/mysock*/mysock.sin_family=AF_INET;mysock.sin_family=AF_INET;/*TCP/*TCP地址结构地址结构地址结构地址结构*/*/mysock.sin_port=htons(3490);mysock.sin_port=htons(3490);/*short,NBO*/*short,NBO*/mysock.sin_addr.s_addr=inet_addr(“192.168.1.22mysock.sin_ad
21、dr.s_addr=inet_addr(“192.168.1.221”);1”);/*/*设置地址为设置地址为设置地址为设置地址为192.168.1.221*/192.168.1.221*/bzero(&(mysock.sin_zero),8);bzero(&(mysock.sin_zero),8);/*/*设置设置设置设置sin_zerosin_zero为为为为8 8位位位位保留字节保留字节保留字节保留字节*/*/注意:注意:注意:注意:如果如果如果如果mysock.sin_addr.s_addr=INADDR_ANY,mysock.sin_addr.s_addr=INADDR_ANY,则不
22、指则不指则不指则不指定定定定IPIP地址(用于地址(用于地址(用于地址(用于serverserver程序)。程序)。程序)。程序)。113.2.1 IP地址转换函数地址转换函数unsigned long inet_addr(const char*cp);unsigned long inet_addr(const char*cp);inet_addrinet_addr将一个点分十进制将一个点分十进制将一个点分十进制将一个点分十进制IPIP地址字符串转换成地址字符串转换成地址字符串转换成地址字符串转换成3232位数字位数字位数字位数字表示的表示的表示的表示的IPIP地址(网络字节顺序)。地址(网络
23、字节顺序)。地址(网络字节顺序)。地址(网络字节顺序)。char*inet_ntoa(struct in_addr in);char*inet_ntoa(struct in_addr in);inet_ntoainet_ntoa将一个将一个将一个将一个3232位数字表示的位数字表示的位数字表示的位数字表示的IPIP地址转换成点分十进制地址转换成点分十进制地址转换成点分十进制地址转换成点分十进制IPIP地址字符串。地址字符串。地址字符串。地址字符串。这两个函数互为反函数。这两个函数互为反函数。这两个函数互为反函数。这两个函数互为反函数。123.2.2 3.2.2 套接字地址结构与内核之间的传递套
24、接字地址结构与内核之间的传递套接字地址结构与内核之间的传递套接字地址结构与内核之间的传递当把套接字地址结构传递给套接字处理函数时,是当把套接字地址结构传递给套接字处理函数时,是当把套接字地址结构传递给套接字处理函数时,是当把套接字地址结构传递给套接字处理函数时,是通过指向结构的指针来传递的。结构的长度也作为通过指向结构的指针来传递的。结构的长度也作为通过指向结构的指针来传递的。结构的长度也作为通过指向结构的指针来传递的。结构的长度也作为参数来传递,其传递的方向可以是从进程到内核,参数来传递,其传递的方向可以是从进程到内核,参数来传递,其传递的方向可以是从进程到内核,参数来传递,其传递的方向可以
25、是从进程到内核,也可以是从内核到进程。也可以是从内核到进程。也可以是从内核到进程。也可以是从内核到进程。长度长度长度长度内核内核内核内核套接字地址结构套接字地址结构协议地址协议地址协议地址协议地址13从进程到内核传递套接字地址结构从进程到内核传递套接字地址结构 由于指针所指结构的大小都传递给内核,所以从进程到内核的数据拷由于指针所指结构的大小都传递给内核,所以从进程到内核的数据拷贝量使知道的。进行这样操作的一般有这贝量使知道的。进行这样操作的一般有这3 3个函数:个函数:bind,connectbind,connect和和sendto,sendto,它们的一个参数是指向套接字地址结构的指针,另
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 套接 编程
限制150内