当前位置: 首页 > article >正文

sockaddr结构体详解

在网络编程中,sockaddr 结构体用于表示套接字的地址信息。由于不同协议(如 IPv4、IPv6、Unix 域套接字)的地址格式不同,实际使用中通常通过以下三种变体结构来处理不同类型的地址:


1. 通用地址结构:struct sockaddr

  • 用于类型兼容性,所有具体地址结构需强制转换为此类型传递给套接字函数。
  • 字段
    struct sockaddr {sa_family_t sa_family;  // 地址族(如 AF_INET, AF_INET6, AF_UNIX)char         sa_data[14]; // 协议特定地址信息(实际不直接使用)
    };
    

2. IPv4 地址结构:struct sockaddr_in

  • 用于 IPv4 协议的地址表示。
  • 字段
    struct sockaddr_in {sa_family_t    sin_family; // 地址族(必须设为 AF_INET)in_port_t      sin_port;   // 16 位端口号(需用 `htons()` 转换字节序)struct in_addr sin_addr;   // 32 位 IPv4 地址char           sin_zero[8]; // 填充字段(通常置零)
    };struct in_addr {in_addr_t s_addr; // IPv4 地址(32 位整数,需用 `inet_pton()` 或 `htonl()` 转换)
    };
    
  • 示例
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    inet_pton(AF_INET, "192.168.1.1", &addr.sin_addr);
    memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
    

3. IPv6 地址结构:struct sockaddr_in6

  • 用于 IPv6 协议的地址表示。
  • 字段
    struct sockaddr_in6 {sa_family_t     sin6_family;   // 地址族(必须设为 AF_INET6)in_port_t       sin6_port;     // 16 位端口号(需用 `htons()` 转换)uint32_t        sin6_flowinfo; // IPv6 流信息(通常为 0)struct in6_addr sin6_addr;     // 128 位 IPv6 地址uint32_t        sin6_scope_id; // 接口范围 ID(用于链路本地地址)
    };struct in6_addr {unsigned char s6_addr[16]; // IPv6 地址(128 位)
    };
    
  • 示例
    struct sockaddr_in6 addr6;
    addr6.sin6_family = AF_INET6;
    addr6.sin6_port = htons(8080);
    inet_pton(AF_INET6, "2001:db8::1", &addr6.sin6_addr);
    

4. Unix 域套接字结构:struct sockaddr_un

  • 用于本地进程间通信(Unix Domain Socket)。
  • 字段
    struct sockaddr_un {sa_family_t sun_family;        // 地址族(必须设为 AF_UNIX 或 AF_LOCAL)char        sun_path[108];     // 文件系统路径名(需唯一且存在)
    };
    
  • 示例
    struct sockaddr_un unix_addr;
    unix_addr.sun_family = AF_UNIX;
    strncpy(unix_addr.sun_path, "/tmp/mysocket", sizeof(unix_addr.sun_path) - 1);
    

关键注意事项

  1. 类型转换:具体结构(如 sockaddr_in)在使用时需强制转换为 struct sockaddr*

    bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
    
  2. 字节序转换:IPv4/IPv6 的端口号和地址需用 htons()htonl()inet_pton() 转换网络字节序。

  3. 长度参数:传递地址结构时需指定实际长度(如 sizeof(struct sockaddr_in))。


通过这三种结构体,可以灵活处理不同协议族的网络地址,是网络编程中地址管理的核心基础。

http://www.lryc.cn/news/2383813.html

相关文章:

  • Seata源码—7.Seata TCC模式的事务处理一
  • 【语法】C++的map/set
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (3)
  • vue vite textarea标签按下Shift+Enter 换行输入,只按Enter则提交的实现思路
  • MySQL多线程备份工具mysqlpump详解!
  • 创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k
  • Redisson分布式集合原理及应用
  • 深入理解 PlaNet(Deep Planning Network):基于python从零实现
  • 精益数据分析(75/126):用户反馈的科学解读与试验驱动迭代——Rally的双向验证方法论
  • 仿腾讯会议——视频发送接收
  • 从3.7V/5V到7.4V,FP6291在应急供电智能门锁中的应用
  • java后端-海外登录(谷歌/FaceBook)
  • 【人工智障生成日记1】从零开始训练本地小语言模型
  • Selenium-Java版(frame切换/窗口切换)
  • 一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异
  • 星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态
  • SpringBoot(一)--- Maven基础
  • 基于FPGA控制电容阵列与最小反射算法的差分探头优化设计
  • kakfa 基本了解
  • 基于Browser Use + Playwright 实现AI Agent操作Web UI自动化
  • Origin绘制多因子柱状点线图
  • Web漏洞扫描服务的特点与优势:守护数字时代的安全防线
  • iOS 直播技术及优化
  • 抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案
  • 俄罗斯军总参情报局APT28组织瞄准援乌后勤供应链发起全球网络攻击
  • 杰发科技AC7801——PWM获取固定脉冲个数
  • MacBookPro上macOS安装第三方应用报错解决方案:遇到:“无法打开“XXX”,因为无法确定(验证)开发者身份?怎么解决
  • MVC和MVVM架构的区别
  • RAG(Retrieval-Augmented-Generation)检索增强生成
  • 黑马点评前端Nginx启动失败问题解决记录