一、

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