- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 高级套接字 前面几章内容对通用的UDP、TCP的程序设计方法进行了介绍,本章介绍高级套接字的编程。包含UNIX域的函数、广播、多播、数据链路层的程序设计等在Linux网络程序设计中比较常用的方法,主要有如下内容。 UNIX编程:介绍AF_UNIX协议族类型,特别是结构struct sockaddr_un、编程方法。 广播的知识:介绍广播的概念、如何进行广播的编程及一个简单的例子。 多播的知识:介绍多播的概念和多播的地址,并介绍多播的客户端和服务器的编程实例。 数据链路层的访问:介绍SOCK_PACKET协议类型,如何获得从数据链路层到应用层的数据。 11.1 UNIX域函数 UNIX域的协议族是在同一台主机上的客户/服务器通信时使用的一种方法。相对其他方法(例如进程间通信的管道),它在形式上与传统套接字API的调用方法相同。UNIX域有两种类型的套接字:字节流套接字和数据报套接字,字节流套接字类似于TCP,数据报套接字类似于UDP。UNIX域的套接字有如下的特点值得注意。 UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。 UNIX域套接字可以在同一台主机上各进程之间传递描述符。 UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述。 11.1.1 UNIX域函数的地址结构 UNIX域的地址结构在文件linux/un.h中定义,结构的原型如下: #define UNIX_PATH_MAX 108 struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX协议族名称 */ char sun_path[UNIX_PATH_MAX]; /* 路径名 */ }; UNIX域地址结构成员变量sun_family的值是AF_UNIX或者AF_LOCAL。 sun_path是一个路径名,此路径名的属性为0777,可以进行读写等操作。 结构sockaddr_un的长度使用宏SUN_LEN定义,默认大小为108,SUN_LEN宏的定义如下: # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)-sun_path) \ + strlen ((ptr)-sun_path)) 11.1.2 套接字函数 UNIX域的套接字函数和以太网套接字(AF_INET)的函数相同,但是当用于UNIX域套接字时,套接字函数有一些差别和限制,主要有如下几条。 使用函数bind()进行套接字和地址的绑定的时候,地址结构中的路径名和路径名所表示的文件的默认访问权限为0777,即用户、用户所属的组和其他组的用户都能读、写和执行。 11.1.3 使用UNIX域函数进行套接字编程 使用UNIX域函数进行套接字编程与AF_INET的方式一致,不同的地方在于地址结构不同。 11.1.4 传递文件描述符 Linux系统中提供了一种特殊的方法,可以从一个进程中将一个已经打开的文件描述符传递给其他的任何进程。其基本过程如下: (1)创建一个字节流或者数据报的UNIX域套接字。 (2)进程可以用任何返回描述符的UNIX函数打开一个描述符: (3)发送进程建立一个msghdr结构,其中包含要传递的描述符。 (4)接收进程调用recvmsg()在UNIX域套接字上接收套接字。 11.1.5 socketpair()函数 函数socketpair()建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。 函数socketpair()的原型如下,第一个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;第二个参数type,表示类型,只能为0。第三个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。 #include sys/types.h #include sys/socket.h int socketpair(int d, int type, int protocol, int sv[2]); 11.1.5 socketpair()函数 11.1.6 传递文件描述符的例子 本节中使用一个实例来介绍进程间传递文件描述符的例子。分为两个进程,进程A中打开一个文件描述符,通过消息传送的方式将文件描述符传递给进程B。 1.进程A的代码 2.进程B的代码 11.2
文档评论(0)