深入解析sockaddr和sockaddr_in:结构、区别与联系,企业画册设计营销推广
栏目:网络推广 发布时间:2025-04-01
一、 在/usr//bits/.h下,查看的结构: struct sockaddr {让 sa_ 可以反映 SOCKADDR_COMMON ;Common data: address family and length. 协议族 */ ... 深入解析sockaddr和sockaddr_in:结构、区别与联系
    一、

    在/usr//bits/.h下,查看的结构:

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs haskell"><span class="hljs-title">struct</span> sockaddr
  {
让 sa_ 可以反映 SOCKADDR_COMMON ;<span class="hljs-type">Common</span> <span class="hljs-typedef"><span class="hljs-keyword">data</span>: address <span class="hljs-keyword">family</span> and length.     协议族 */</span>
    char sa_data[<span class="hljs-number">14</span>];           /* <span class="hljs-type">Address</span> <span class="hljs-typedef"><span class="hljs-keyword">data</span>.  地址+端口号*/</span>
  };</code></pre></p>
    其缺陷在于把目标地址与端口信息给混在一起了。而它则解决了这一缺陷,把端口号和 IP 地址分别进行存储。

    二、

    在/usr///in.h下,

    查看的结构:

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs objectivec"><span class="hljs-keyword">struct</span> sockaddr_in
   {
     __SOCKADDR_COMMON (sin_);<span class="hljs-comment">常见数据包括地址族和长度。</span>
     in_port_t sin_port;                    <span class="hljs-comment">/* Port number.  16位端口号*/</span>
    <span class="hljs-keyword">struct</span> in_addr sin_addr;            <span class="hljs-comment">这是一种互联网地址,其长度为 32 位。它主要用于在网络中标识设备或节点的位置。通过 32 位的 IP 地址,可以在全球范围内唯一地确定一台计算机或其他网络设备。</span>
     <span class="hljs-comment">填充到“struct sockaddr”的大小。用于填充的是 0 字节。</span>
    <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">char</span> sin_zero[<span class="hljs-keyword">sizeof</span> (<span class="hljs-keyword">struct</span> sockaddr) -
                            __SOCKADDR_COMMON_SIZE -
                            <span class="hljs-keyword">sizeof</span> (in_port_t) -
                           <span class="hljs-keyword">sizeof</span> (<span class="hljs-keyword">struct</span> in_addr)];
   };
<span class="hljs-keyword">typedef</span> uint32_t in_addr_t;
<span class="hljs-keyword">struct</span> in_addr
{
     in_addr_t s_addr;       <span class="hljs-comment">//32位IPV4地址</span>
  };
<span class="hljs-comment">/* Ditto, for IPv6.  */</span>
<span class="hljs-keyword">struct</span> sockaddr_in6
   {
    __SOCKADDR_COMMON (sin6_);
     in_port_t sin6_port;        <span class="hljs-comment">/* Transport layer port # */</span>
    uint32_t sin6_flowinfo;     <span class="hljs-comment">/* IPv6 flow information */</span>
     <span class="hljs-keyword">struct</span> in6_addr sin6_addr;  <span class="hljs-comment">/* IPv6 address */</span>                          
   uint32_t sin6_scope_id;     <span class="hljs-comment">/* IPv6 scope-id */</span>
   };</code></pre></p>
    三、两者之间的区别与联系

    我们来看一下与的结构:

    二者占用的内存大小是相同的,所以能够互相转化,从这个意义来看,它们没有区别。

    区别:常用于 bind 等函数的参数,其作用是指明地址信息,并且它是一种通用的套接字地址。

    它是环境下套接字的地址形式。因此在网络编程里我们要对结构体进行操作。通过它来构建所需的信息,最后进行类型转化就可以达成目的。

    举个简单的例子:

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs cpp"><span class="hljs-keyword">int</span> main()
{
     <span class="hljs-keyword">int</span>sock 被创建,其使用的地址族为 AF_INET,套接字类型为 SOCK_STREAM,具体创建方式为 socket(AF_INET, SOCK_STREAM, 。<span class="hljs-number">0</span>);<span class="hljs-comment">//获得fd</span>
     <span class="hljs-keyword">if</span>(sock < <span class="hljs-number">0</span>){                                                           
         <span class="hljs-built_in">printf</span>(<span class="hljs-string">"create sock error\n"</span>);
     }
    <span class="hljs-keyword">struct</span> sockaddr_in my_socket;
    bzero(&server_socket,<span class="hljs-keyword">sizeof</span>(server_socket));<span class="hljs-comment">//初始化结构体</span>
my_socket 的 sin_family 被设置为 AF_INET 。<span class="hljs-comment">//设置协议家族</span>
将 my_socket 的 sin_addr 的 s_addr 设置为 htonl(INADDR_ANY);<span class="hljs-comment">//设置IP地址</span>
把 my_socket 的 sin_port 赋值为 htons(PORT);<span class="hljs-comment">//设置端口号</span>
    bind(sock, (<span class="hljs-keyword">struct</span> sockaddr*)&server_socket, <span class="hljs-keyword">sizeof</span>(<span class="hljs-keyword">struct</span> soc   kaddr_in));<span class="hljs-comment">//绑定</span>
...
}</code></pre></p>
    在初始化某种类型的结构体时,调用了 htons 函数以及另一个函数。

    htons函数将端口号由主机字节转换为网络字节序的整数值。

    函数将一个IP字符串转换为一个网络字节序的整数值。

    四、网络字节序与主机字节序

    1.主机字节序

    我们平常所说的有大端和小端模式。大端模式是低地址存放高字节,小端模式是低地址存放低字节。不同的 CPU 具有不同的字节序类型,而这些字节序指的是整数在内存中保存的顺序,这种顺序被称为主机序。

    2.网络字节序

    内存地址存在大小端的区别,网络数据流也有大端和小端的分别。发送主机一般会按照内存地址从低到高的顺序,将发送缓冲区中的数据发送出去。接收主机把从网络上接收到的字节,依次保存在接收缓冲区中,同样是按照内存地址从低到高的顺序进行保存。所以,对于网络数据流的地址有这样的规定:先发出的那个数据对应的是低地址,后发出的数据对应的是高地址。

    以下是 4 个字节的 32bit 值传输的次序:首先传输 0 到 7bit,接着传输 8 到 15bit,然后传输 16 到 23bit,最后传输 24 到 31bit。这就是大端字节序,并且 TCP/IP 首部中所有的二进制整数在网络传输时都要求这种次序。

    主机字节序与网络字节序的转换函数

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs vala"><span class="hljs-preprocessor">#include <a style='color:#0000CC;font-size:15px;' rpa/inet.h></span>
<span class="hljs-comment">/*将32位的长整数从主机字节序转换为网络字节序,*/</span>
定义了一个名为 htonl 的函数,该函数的返回值类型为 uint32_t,参数也为 uint32_t 类型,其功能是将主机字节序的 32 位整数转换为网络字节序的 32 位整数。
<span class="hljs-comment">/*将16位的短整数从主机字节序转换为网络字节序,*/</span>
定义一个函数 htons,它接受一个 uint16_t 类型的参数 hostshort,并返回一个 uint16_t 类型的值。
<span class="hljs-comment">/*将32位的长整数从网络字节序转换为主机字节序,*/</span>
定义一个函数 ntohl,它接收一个无符号 32 位整数 netlong 作为参数,函数的返回值也是一个无符号 32 位整数。
<span class="hljs-comment">/*将16位的短整数从网络字节序转换为主机字节序,*/</span>
定义一个函数名为 ntohs,该函数接收一个无符号 16 位整数类型的参数 netshort,并返回一个无符号 16 位整数类型的值。</code></pre></p>
    这样记忆,h 代表的是本地主机,n 代表的是网络,l 是无符号长整型。

    如果是小端字节序,这些函数会将参数转换为大端后进行返回;如果是大端字节序,不会进行转换,直接返回。

    我们通常为了简化编程,会设置 IP 地址。若需要使用特定的 IP 地址,就需要进行字符串和结构体的互换操作。其中有一个成员,它代表着 IP 地址。

    五、函数&函数

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs cs"><span class="hljs-comment">//inet_addr函数</span>
unsigned <span class="hljs-keyword">long</span> inet_addr(<span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span>* cp);<span class="hljs-comment">//cp代表点分十进制</span>
<span class="hljs-comment">//inet_nota函数</span>
<span class="hljs-keyword">char</span>* inet_nota(<span class="hljs-keyword">struct</span> in_addr <span class="hljs-keyword">in</span>);</code></pre></p>
    举个例子:

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'>    <pre class="prettyprint"><code class=" hljs *rasm"> SOCKADDR_IN sock<span class="hljs-comment">;  </span>
sock<span class="hljs-preprocessor">.sin</span>_family = AF_INET<span class="hljs-comment">;  </span>
//将字符串转换为in_addr类型  
sock<span class="hljs-preprocessor">.sin</span>_addr<span class="hljs-preprocessor">.S</span>_un<span class="hljs-preprocessor">.S</span>_addr =  inet_addr(<span class="hljs-string">"192.168.1.111"</span>)<span class="hljs-comment">;  </span>
sock<span class="hljs-preprocessor">.sin</span>_port = htons(<span class="hljs-number">5000</span>)<span class="hljs-comment">;  </span>
//将in_addr类型转换为字符串  
printf(<span class="hljs-string">"inet_ntoa ip = %s\n"</span>,inet_ntoa(sock<span class="hljs-preprocessor">.sin</span>_addr))<span class="hljs-comment">;</span></code></pre></p>
    结果: ip =192.168.1.111


# 深入解析sockaddr和sockaddr_in  # 结构、区别与联系  # 香蜜湖便宜的网站优化  # 优化好的网站推荐男生  # 学习网站建设需求分析  # 白银seo优化  # 网站自动推广赚钱系统  # 速卖通关键词排名跟进表  # 性价比高关键词排名的  # 网站推广从哪些方面考核  # seo培训班怎么学seo博客  # 城市信用网站建设  # 青岛专业网站建设的公司  # 网站优化分析竞争对手  # 网站的优化 就找站有云  # 南宁国际网站推广  # 潍城区网站建设  # seo快速排名联系26火星  # 优化师网站不收录  # 先进关键词排名价格表  # 杭州网站建设推广专家  # 颓废seo 


相关文章: 网站 SEO 优化技巧大揭秘:10 个常用方法助你提升排名,辉县html5网站建设  关键效果:如何通过聚焦核心要素,突破瓶颈,创造卓越成就,营销和定向计划怎么推广  SEO注意事项:助力网站流量提升的关键策略,伊宁抖音短视频营销推广费用  预则立,不预则废!汽车行业 SEO 方案定制指南,平凉全网营销与推广  五金工具企业网站搭建全攻略:从零基础到精通,打造线上新名片,廊坊网站建设方法  从搜索引擎和设计角度解析 SEO,提升网站排名与用户体验,普陀抖音seo贵吗  企业网站建设必知:风格、功能与布局要点,浅谈网络营销推广的概念  广州琛鑫人和信息技术有限公司:天助网广州总代,招商进行中,普洱学校网站建设  中国AI软实力崛起:技术创新与产业应用的完美融合,五金门店营销推广方案  SEO适合-提升网站排名的关键策略,网站优化后收录越来越少  WP原创:打造属于你的独特网站,从这里开始!,芜湖网站推广设计  SEO难吗?揭秘SEO背后的真相,让你轻松上手!,长沙营销推广咨询电话  四川:坚持网站、服务及平台深度融合,推动政府网站集约化建设,苏州建设企业网站  迪蒙**系统开发:新企业制作***平台的流程与注意事项,内蒙古网站优化团队排名  同义转化:让你的语言更具表现力与感染力,电脑上的seo  SEO通过-如何通过SEO优化让你的业务在搜索引擎中脱颖而出,忠县网站seo优化排名  克隆下载:数字世界的无限可能,商业推广型网站制作公司  SEO导航:助力网站提升流量与排名的必备工具,永州政府网站建设公示  优化整站,让网站飞速增长,打造行业竞争力,金华seo霸屏  专业SEO助力企业在激烈市场竞争中脱颖而出,丰县营销型网站优化  利用百度关键词优化,轻松提高网站流量与曝光,i博导网店营销推广竞赛平台  2025 年两轴四区多点布局基本确立,北京博物馆之城空间布局首次明确,漳州定制化网站建设  优化标题:如何让你的文章更具吸引力与点击力,牙科医院网站优化怎么做  SEO客服:如何提升客户体验与业务转化的双赢策略,抖音排名seo  SEO怎么做才能提升网站流量与排名?这篇文章给你全攻略,企业网站建设指标  优化型网站:提升企业竞争力的必备利器,西安网站建设雄账号  初识搜索引擎优化:了解工作原理与网页收录流程,台球厅营销推广语怎么写  找专业 SEO 关键词排名优化公司,助力企业低成本获取精准流量,seo简写  优化公司:助力企业腾飞的秘密武器,眉山58同城网站建设  Hexo 框架搭建个人博客:快速、开源且生态丰富,国学网站建设  网站建设功能报价表与服务报价解析,定制建站价格及注意事项,济源营销网站建设  国网榆林供电公司持续发力数字电网建设,数据治理初见成效,关键词seo排名一对一  为什么“搜狗不收录”会成为企业SEO的新挑战?,随州seo全网营销服务  SEO北京:数字时代,企业成功的关键,网站关键词推广是什么  SEO运维:提升网站排名的核心战略,谷歌seo快速排名蓝颜seo  新疆维吾尔自治区人力资源和社会保障厅政府信息公开指南解读,wfm营销推广  企业网站建设后期如何维护及运营好?北易信息为你解答,信息软件推广营销策略  SEO合同:确保您网站优化成功的关键保障,冬季怎样营销推广啤酒  了解SEO:让你的网站在搜索引擎中脱颖而出的秘密武器,何谓网站推广  SEO建议:如何通过优化提升网站流量,赢得市场竞争,优化网站价格策略研究  关键词出词:打造精准内容的秘密武器,怎么把分词变成seo  美中宜和医疗获字节跳动投资,韦拓生物完成亿元 C 轮融资,品牌营销推广模式区别  商城网站建设的关键要点:货源与质量保障,双鸭山抖音付费营销推广  SEO表述:如何通过精准优化让你的内容脱颖而出,北辰区网站推广方式  零基础建站神器快刻云建,轻松打造美观实用企业网站,贵阳seo搜索栏项目  SEO非常:如何利用SEO提升网站排名与流量,助力品牌快速成长,茂名seo排名工具  100 个私域相关专业名词大揭秘,助你成为优秀私域运营,郑州SEO学习计划面试  危机中的舆情管理:如何在动荡中守护品牌声誉,盛鸣网络网站建设  SEO招标:如何通过专业SEO服务助力企业脱颖而出,工艺品上市营销推广方案  新网站做 SEO 的八个步骤,从选择合适域名开始,优化自己的网站 


相关栏目: 【 网络营销55532 】 【 网络推广33921 】 【 网络优化98863 】 【 网络学院69291 】 【 网络运营7217 】 【 AI推广84713 】 【 百度推广30177