Linux C中sockaddr和sockaddr_in的区别

 更新时间:2017年07月05日 10:50:06   投稿:lqh  
这篇文章主要介绍了Linux C中sockaddr和sockaddr_in的区别的相关资料,需要的朋友可以参考下

Linux C中sockaddr和sockaddr_in的区别

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。

网络中的地址包含3个方面的属性:

1 地址类型: ipv4还是ipv6
2 ip地址
3 端口

相应的,头文件有如下定义:

include <netinet/in.h> 
 
struct sockaddr { 
  unsigned short  sa_family;  // 2 bytes address family, AF_xxx 
  char       sa_data[14];   // 14 bytes of protocol address 
}; 
 
// IPv4 AF_INET sockets: 
 
struct sockaddr_in { 
  short      sin_family;    // 2 bytes e.g. AF_INET, AF_INET6 
  unsigned short  sin_port;  // 2 bytes e.g. htons(3490) 
  struct in_addr  sin_addr;   // 4 bytes see struct in_addr, below 
  char       sin_zero[8];   // 8 bytes zero this if you want to 
}; 
 
struct in_addr { 
  unsigned long s_addr;     // 4 bytes load with inet_pton() 
}; 

注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:

sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。

sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的

程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。 

一般的用法为:

程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数

网络编程中一段典型的代码为:

int sockfd; 
struct sockaddr_in servaddr; 
 
sockfd = Socket(AF_INET, SOCK_STREAM, 0); 
 
/* 填充struct sockaddr_in */ 
bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(SERV_PORT); 
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); 
 
/* 强制转换成struct sockaddr */ 
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); 
  



感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Git 创建分支提交远程分支详解

    Git 创建分支提交远程分支详解

    这篇文章主要介绍了Git 创建分支提交远程分支详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Shell位置变量&预定义变量的实现

    Shell位置变量&预定义变量的实现

    Shell位置变量和预定义变量是Shell脚本编程中非常重要的概念,本文主要介绍了Shell位置变量&预定义变量的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • win10下如何运行.sh文件的实现步骤

    win10下如何运行.sh文件的实现步骤

    这篇文章主要介绍了win10下如何运行.sh文件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 利用shell获取指定日期前N天的日期

    利用shell获取指定日期前N天的日期

    最近因为项目的需要对比2015年10月的数据,因为一年来的数据经过了很多次调整和处理,遇到的最直接的问题是很多数据需要重新计算。只好写脚本刷数据。在准备脚本的过程中,就需要根据给定的日期处理数据,所以就有了这篇文章,下面有需要的朋友们一起学习学习。
    2016-11-11
  • 又拍云存储同步脚本

    又拍云存储同步脚本

    为了可以自动把网站上的css、js以及图片等静态资源放在又拍云存储上,访问速度明显提高不少,下面简单介绍下实现步骤,需要的朋友可以参考下
    2013-11-11
  • Shell脚本对比两个文本文件找出不同行的2个方法分享

    Shell脚本对比两个文本文件找出不同行的2个方法分享

    这篇文章主要介绍了Shell脚本对比两个文本文件找出不同行的2个方法分享,本文分别使用comm命令法、grep命令法实现,需要的朋友可以参考下
    2014-12-12
  • Obsidian斜杠命令用法详解

    Obsidian斜杠命令用法详解

    这篇文章主要介绍了终于定制出顺手的Obsidian斜杠命令,利用斜杠命令 + 命令面板置顶 + Quick Add插入内容 + Quick Add别名命令,就可以根据自己习惯,实现定制化的斜杠命令,需要的朋友可以参考下
    2022-12-12
  • shell脚本自动检测网络掉线和自动重连

    shell脚本自动检测网络掉线和自动重连

    这篇文章主要介绍了shell脚本自动检测网络掉线和自动重连,这篇文章介绍的是自动检测连接网络的解决方法,需要的朋友可以参考下
    2019-12-12
  • Shell脚本实现复制文件到多台服务器的代码分享

    Shell脚本实现复制文件到多台服务器的代码分享

    这篇文章主要介绍了Shell脚本实现复制文件到多台服务器的代码分享,用在多机集群环境中非常方便,需要的朋友可以参考下
    2014-09-09
  • Bash技巧:把变量赋值为换行符(判断文件是否以换行符结尾)

    Bash技巧:把变量赋值为换行符(判断文件是否以换行符结尾)

    这篇文章主要介绍了Bash技巧:把变量赋值为换行符,判断文件是否以换行符结尾,需要的朋友可以参考下
    2020-08-08

最新评论