一、

在/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
# 广东企业网站优化供应商
# 会将
# 荥阳网站建设哪家好
# 企业网站推广哪家不错
# seo网站推广实例分析
# 教材推广图片素材下载网站
# 江油网站推广营销
# 网站建设杭州哪家便宜
# 动态网站建设方案公司
# 岱岳区全网营销推广费用
# 品牌网站维护推广
# 这是一种
# 荔湾网站推广优化
# 百度seo营销推广 备案
# 如何屏蔽网站建设
# 餐饮推广网站有哪些平台
# 佛山seo服务
# 苏州seo兼职
# 塘厦品牌网站建设
# seo怎么做软文
# 复兴区网络营销和推广
# seo电商必备技能
# 这一
# 深入解析sockaddr和sockaddr_in
# 结构、区别与联系
# 转换为
# 的是
# 端口号
# 它是
# 一个函数
# 设置为
# 区中
# 返回值
# 深入解析sockaddr和sockaddr_in:结构、区别与联系
# 互联网
# 也有
# 这就是
# 一台
# 所需
# 或其他
# 被称为
# 要对
# 也为
相关文章:
长沙市网站建设公司,助力企业互联网转型升级,长沙市助力企业互联网转型升级的优质网站建设服务
石家庄网站 *** 公司,专业打造企业品牌形象,助力企业腾飞,石家庄专业企业品牌形象网站定制专家,助力企业飞跃发展
常德网站建设,打造专业 *** 平台,助力企业腾飞,常德企业腾飞新引擎,专业网站建设,构建高效 *** 平台
鄂州网站建设,打造地方品牌新名片,助力企业互联网发展,鄂州品牌新起航,网站建设助力企业互联网腾飞
QS标志退出历史舞台,全面启用“SC”新标志
点击查询按钮可获取微信群成员信息,含多种功能介绍
情侣旅游费用引热议!女方没钱男友转账却附奇葩备注
网站海外推广策略全解析,开启国际市场的金钥匙,国际市场拓展攻略,揭秘网站海外推广成功之道
微信小程序发布时无入口?后与竞品比入口,开发者咋选了?
无锡网站 *** ,打造个性化企业网站,助力企业腾飞,无锡专业网站定制,塑造企业品牌新形象,无锡专业网站定制,助力企业品牌形象升级
彩铃与微信来电铃声有何区别?如何设置运营商彩铃?
沧州网站推广,助力企业互联网营销新篇章,沧州企业互联网营销新篇章,网站推广助力腾飞,沧州企业互联网营销新篇章,网站推广助力腾飞
微信语音通话不弹出通知?多维度排查调整帮您解决
2025年中国网站建设公司TOP10权威榜单发布,增长超人实力居首
呼和浩特网站建设,打造企业线上新名片,助力品牌腾飞,呼和浩特企业线上品牌升级,专业网站建设,助力腾飞新名片,呼和浩特企业线上品牌升级,专业网站建设,打造腾飞新名片
上海网站建设公司,助力企业数字化转型的专业伙伴,赋能企业数字化转型,上海专业网站建设公司助力新篇章
举杯邀明月,对影成三人,孤独是生活试炼亦是自由?
七夕良辰爱满湾区!海口举办婚拍旅游推介会及颁奖仪式
SEO优化如何让关键词快速上排名?深度解析来啦
云南网站设计,地域特色与文化融合的视觉盛宴,融合云南风情的视觉之旅,地域特色与文化共融的网站设计赏析
上海网站排名优化,提升网站流量,增强品牌影响力的关键策略,上海网站流量倍增与品牌影响力提升策略解析
合肥专业网站建设,助力企业提升品牌影响力,合肥企业品牌影响力提升专家——专业网站建设服务
黄浦网站建设,打造专业、高效的在线平台,助力企业腾飞,黄浦专业网站建设,助力企业高效腾飞
企业网站排名优化,提升在线影响力的关键策略,企业网站排名提升攻略,优化策略助力在线影响力增长
微信诞生于2011年,它如何改变春节问候及发展历程?
电子商务网站设计,打造高效、用户体验至上的在线购物平台,构建卓越用户体验,高效电子商务网站设计之道
第五人格:荒诞画风与悬疑剧情交织的刺激1V4手游
打造高效营销型企业网站,策略与技巧解析,高效营销型企业网站构建之道,策略与技巧揭秘
商城小程序多少钱一年?算清这笔账,知晓搭建成本差异
大型网站建设,打造企业核心竞争力的重要策略,网站建设,构建企业核心竞争力关键策略,网站建设,企业核心竞争力打造的必经之路
秋风送爽新学期开启,网警进校园带来网络安全课啦
西安网站公司,助力企业数字化转型,打造专业 *** 服务平台,西安网站公司,赋能企业数字化转型,构建专业 *** 服务新平台
临沂网站,助力城市发展,打造信息高速公路,临沂信息高速公路,网站助力城市腾飞
免费建设网站,轻松打造个人品牌与在线影响力,零成本打造个人品牌,免费网站建设攻略,零成本打造个人品牌,免费网站建设攻略全解析
手机功能强大,以识别图片文字为例讲讲具体方法
2023小红书营销违规词!(收藏)
日常求人不得?这6款老司机才懂的见光死网站快收藏
网站建设工作室,打造个性化企业 *** 门户的专家团队,个性化企业 *** 门户定制专家——网站建设工作室
百度关键词下拉框怎么刷?关键字指数与相关度你了解多少?
网站推广攻略,全方位提升网站流量与品牌影响力,网站流量与品牌影响力双提升,全方位网站推广攻略
1月21日微信ios端8.0上线!新表情特效及背后功能揭秘?
公司网站维护,保障 *** 形象,提升品牌价值的必修课, *** 形象守护者,公司网站维护与品牌价值提升之道,网站维护,塑造 *** 形象,提升品牌价值的必经之路
乐刷客服电话是多少?一文详解乐刷公司总部热线及相关信息
探索未知世界——我的网站欣赏之旅,探索未知世界,我的网站欣赏之旅,我的网站欣赏之旅,探索未知世界
荆州网站建设,打造企业互联网新名片,助力品牌腾飞,荆州企业互联网品牌新飞跃,专业网站建设服务助您腾飞,荆州企业互联网品牌新飞跃,专业网站建设助力腾飞
近日洛阳发布2025民营企业30强名单,都有谁入选了?
广电客服怎么找?电视机顶盒故障、5G套餐问题全解答
百度网盘买了超级会员下载仍慢怎么办?这些解决方法请查收
免费看vip电视的软件有哪些?人人视频与52看看*分享
探索网站盈利之路——从策略到实践,从策略到实践,探究网站的盈利之道
相关栏目:
【
广告资讯90366 】
【
广告推广18483 】
【
广告优化154267 】
【
广告营销46464 】