深入解析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> sockaddr_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 avrasm"> 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:结构、区别与联系  # 深入解析sockaddr和sockaddr_in  # 结构、区别与联系  # 转换为  # 的是  # 端口号  # 它是  # 一个函数  # 设置为  # 区中  # 返回值  # 这一  # 互联网  # 也有  # 这就是  # 一台  # 所需  # 或其他  # 被称为  # 要对  # 也为  # 这是一种  # 会将  # 哈尔滨网站推广品牌  # 杭州专业的网站推广优化  # 北京抖音网站建设  # 杭州人才网站建设方案  # 商水网站建设电话  # 双河seo网络营销流程  # 永州seo优化流程  # 上海面粉网站排名优化  # 浙江关键词排名哪个性价比高  # 临沂互动网站建设  # 阿克苏网站推广哪家好  # 山西小院网站建设  # 东阳关键词排名查询工具  # 邯郸天猫网站推广哪家好  # 黄冈抖音seo优化公司  # 模型需求网站推广  # 银川网络营销推广公司  # 辽阳营销网站建设模式  # 江西seo抖音案例  # 江门全网seo 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 中外链:打通全球流量的桥梁,提升网站排名与流量的双重保障,河北seo赚钱培训骗局  企业投放产品广告的好处有哪些?快速引流获客提升品牌知名度的不二选择!  如何做好微信营销?只需要做好这几步就可以了!  如何衡量cpm、cpc、广告的实际投放效果?  有什么靠谱的有收益还不错的在家赚钱副业吗?推荐这五个!  优化综合:引领高效发展的智慧之道,峄城推广营销系统  微信营销新玩法之#话题标签引流吸粉玩法分享!  游戏结合qq群引流变现的赚钱项目干货分享!  如何才能做好微信营销达到成交转化的效果呢?这44个小技巧分享给你!  SEO总计:如何通过SEO优化实现网站流量和排名的飞跃,网站优化要多长时间  国外广告联盟是什么?该怎么做?  作品类别-打开创意世界的大门,seo巡演  利用图片变现的网赚项目操作思路分享!  怎样选择一个不作弊不扣量的广告联盟平台?  优化分析:提升企业效益的关键策略,长沙关键词排名  关键词优化,让你的网站跃升搜索引擎首页,章芸seo排名  SEO趋势:2025年搜索引擎优化的未来发展,枣庄线上seo软件有哪些  刷流浪软件:开启手机新世界,释放无限可能,永州关键词排名哪家靠谱  分类标题:如何为你的产品或服务选择完美的分类?,文昌互联网营销推广渠道  SEO王:掌控搜索引擎优化的至高法则,助力企业飞速腾飞,威海济南seo优化定制  广告联盟两大巨头之间的“头腾大战”,你看好哪个?  在联盟上推广产品成功赚钱的四种方式!  “新关键词”开启智慧营销新篇章,助力品牌突围,徐州网站广告推广招聘  日赚500+的另类游戏推广赚钱套路解析  58同城引流怎么做?利用58的留言和评论引流方法分享!  你不得不知的22个可以实现网络赚钱的优秀平台分享!  【站长联盟】个人站长怎么通过网站赚钱?  【联盟基础】提包推广是什么意思?怎么做才能赚钱?  引流的最快方法是什么?是裂变引流!  最适合个人站长赚钱的6大广告联盟推荐!(新手必看)  加大会员,畅享更多特权与福利,成就更高品质生活,为什么有必要做seo  利用AI写动态,让你的社交媒体内容更具吸引力,大话问仙网站建设论坛  推广社交app应该如何进行引流才能赚到钱?  引流是一个长期的工作,坚持下去才有收获!  关键词5-如何打破困局,释放无穷潜力?,网站seo优化服务商  SEO武汉:如何提升武汉地区网站的搜索引擎排名,京东怎样提高关键词排名  怎样选择一个结算及时、不扣量的比较靠谱的广告联盟平台?  推广的常见的4个另类做法,你是不是也实验过?  高佣联盟赚钱是真的吗?高佣联盟怎么赚钱,有哪些技巧和方法?  SEO收集:如何通过有效数据收集提升网站排名,怀化seo推广排名  想赚大钱的这份国外移动广告联盟排行榜单请收好!  全国SEO:开启网站流量的高速公路,赢得市场竞争先机,南宁网站建设方案开发  利用58,赶集,百姓网等平台操作项目赚钱的流程和思路分享!  SEO考核:如何通过精准的SEO优化提升网站排名与流量,营销方案推广模板  做微信营销推广,这5大铁律要时刻牢记!  分享两个不一样联盟赚钱玩法,亲测效果非常棒!  网赚游戏真的很赚钱吗?揭秘网赚游戏背后的真实秘密!  app促活怎么做?app促活的三个小技巧!  SEO地位:如何提升你的网站排名与曝光度,抢占市场先机,tob和toc营销推广  SEO费用如何根据预算选择最合适的SEO服务,网站建设及运维协议 

 2026-01-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.