Socket理解之地址族

前言

最近在看iOS核心开发手册这本书,里面有一章讲解关于网络编程基础的知识,书中的几个知识点概念理解的不是很明白,特此记录一下以供参考运用。

地址族

  • 套接口基本上可以理解为电话,有号码(地址), 可以通信。用来传输数据,也就是纯粹的数据传输,而数据的接收(理解,分析,聆听)是依靠协议完成。

  • 套接口在需要的时候创建,创建时主要需要指定的是域(domain),即所用的的地址族(AF_XXX,如AF_IRDA),类型和协议一般是固定的,SOCK_STREAM和0最常见。

  • 绑定所用的通用地址族sockaddr:

#include <sys/socket.h>

struct sockaddr {

  sa_family_t  sa_family;         /*地址族*/

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

};

sockaddr

  • 下面详细说明下sockaddr

用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP套接字开发人员的工具箱仅支持internet地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。

其定义如下:

struct sockaddr {
  unsigned short sa_family; /* address family, AF_xxx */
  char sa_data[14]; /* 14 bytes of protocol address */
  };

sa_family:是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:AF_INET,AF_INET6和AF_UNSPE。

如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。

AF_UNSPEC则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回。

通常用的都是AF_INET。

如下举例几个:

  • 本地地址族:AF_UNIX或AF_LOCAL:
#include <sys/un.h>

struct sockaddr_un {

  sa_family_t  sun_family;         /*AF_UNIX*/

  char        sun_path[108];      /*地址数据*/

};
  • 网络地址族:AF_INET:
#include <netinet/in.h>

struct sockaddr_in {

  sa_family_t    sin_family;       /* AF_INET */

  uint16_t       sin_port;         /*端口号*/

  struct in_addr   sin_addr;        /*Internet地址*/

  unsigned char   sin_zero[8]      /*占位字节*/

};
  • 红外地址类:AF_IRDA:
#include <sys/types.h>

struct sockaddr_irda {

       sa_family_t     sir_family;  /* AF_IRDA */

       u_int8_t   sir_lsap_sel;     /* LSAP selector */

       u_int32_t sir_addr;         /* Device address */

       char        sir_name[25];  /*:IrDA:TinyTP ,OBEX,etc.*/
};

sockaddr_in

其定义如下:

struct sockaddr_in {
  short int sin_family; /* Address family */
  unsigned short int sin_port; /* Port number */
  struct in_addr sin_addr; /* Internet address */
  unsigned char sin_zero[8]; /* Same size as struct sockaddr */
  };

sin_family:指代协议族,在socket编程中只能是AF_INET
  sin_port:存储端口号(使用网络字节顺序)
  sin_addr:存储IP地址,使用in_addr这个数据结构
  sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 网络模型 物理层 物理层表示的是比特流传输,通常包括串口/COM口、并行/LPT口、USB、网线接口、电话线接口;...
    秋风弄影阅读 756评论 0 2
  • socket通信原理 socket又被叫做套接字,它就像连接到两端的插座孔一样,通过建立管道,将两个不同的进程之间...
    jiodg45阅读 1,185评论 0 1
  • 简介 Socket理论 Socket工作流程 核心函数讲解 服务的如何获取客户端的信息 字符串ip和网络二进制的转...
    第八区阅读 3,588评论 0 4
  • 研究IPv6 socket编程原因: Supporting IPv6 in iOS 9 WWDC2015苹果宣布在...
    li大鹏阅读 7,393评论 7 15
  • 下午和室友聊天跟她讲起十一在青岛的经历,想起很多有趣的事情,四天四夜的旅途记忆满满。打算把它以回忆的方式写出来,作...
    巫女白饭阅读 510评论 0 3