嵌入式 AF_UNIX 地址系列

原创 2013年12月02日 14:53:55

AF_UNIX 地址系列(使用 AF_UNIX 或 AF_UNIX_CCSID 地址系列的套接字)可以是面向连接的(类型 SOCK_STREAM),也可以是无连接的(类型 SOCK_DGRAM)。两种类型都很可靠,原因是没有连接两个进程的外部通信函数。

UNIX 域数据报套接字的运行方式与 UDP 数据报套接字有所不同。借助 UDP 数据报套接字,客户机程序就不必调用 bind() 函数,原因是系统会自动指定未使用的端口号。于是服务器可将数据报发送回该端口号。但是,使用 UNIX 域数据报套接字,系统不会自动指定客户机的路径名。因此,使用 UNIX 域数据报的所有客户机程序必须调用 bind() 函数。在客户机的 bind() 上指定的精确路径名就是传递至服务器的路径名。因此,如果客户机指定相对路径名(即,并非以 / 开头的全限定路径名),除非服务器以同一当前目录运行,否则它不能向客户机发送数据报。

应用程序可能对此地址系列使用的示例路径名就是 /tmp/myserver 或 servers/thatserver。借助 servers/thatserver,可使用并非全限定(未指定 /)的路径名。这表示该项在文件系统层次结构中的位置应根据当前工作目录确定。

注意:
文件系统中的路径名是启用了 NLS 的。

下图举例说明了 AF_UNIX 地址系列的客户机/服务器关系。有关将环境设置为使用 AF_UNIX 地址系列的详细信息,参见套接字编程的先决条件


在服务器和客户机 AF_UNIX 地址系列示例程序中使用的套接字事件流.

套接字事件流:使用 AF_UNIX 地址系列的服务器应用程序
示例:使用 AF_UNIX 地址系列的服务器应用程序使用以下函数调用序列:

  1. socket() 函数返回表示端点的套接字描述符。该语句还标识将对此套接字使用带有流传输(SOCK_STREAM)的 UNIX 地址系列。该函数返回表示端点的套接字描述符。还可使用 socketpair() 函数初始化 UNIX 套接字。

    AF_UNIX 或 AF_UNIX_CCSID 是支持 socketpair() 函数的唯一地址系列。socketpair() 函数返回未命名的和已连接的套接字描述符。

  2. 在创建套接字描述符之后,bind() 函数获取套接字的唯一名称。

    UNIX 域套接字的名称空间由路径名组成。当套接字程序调用 bind() 函数时,会在文件系统目录中创建一项。如果路径名已存在,则 bind() 失败。因此,UNIX 域套接字程序应总是调用 unlink() 函数以在结束时除去该目录项。

  3. listen() 允许服务器接受入局客户机连接。在此示例中,储备设置为 10。这表示系统将对 10 个入局连接请求排队,然后才开始拒绝入局请求。
  4. recv() 函数从客户机应用程序接收数据。在此示例中,我们知道客户机将发送超过 250 字节的数据。既然如此,就可以使用 SO_RCVLOWAT 套接字选项指定在所有 250 字节数据都到达之前不要唤醒 recv()
  5. send() 函数将数据回传至客户机。
  6. close() 函数关闭所有打开的套接字描述符。
  7. unlink() 函数从文件系统除去 UNIX 路径名。

套接字事件流:使用 AF_UNIX 地址系列的客户机应用程序
示例:使用 AF_UNIX 地址系列的客户机应用程序使用以下函数调用序列:

  1. socket() 函数返回表示端点的套接字描述符。该语句还标识将对此套接字使用带有流传输(SOCK_STREAM)的 UNIX 地址系列。该函数返回表示端点的套接字描述符。还可使用 socketpair() 函数初始化 UNIX 套接字。

    AF_UNIX 或 AF_UNIX_CCSID 是支持 socketpair() 函数的唯一地址系列。socketpair() 函数返回未命名的和已连接的套接字描述符。

  2. 接收到套接字描述符后,使用 connect() 函数来建立与服务器的连接。
  3. send() 函数发送指定的 250 字节数据,该数据是在服务器应用程序中使用 SO_RCVLOWAT 套接字选项指定的。
  4. recv() 函数一直循环,直到所有 250 字节数据都到达为止。
  5. close() 函数关闭所有打开的套接字描述符。

相关文章推荐

AF_UNIX 地址系列

http://www.cppblog.com/tx7do/articles/5949.html AF_UNIX 地址系列(使用 AF_UNIX 或 AF_UNIX_CCSID 地址系列的套接字)...
  • bytxl
  • bytxl
  • 2012年09月11日 08:02
  • 703

嵌入式、Linux和UNIX的认识

嵌入式、Linux和UNIX的认识 嵌入式系统的嵌入性的本质是将一个计算机嵌入到一个对象体系中去,实现对象体系的智能化控制。 嵌入式技术趋势分析:更高主频、更低功耗、超大集成度、超小体积 两大阵...

嵌入式学习之路(二)——Unix命令的学习(1)

嵌入式学习之路(二)——Unix命令的学习 笔者学习嵌入式是从学习C语言开始的,而我学C语言的系统平台是ubuntu,所以就先学习如何使用Unix命令,利用shell来交互,vi来编写程序,gcc来编...

嵌入式学习之路(五)——Unix命令学习(3)

嵌入式学习之路(五)——Unix命令学习(3) 之前前面讲了unix最基本的命令,现在我们稍微再多了解一些: 1.在linux系统中使用文件的属性决定文件可以怎么使用,文件的使用方式为读,写和...

一些linux嵌入式资源下载地址

转载:http://blog.csdn.net/jiuyueguang/article/details/9350821 linux内核源代码情景分析 非扫描版 上下册合订版 字清楚 ...
  • npjocj
  • npjocj
  • 2014年06月23日 14:19
  • 1257

嵌入式学习--step11 寄存器地址名称映射/系统时钟

1、先定义到外设基地址 #define PERIPH_BASE ((uint32_t)0x40000000) 2、定义到AHB1的外设基地址 #define AHB1PERIPH_BASE ...

嵌入式程序地址解析

转载地址:http://blog.csdn.net/linux_103/article/details/8888427搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,...

嵌入式资料地址汇总

1. 嵌入式業界新聞 2. 國內論壇及資源 ChinaUnix嵌入式開發 http://bbs.chinaunix.net/forum-225-1.html LinuxSir ...

嵌入式CPU的启动方式和启动地址

  • 2014年08月25日 14:16
  • 103KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 AF_UNIX 地址系列
举报原因:
原因补充:

(最多只允许输入30个字)