当前位置:首页 > > 夜夜生code


前言

socket套接字也叫伯克利套接字,是加州大学伯克利分校的研究人员在 20 世纪 80 年代早期提出的。BSD作为unix系统的一大分支,最早在BSD 4.2 Unix 内核上实现了 socket。因为它符合unix系统一切皆文件的哲学理念,方便易用,于是很快就推广开来使用了。

目前,Linux系统和window系统都已经成熟支持socket套接字。

套接字地址格式

通用套接字地址格式

struct sockaddr{ sa_family_t sa_family;  /* 地址族.  16-bit*/ char sa_data[14];   /* 具体的地址值 112-bit */ };

IPv4 套接字格式地址

struct sockaddr_in { sa_family_t sin_family; /* 地址族.  16-bit*/ in_port_t sin_port;     /* 端口口  16-bit*/ struct in_addr sin_addr;  /* 这里仅仅用作占位符,不做实际用处  */ unsigned char sin_zero[8]; };

IPv6 套接字地址格式

struct sockaddr_in6 { sa_family_t sin6_family; /* 地址族.  16-bit*/ in_port_t sin6_port;  /* 传输端口号 # 16-bit */ uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/ struct in6_addr sin6_addr;  /* IPv6地址128-bit */ uint32_t sin6_scope_id; /* IPv6域ID 32-bit */ };

从上面我们可以看到,IPv4和IPv6的套接字地址格式是不一样的,因此我们如果想要对两者进行抽象统一,就必须要构造一个通用套接字地址格式。有了统一可以操作的地址结构,那么就可以设计一套统一的接口。结合强制类型转换,也能预防内存泄露。

对于地址族,有非常多类型,这里只列举常见的几种:

  • AF_LOCAL:表示本地通信,很多人对网络通信存在误解,以为socket接口只能用在不同主机间通信,实际上它也可以用于本机进程间通信的。很多情况下,也可以写成AF_UNIX、AF_FILE

  • AF_INET:因特网使用的IPv4地址

  • AF_INET6:因特网使用的IPv6地址

注意:有时候AF_XXX也会被写成PF_XXX,这两个实际是同一个宏。

sin_port表示端口号,用来区分主机中进程 sin_addr表示ip地址,用来表示本机在网络中的编号

总结

文章重点介绍了不同类型套接字地址之间的一些区别,并对它们存在的这些区别的原因进行了讲解,再结合下面这一幅图,就能很清晰地掌握不同类型的套接字地址了,如下图:


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭