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

网络编程--sockaddr 与 sockaddr_in

From: http://www.it165.NET/pro/html/201211/4066.html

在初学的时候对二者甚是迷茫一会就晕了
在这里总结一句话:

struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。在实际编程中这个结构体会被一个struct sockaddr_in所填充。

sockaddr 在bind的man手册中提到

      struct sockaddr {
           sa_family_t sa_family;    //所选协议族AF_INET
           char        sa_data[14];    //ip地址及端口号
       }

而sockaddr_in

  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;             /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */

    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
  };

虽然是两个结构体可是二者的占用的内存是一致的,因此可以互相转化。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。

而sockaddr_in 一般是储存地址和端口的。用于信息的显示及存储使用

例如:

struct sockaddr_in addr_server;

addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(RPORT);
addr_server.sin_addr.s_addr = inet_addr(RHOST);

然而,在类似于bind accept的函数中

ret = bind(fd_sock, (struct sockaddr *)&addr_server, 
        sizeof(addr_server));
if(ret < 0){
    perror("bind");
    return -1;
}

之前只是这样的记下来了,可是知道一天,想显示所连接的客户端的ip地址的时候,就发现了问题所在

char *inet_ntoa(struct in_addr in);

函数原型是这样的,可是在

struct in_addr
{
    in_addr_t s_addr;
};

这个in_addr是sockaddr_in的一个mamber

    fd_connection = accept(fd_sock, 
        (struct sockaddr *)&addr_client, &addr_client_len);
    if(fd_connection < 0){
        perror("accept");
        return -1;
    }
    printf("connected! : %d
", fd_connection);

    printf("%s%s
", "the client ip is :",
        inet_ntoa(addr_client.sin_addr));

相关文章:

  • HashMap底层分析
  • 《工程伦理与学术道德》之《导论》
  • VGLUT 1抗体丨SYSY VGLUT 1抗体化学性质和文献参考
  • 598. 范围求和 II (脑筋急转弯)
  • 【云存储】大容量网盘的介绍与选择
  • openEuler-22.03系统安装openGauss3.0.0 企业版过程中遇到的坑
  • Vue组件、slot介绍
  • 网络编程之POP3协议邮箱收信
  • Markdown 数学公式详解
  • 无人机FCC测试报告标准需要提供的材料
  • kafka connector
  • Python下载安装教程Python3.7版本
  • 技术分享 | 数据持久化技术(Java)
  • VS code创建Vue项目 方法1:create+项目
  • 互融云工业品电商系统开发整体解决方案 助力行业数字信息化发展
  • Apache Pulsar 2.1 重磅发布
  • CSS相对定位
  • ES10 特性的完整指南
  • Git初体验
  • in typeof instanceof ===这些运算符有什么作用
  • java中的hashCode
  • Joomla 2.x, 3.x useful code cheatsheet
  • js写一个简单的选项卡
  • 解析带emoji和链接的聊天系统消息
  • 理清楚Vue的结构
  • 浏览器缓存机制分析
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用 @font-face
  • 微服务核心架构梳理
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个完整Java Web项目背后的密码
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • # 安徽锐锋科技IDMS系统简介
  • (3)nginx 配置(nginx.conf)
  • (Java数据结构)ArrayList
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第一天)包装对象、作用域、创建对象
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十五)使用Nexus创建Maven私服
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***详解账号泄露:全球约1亿用户已泄露
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • ??javascript里的变量问题
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • []常用AT命令解释()
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会