首页 > 系统相关 >linux socket地址

linux socket地址

时间:2023-10-11 20:25:59浏览次数:51  
标签:sockaddr socket family 地址 linux sa struct

socket地址:

  //socket地址其实是一个结构体,封装端口号和 IP等信息。 后面的 socket 相关的 API 需要使用到这个 socket 地址。 

  //客户端   -->   服务器(IP   、 Port)

通用 socket 地址:

  socket 网络编程接口中表示 socket 地址是结构体 sockaddr,其定义如下:(IPv4使用)

#include <bits/socket.h>
struct sockaddr
{
    sa_family_t sa_family;
    char sa_data[14];
};

typedef unsigned short int sa_family_t;//2个字节

  sa_family 成员是地址族类型(sa_family_t)的变量。地址族类型通常与协议族类型对应。常见的协议族(protocol family,也称 domain)和对应的地址族如下所示:

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

  sa_data 成员用于存放 socket 地址值。但是,不同的协议族的地址值具有不同的含义和长度,如下所示:

  由上表可知,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;

但通用的socket地址使用较为不便,因此有了 专用 socket 地址:

  很多网络编程函数诞生早于 IPv4 协议,那时候都使用的是 struct sockaddr 结构体,为了向前兼容, 现在 sockaddr 退化成了 (void*)的作用,传递一个地址给函数

  至于这个函数是 sockadd_in 还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。    

              

UNIX(了解)本地域协议族使用如下专用的socket地址结构体:

#include <sys/un.h>
struct sockaddr_un
{
    sa_family_t sin_family;
    char sun_path[108];
};

TCP/IP 协议族有  sockaddr_in  和  sockaddr_in6  两个专用的 socket 地址结构体,它们分别用于 IPv4  和  IPv6:

#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;//int类型数据 占4个字节
};

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。       

标签:sockaddr,socket,family,地址,linux,sa,struct
From: https://www.cnblogs.com/gpf1997/p/17757997.html

相关文章

  • Vmware虚拟机桥接到无线网卡,Ubuntu22.04中无法显示IPv4地址,IPv6地址可以获取,但无法上
    环境Win11电脑,Vmware17.01,Ubuntu22.04虚拟机,Windowsserver2003虚拟机问题:在使用桥接模式时,选桥接到无线网卡,Ubuntu22.04/WindowsServer2003虚拟机中无法获取IPv4地址,IPv6地址可以获取,但无法上网。解决办法:网上查了查了下,挺多人遇到这个问题,解决办法1)把桥接设置的自动,改......
  • Linux 中如何安全地抹去磁盘数据?
    哈喽大家好,我是咸鱼离过职的小伙伴都知道,离职的时候需要上交公司电脑,但是电脑里面有许多我们的个人信息(聊天记录、浏览记录等等)所以我们就需要先把这些信息都删除,确保无法恢复之后才上交即有些情况下我们不得不以一种确保无法恢复的方式从磁盘上擦除所有信息许多小伙伴可能认......
  • 软件测试|Linux三剑客之sed命令详解
    简介sed(StreamEditor)是一款流式文本编辑器,在Linux和类Unix系统中广泛使用。它的设计目的是用于对文本进行处理和转换,可以用于替换、删除、插入、打印等操作。sed命令通过逐行处理文本,允许您使用简单的命令来编辑大量文本数据。本文将详细介绍sed命令的基本用法和一些常......
  • 软件测试|Linux三剑客之grep命令详解
    简介grep是一款在Linux和类Unix系统中广泛使用的文本搜索工具。它的名字来源于GlobalRegularExpressionPrint(全局正则表达式打印),它的主要功能是根据指定的模式(正则表达式)在文本文件中搜索并打印匹配的行。grep非常强大且灵活,可以用于日志分析、文件过滤、代码搜索等多......
  • 软件测试|Linux 基础教程:创建和删除目录
    简介在Linux系统中,创建和删除目录是非常常见的操作。目录是用于组织文件和其他目录的一种结构,它们是组织文件系统的重要组成部分。本文将介绍如何在Linux系统中创建和删除目录。创建目录在Linux中,可以使用mkdir命令来创建一个新的目录。mkdir是MakeDirectory(创建目......
  • 软件测试|Linux三剑客之awk命令详解
    简介awk是一种强大的文本处理工具,在Unix和类Unix系统中广泛使用。它允许您在文本文件中进行复杂的数据处理和格式化输出。awk的名字是根据它的三位创始人Aho、Weinberger和Kernighan姓氏的首字母命名的。本文将详细介绍awk命令的基本用法和一些常见的用例。awk基本语......
  • 软件测试|Linux下Python安装配置指南
    在Linux中安装Python是一个简单而且重要的过程,因为Python是一种广泛使用的编程语言,许多系统工具和应用都依赖于它。在本文中,我将详细介绍如何在Linux系统中安装Python。请注意,在本文中,我将以Centos为例,但是这些步骤大多数也适用于其他基于RedHat的发行版。对于其他发行版,请使用......
  • linux 服务器 多网口判断网卡名字和实际网卡口顺序 对应关系
    #!/bin/bashmac_addresses=($(dmesg|grep"eth"|grep"PCIe"|awk-F'''{print$8}'))count=0formacin"${mac_addresses[@]}";do((count++))interface=$(ifconfig|grep-B4"$mac"|gr......
  • linux 安装python django pip 遇到的问题
    Python解决SSL不可用问题解决方案:首先要明白python版本需要和openssl的版本需要相对匹配的,在Python3.7之后的版本,依赖的openssl,必须要是1.1或者1.0.2之后的版本,或者安装了2.6.4之后的libressl,linux自带的openssl版本过低。1、查看liunx系统的openssl版本信息:opensslversion......
  • Unity 中国版、国际版下载地址
    中国:https://unity.cn/releases国际:https://unity.com/releases/editor/archive......