码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Windows 环境下的 Socket 编程 2 - 地址族与数据序列


    地址族

    在《Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数》这篇文章中,提到过 socket 函数,其原型为:

    /*成功返回 SOCKET 句柄,失败返回 INVALID_SOCKET*/
    SOCKET socket(int af,int type,int protocol);
    
    • 1
    • 2

    其中第一个参数 af 用于指定 SOCKET 使用的 协议族 ,常见协议族有:IPv4 协议族(PF_INET)、IPv6 协议族(PF_INET6)等。
    本节重点在于 IPv4 协议族的地址信息表示。
    bind 函数、 accept 函数、connect 函数都要求传入 struct sockaddr 类型的指针,以 bind 为例:

    /*成功返回 0 ,失败返回 SOCKET_ERROR*/
    int bind(SOCKET s,const struct sockaddr *name,int namelen);
    
    • 1
    • 2

    结构体 struct sockaddr 用于保存地址信息中需要包含的 地址族 、端口号 、IP地址 等。该结构体的声明为:

    struct sockaddr {
    	u_short	sa_family;			// 地址族
    	char	sa_data[14];		// 地址信息(端口号、IP 地址等)
    };
    
    • 1
    • 2
    • 3
    • 4

    sockaddr 用于所有协议族的地址信息,因而它的地址信息预留了 14 字节内存。
    可以看到,将端口号、IP 地址这些信息写入 sa_data 数组中十分麻烦,因为端口号是 16 位数据, IP 地址是 32 位数据,需要将它们转换成字节流。为此,对于 IPv4 协议族,就有了新的结构体 sockaddr_in :

    struct sockaddr_in {
    	short	sin_family;
    	u_short	sin_port;
    	struct in_addr	sin_addr;
    	char	sin_zero[8];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    有了这个结构体,IPv4 应用可以方便的填写端口号和 IP 地址信息。由于 IPv4 的地址信息只有端口号和 IP 地址,所以预留了 8 字节的 sin_zero 数组,IPv4 协议族并不使用,只是为了保持和结构体 sockaddr 的一致。

    让我们看一下结构体 sockaddr_in 的成员:

    • sin_family:地址族,有 IPv4 使用的地址族(AF_INET)、IPv6 使用的地址族(AF_INET6)
    • sin_port:端口号,以网络字节序保存(大端模式)
    • sin_addr:IP 地址,以网络字节序保存

    以 bind 函数为例,看一下结构体 sockaddr_in 的使用:

    struct sockaddr_in serv_addr;
    // ...
    if(bind(hServSock, (sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
        ErrorHandler("bind socket error");
    // ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    网络字节序与地址变换

  • 相关阅读:
    javaee之通用mapper
    [要素察觉]C语言六讲:函数
    公司电脑强制休眠的3种解决方案
    Nextcloud删除动态/活动日志(activity log)
    scala/java redis的cluster模式 删除固定前缀的key
    山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十四)- 微服务(4)
    lvgl页面管理 简单实现
    vue_router__WEBPACK_IMPORTED_MODULE_7__.default.push is not a function 错误的解决
    JavaWeb之jQuery
    iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)
  • 原文地址:https://blog.csdn.net/zhzht19861011/article/details/126353369
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号