您的位置:首页 > 运维架构 > Linux

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

2012-06-25 13:49 453 查看
书中首先介绍了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息