Linux Socket Programming by Example-第四章 确定Socket Domain

书中首先介绍了AF与PF的历史由来。
AF 表示ADDRESS FAMILY 地址族
PF 表示PROTOCL FAMILY 协议族

通常Window/Linux系统以下宏是等价的。
AF_UNIX=AF_LOCAL=PF_UNIX=PF_LOCAL=AF_LOCAL=PF_LOCAL
AF_INET=PF_INET

但在某些Unix/Linux系统可能有一些细微差别。
对于BSD系统,是AF,对于POSIX系统是PF。

为了兼容性,推荐如下使用:
对于socketpair与socket的domain参数,使用PF_LOCAL系列,
而在初始化套接口地址结构时,则使用AF_LOCAL.
例如:
int z; /* Status Code */
int sp[2]; /* Socket Pair */
struct sockaddr_un adr_unix; /* AF_LOCAL */

z = socketpair (PF_LOCAL,SOCK_STREAM,0,sp);
. . .
adr_unix.sun_family = AF_LOCAL;

接下来,重点介绍了Domain与Protocol的各种组合使用。
SOCK_STREAM: 基于网络流的I/O,对应TCP协议。
特点:
 不知道什么时候读写开始/结束
 底层保证数据传输的正确性(包括数据大写与发送顺序的正确性)
 基于连接的Socket通信

SOCK_DGRAM:基于数据包的I/O,对应UDP协议
特点:
  派发出去的包接收端不能保证派发顺序
  派发出去的包可能丢失
  包大小有限制

SOCK_SEQPACKET: 用于X.25
特点:
    发送端的包大小被记录,接收端会按同样大小接收。
    包的发送顺序在接收段保持不变。
    基于连接的Socket通信  

    比如:发送端发送了2条消息,大小分别为25和30。
    则接收端也依次收到2条消息,大小分别为25和30。

SOCK_RAW:由于基于底层协议进行编程,书中不作介绍。

常见组合:
PF_LOCAL SOCK_STREAM
PF_LOCAL SOCK_DGRAM
PF_INET SOCK_STREAM
PF_INET SOCK_DGRAM
PF_INET6 SOCK_STREAM
PF_INET6 SOCK_SEQPACKET
PF_INET6 SOCK_DGRAM


你可能感兴趣的:(Linux Socket Programming by Example-第四章 确定Socket Domain)