学习笔记《实战Linux Socket编程》第四章套接口类型与协议

第四章  套接口的类型与协议
4.1指定套接口的域
在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.
这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
**建议:对于socketpair与socket的domain参数,使用PF_LOCAL系列,而在初始化套接口地址结构时,则使用AF_LOCAL.
例如:
     z = socket(PF_LOCAL, SOCK_STREAM, 0);
     adr_unix.sin_family = AF_LOCAL;
 
4.3选择套接口
在函数socketpair与socket中选择代表协议族的参数domain:
-PF_LOCAL:表明指定的协议族是本地UNIX协议族
-PF_INET:表明指定的是Internet协议族
在函数socketpair与socket中type的参数:
-SOCK_STREAM:常用
-SOCK_DGRAM:常用
-SOCK_SEQPACKET:X.25,AX.25使用
-SOCK_RW:表示编程者要一个原始(raw)套接口界面.可以对通信和分组进行更直接的控制,但它要编程式者对协议和底层分组结构非常熟悉.本书没有介绍.略.....
 
4.3.1 SOCK_STREAM套接口
    套接口中的流与UNIX中管道的概念相近.
    字节流中没有分界线,也没有边界;没有记录的长度工块的大小,在接收端也不存在分组的概念,在接收端获得的所有数据都返回到调用者的缓冲区中.
    例如:
        1)本地进程写入25字节数据,通过套接口发到远程进程
        2)本地进程再写30字节数据,发出.
        3)远程进程从套接口接收数据,共收到本地进程在1)和2)中发送的55字节.
    另一重要性质:有序性
 
    SOCK_STREAM 套接口
        1)不保留消息边界:接收端无法知道发送端发送数据时共执行了几次write
        2)保证接收数据字节与发送时顺序一致
        3)保证写入的数据在接收端被无错接收
 
4.3.2 SOCK_DGRAM
    当我们不需要数据传输的绝对有序性时和有需要数据传输的可靠性时,可以考虑使用SOCK_DGRAM.
    特性:
    1)分组发送后,可能无序的到达接收端。
    2)分组可以可能发生丢失。
    3)数据报分组有尺寸的大小限制,如果超出,可能会无法传送。
    4)分组可以在不建立连接的情况下被发送到远程进程,这就允许本地进程每次将消息发送给不同IP地址上的同样的端口。

4.3.3 SOCK_SEQPACKET
    本套接口对于X.25和AX.25协议非常重要,它与SOCK_STREAM的差别:SOCK_STERAM不保留消息边界,而SOCK_SEQPACKET保留.
    特性:
    1)保留消息边界
    2)数据字节的接收顺序与发送顺序一致
    3)保证发送数据字节被无错地传送到接收端
    4)数据是通过一对连接的套接口进行传送的
 
============================================
注意:不是每个协议族都可以使用所有的套接口类型,如:PF_INET协议族支持SOCK_STREAM类型,但不支持SOCK_SEQPACKET类型,对于PF_X25协议族则相反,支持SOCK_SEQPACKET类型,但不支持SOCK_STREAM类型
============================================
 
4.4 选择协议
 
  域(Domain)  套接口类型(socket type)    协议(Protocol)      描述(Description)
PF_LOCAL      SOCK_STREAM                0                   本地流套接口
PF_LOCAL      SOCK_DGRAM                 0                   本地数据报套接口
PF_INET       SOCK_STREAM                0或IPPROTO_TCP      TCP/IP流套接口
PF_INET       SOCK_DGRAM                 0或IPPROTO_UDP      UDP数据报套接口
 
4.6 linux支持的协议
 
socket()参数
域(Domain)    套接口类型(Socket Type)    描述
PF_LOCAL      SOCK_STREAM                本地主机上提供面向流的套接口.该服务是一各面向连接的可靠有序的服务.注意:PF_UNIX=PF_LOCAL
PF_LOCAL      SOCK_DGRAM                 在本地主机上提供数据服务.该服务是一种可靠的非连接的服务,但在内核缓冲耗尽时也可能会发生分组丢失
PF_INET       SOCK_STREAM                为面向Internet连接套接口提供流I/O服务.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET       SOCK_DGRAM                 为面向Internet连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_INET6      SOCK_STREAM                为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的
PF_INET6      SOCK_SEQPACKET             为面向IPv6连接套接口提供流I/O服务,.这种组合表明所使用的是TCP/IP协议,因此是可靠,有序的,且保留了消息的边界
PF_INET6      SOCK_DGRAM                 为面向IPv6连接套接口提供数据报I/O服务,这中组合表明所使用的是UDP协议,因此是不可靠的
PF_X25        SOCK_DGRAM  (????)         为X.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25       SOCK_STREAM                为AX.25协议提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的,且保留了消息边界
PF_AX25       SOCK_DGRAM                 为面向AX.25连接套接口提供数据报I/O服务,是不可靠的
PF_APPLETALK  SOCK_DGRAM  (????)         为AppleTalk的套接口提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的
PF_APPLETALK  SOCK_STREAM                是一个扩展
PF_ECONET     SOCK_DGRAM                 Acorn Econet和AUN协议的实现
PF_IPX        SOCK_STREAM                IPX协议,流套接口
PF_IPX        SOCK_DGRAM                 IPX协议,数据报套接口
PF_IPX        SOCK_SEQPACKET             IPX协议,有序分组套接口
PF_IRDA       SOCK_STREAM                支持IrDA子系统,使用流套接口(红外线通信)
PF_IRDA       SOCK_SEQPACKET             支持IrDA子系统,使用保留消息边界的流套接口(红外线通信)
PF_NETROM     SOCK_SEQPACKET             业余无线电NetROM协议
PF_ROSE       SOCK_SEQPACKET             业余无线电X.25PLP协议
 
===========================================
上面带问号的是我不明白的:SOCK_DGRAM  ->  提供流I/O服务,该服务是一种面向连接的服务,是可靠的,有序的(????) 不明白
===========================================
 
    有关协议族的一些宏定义在下面的头文件中
    #include <sys/socket.h>
    实际上这个文件包含了另外一个定义协议宏常量:
    /usr/include/bits/socket.h
 
/* Protocol families.  */
#define    PF_UNSPEC    0    /* Unspecified.  */
#define    PF_LOCAL    1    /* Local to host (pipes and file-domain).  */
#define    PF_UNIX        PF_LOCAL /* Old BSD name for PF_LOCAL.  */
#define    PF_FILE        PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
#define    PF_INET        2    /* IP protocol family.  */
#define    PF_AX25        3    /* Amateur Radio AX.25.  */
#define    PF_IPX        4    /* Novell Internet Protocol.  */
#define    PF_APPLETALK    5    /* Appletalk DDP.  */
#define    PF_NETROM    6    /* Amateur radio NetROM.  */
#define    PF_BRIDGE    7    /* Multiprotocol bridge.  */
#define    PF_ATMPVC    8    /* ATM PVCs.  */
#define    PF_X25        9    /* Reserved for X.25 project.  */
#define    PF_INET6    10    /* IP version 6.  */
#define    PF_ROSE        11    /* Amateur Radio X.25 PLP.  */
#define    PF_DECnet    12    /* Reserved for DECnet project.  */
#define    PF_NETBEUI    13    /* Reserved for 802.2LLC project.  */
#define    PF_SECURITY    14    /* Security callback pseudo AF.  */
#define    PF_KEY        15    /* PF_KEY key management API.  */
#define    PF_NETLINK    16
#define    PF_ROUTE    PF_NETLINK /* Alias to emulate 4.4BSD.  */
#define    PF_PACKET    17    /* Packet family.  */
#define    PF_ASH        18    /* Ash.  */
#define    PF_ECONET    19    /* Acorn Econet.  */
#define    PF_ATMSVC    20    /* ATM SVCs.  */
#define    PF_SNA        22    /* Linux SNA Project */
#define    PF_IRDA        23    /* IRDA sockets.  */
#define    PF_PPPOX    24    /* PPPoX sockets.  */
#define    PF_WANPIPE    25    /* Wanpipe API sockets.  */
#define    PF_BLUETOOTH    31    /* Bluetooth sockets.  */
#define    PF_MAX        32    /* For now..  */
 
/* Address families.  */
#define    AF_UNSPEC    PF_UNSPEC
#define    AF_LOCAL    PF_LOCAL
#define    AF_UNIX        PF_UNIX
#define    AF_FILE        PF_FILE
#define    AF_INET        PF_INET
#define    AF_AX25        PF_AX25
#define    AF_IPX        PF_IPX
#define    AF_APPLETALK    PF_APPLETALK
#define    AF_NETROM    PF_NETROM
#define    AF_BRIDGE    PF_BRIDGE
#define    AF_ATMPVC    PF_ATMPVC
#define    AF_X25        PF_X25
#define    AF_INET6    PF_INET6
#define    AF_ROSE        PF_ROSE
#define    AF_DECnet    PF_DECnet
#define    AF_NETBEUI    PF_NETBEUI
#define    AF_SECURITY    PF_SECURITY
#define    AF_KEY        PF_KEY
#define    AF_NETLINK    PF_NETLINK
#define    AF_ROUTE    PF_ROUTE
#define    AF_PACKET    PF_PACKET
#define    AF_ASH        PF_ASH
#define    AF_ECONET    PF_ECONET
#define    AF_ATMSVC    PF_ATMSVC
#define    AF_SNA        PF_SNA
#define    AF_IRDA        PF_IRDA
#define    AF_PPPOX    PF_PPPOX
#define    AF_WANPIPE    PF_WANPIPE
#define    AF_BLUETOOTH    PF_BLUETOOTH
#define    AF_MAX        PF_MAX
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值