linux socket学习笔记(第二章)

本文介绍了Linux套接字编程中的域(domain)和地址族概念,以电话作为比喻,解释了套接字如何通过特定地址进行标识。文章详细阐述了socketpair函数、AF_LOCAL和AF_INET地址族的使用,并解析了sockaddr_un和sockaddr_in结构体,强调了网络字节序在不同体系结构中的重要性以及相关的字节序转换函数。

域和地址族

 

 

 

    有一个很恰当的比喻说明套接口编程,套接口就好比电话,而电话网中的电话号码就好像套接口地址。说明套接口可以用特定的地址来标示自己。并不是所有的套接口都需要地址,比如无名套接口就不需要地址,例如函数socketpair(2)就生成了一对互相可以连接但是却没有地址的套接口。书中比喻说就好像是冷战时期苏联和美国之间的热线电话一样,直接相连,不需要电话号码。

    域(domain),在socket中,不仅可以支持TCP/IP协议,也可以支持其他协议,socket中的参数domain的作用正在于此。回顾一下socketpair(2)函数的语法可以看到。


    #include <sys/types.h>

    #include <sysy/socket.h>

   

    int socketpair( int domain , int type , int protocol , int sv[2] );


 

 

    在socketpair(2)函数中,domain参数要么是AF_LOCAL,要么是AF_UNIX. 其实他们是等价的。AF_LOCAL的前缀AF表示地址族(address family),domain参数的用途就是说明函数是采用哪个地址族。之后还会出现PF_的宏,现在可以暂时认为是等价的。

 

    AF_LOCAL表示使用本地地址规则来生成地址,AF_INET表示使用IP地址规则来生成地址。BSD的解决方案提供了一种通用的地址结构如下:


    #include <sys/socket.h>

   

    struct sockaddr{

        sa_family_t sa_family ;         /* 地址族 */

        char  sa_data[14] ;               /* 地址数据 */

    };


    对于编程者来说,通用套接口本身没有什么用处,但是它为其他地址结构提供了一个重要的参考模型,比如所有的地址都要在结构中的同样位置定义sa_family成员,因为他决定了怎么翻译结构中包含地址信息的字节。

 

    生成本地地址AF_LOCAL或者AF_UNIX的地址的结构名是sockaddr_un.

    在Linux中,使用最普遍的地址族是AF_INET.具有IPv4套接口地址的套接口可以与TCP/IP上的其他主机进行通信。一下是C语言描述的结构sockaddr_in


    #include <netinet.h>

 

    struct sockaddr_in{

        sa_family_t     sin_family;

        uint16_t          sin_port;

        struct in_addr sin_addr;

        unsigned char sin_zero[8]; 

    };

 

    struct in_addr{

        uint32_t s_addr;

    };


    其中sin_family 初始化为AF_INET,sin_port表示TCP/IP端口号,所以必须使用网络字节,sin_addr结构中的in_addr表示IP地址,同样使用网络字节序表示,sin_zero[8]目的是以16字节的形式对齐。

 

    理解网络字节序(大端小端)

    不同的CPU的体系结构是不一样的,他们的字节序也是不一样的,但是最基本的字节序只有2种,分别是大端和小端。小端是指将低序字节存储在起始位置,大端是指将高序字节存储在起始位置。理解这一概念的原因是Inter体系结构中使用的字节是小端字节序,比如Motorola 6800体系结构使用的是大端字节序,而Internet的标准字节序时大端字节。所有通过网络传输的字节序都应该是大端,所以就存在了大小端的转换。Linux里有几个函数可以实现主机字节序和网络字节序的相互转换。同时还分成16位短整型和32位长整型。有htonl();htons();ntohl();ntohd();等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值