4.11、socket地址

  • 1.通用 socket 地址
  • 2.专用socket地址

1.通用 socket 地址

  • socket 网络编程接口中表示 socket 地址的是结构体 sockaddr,其定义如下:
// socket地址其实是一个结构体,封装端口号和IP等信息。后面的socket相关的api中需要使用到这个socket地址。
// 客户端 -> 服务器(IP, Port)#include <bits/socket.h>
struct sockaddr {sa_family_t sa_family;char sa_data[14];
};
typedef unsigned short int sa_family_t;
  • sa_family 成员是地址族类型(sa_family_t)的变量。地址族类型通常与协议族类型对应。常见的协议族(protocol family,也称 domain)和对应的地址族入下所示:
协议族 地址族 描述
PF_UNIX AF_UNIX UNIX本地域协议族
PF_INET AF_INET TCP/IPv4协议族
PF_INET6 AF_INET6 TCP/IPv6协议族

PF_*AF_* 都定义在bits/socket.h头文件中,且后者与前者有完全相同的值,所以二者通常混用。

  • sa_data 成员用于存放 socket 地址值。但是,不同的协议族的地址值具有不同的含义和长度,如下所示:
协议族 地址值含义和长度
PF_UNIX 文件的路径名,长度可达到108字节
PF_INET 16 bit 端口号和 32 bit IPv4 地址,共 6 字节
PF_INET6 16 bit 端口号,32 bit 流标识,128 bit IPv6 地址,32 bit 范围 ID,共 26 字节
  • 由上表可知,14 字节的 sa_data 根本无法容纳多数协议族的地址值。因此,Linux 定义了下面这个新的通用的 socket 地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。
#include <bits/socket.h>
struct sockaddr_storage
{sa_family_t sa_family;unsigned long int __ss_align;char __ss_padding[ 128 - sizeof(__ss_align) ];
};
typedef unsigned short int sa_family_t;

2.专用socket地址

  • 很多网络编程函数诞生早于 IPv4 协议,那时候都使用的是 struct sockaddr 结构体,为了向前兼容,现在sockaddr 退化成了(void *)的作用,传递一个地址给函数,至于这个函数是 sockaddr_in 还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。
  • UNIX 本地域协议族使用如下专用的 socket 地址结构体:
#include <sys/un.h>
struct sockaddr_un
{sa_family_t sin_family;char sun_path[108];
};
  • TCP/IP 协议族有 sockaddr_insockaddr_in6 两个专用的 socket 地址结构体,它们分别用于 IPv4IPv6
#include <netinet/in.h>
struct sockaddr_in
{sa_family_t sin_family; /* __SOCKADDR_COMMON(sin_) */in_port_t sin_port; /* Port number. */struct in_addr sin_addr; /* Internet address. *//* Pad to size of `struct sockaddr'. */unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)];
};struct in_addr
{in_addr_t s_addr;
};struct sockaddr_in6
{sa_family_t sin6_family;in_port_t sin6_port; /* Transport layer port # */uint32_t sin6_flowinfo; /* IPv6 flow information */struct in6_addr sin6_addr; /* IPv6 address */uint32_t sin6_scope_id; /* IPv6 scope-id */
};
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))

所有专用 socket 地址(以及 sockaddr_storage)类型的变量在实际使用时都需要转化为通用 socket 地址类型 sockaddr(强制转化即可),因为所有 socket 编程接口使用的地址参数类型都是 sockaddr

4.11、socket地址相关推荐

  1. loadrunner 11 下载地址

    1.下载地址:http://www.genilogix.com/downloads/loadrunner/loadrunner-11.iso 或http://219.239.26.11/downloa ...

  2. linux网络编程Internet Socket地址,套接字,和函数

    文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...

  3. linux 高性能读书笔记之通用socket地址

    ####socket网络编程接口 socket的地址是结构体sockaddr 代码如下 struct sockaddr{ sa_family_t sa_family; char sa_data[14] ...

  4. socket地址API

    主机字节序和网络字节序 现代CPU的累加器一次都能装载 (至少) 4字节(这里考虑32位机,下同),即-一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数的值.这就是字节序问题.字节 ...

  5. 网络协议 11 - Socket 编程(下):眼见为实耳听为虚

    网络协议 11 - Socket 编程(下):眼见为实耳听为虚 原文:网络协议 11 - Socket 编程(下):眼见为实耳听为虚 系列文章传送门: 网络协议 1 - 概述 网络协议 2 - IP ...

  6. 【Linux】socket地址、IP地址、Port端口转换

    文章目录 (一)通用socket地址 (1)struct sockaddr (2)struct sockaddr_storage (二)专用socket地址 (1) UNIX本地域协议族的socket ...

  7. 一文了解websocket全双工通信java实现socket地址404问题解决

    websocket介绍 1.websocket介绍 1.1注解介绍 2.demo 2.1 后端代码 2.2 前端代码 2.3 效果 附录:socket地址404问题解决 1.websocket介绍 W ...

  8. Linux内核网络协议栈6-socket地址绑定(2)

    三.根据不同的协议来完成绑定   上面代码中的第3步是根据应用程序在创建socket时传递到内核的协议域及socket类型来决定调用采用哪个方法,具体可以参考   创建socket  一文,这里不再赘 ...

  9. Linux内核网络协议栈5-socket地址绑定

    一.socket绑定入口 1.示例代码 struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_a ...

最新文章

  1. Android Studio 设置git 提交代码
  2. C语言中浮点型在计算机中的存储
  3. java问题:错误: 找不到或无法加载主类 HelloWorld
  4. 一些C++的开源项目和C++库以及修炼C++的方法
  5. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  6. 值得借鉴的30条好习惯
  7. linux 视频编辑 ffmpeg,ffmpeg转码视频真的好用!(ffmpeg的简单使用方法)
  8. SQL Server检索存储过程的结果集
  9. MPU:鸿蒙轻内核的任务栈的溢出检察官
  10. Mycat监控_监控平台安装Mycat-web_作为配置中心注册发现用---MyCat分布式数据库集群架构工作笔记0037
  11. 微服务架构下的数据一致性:概念及相关模式
  12. python笔记23-unittest单元测试之mock
  13. RF修改服务器设置,3-RF服务端程序安装手册V1.0(7页)-原创力文档
  14. msn 邮箱服务器,MSN邮箱的POP怎么设置?
  15. 方波信号的上升沿与带宽
  16. LightOJ 1336
  17. tf.data.Dataset介绍1-from_tensor_slices
  18. 通过百度BAE搭建微信二次开发的服务(2)
  19. Designing an Encoder for StyleGAN Image Manipulation论文解读
  20. Selector空轮询

热门文章

  1. 怎么解决out of START_ARRAY token
  2. linux系统找不到共享文件夹
  3. 运用R语言(ggplot2包)绘制箱式图
  4. HHDEBC与其他主流软件SQL格式化功能的对比
  5. 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。
  6. WAP网站的建设心得
  7. 共享服务器文件卷影恢复,Win2008下巧用卷影副本 实现按需恢复
  8. 基于希克斯需求价格弹性计算_尼科尔森《微观经济的理论-基本原理与扩展》(第9版)课后习题详解(第5章 收入效应和替代效应).doc...
  9. 经济管理 第2章 微观市场机制分析
  10. ps入门 工具的使用