一、
在/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=&qu
三、两者之间的区别与联系
我们来看一下与的结构:
二者占用的内存大小是相同的,所以能够互相转化,从这个意义来看,它们没有区别。
区别:常用于 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软件推荐公司
# 这一
# 深入解析sockaddr和sockaddr_in
# 结构、区别与联系
# 转换为
# 的是
# 端口号
# 它是
# 一个函数
# 设置为
# 区中
# 返回值
# 深入解析sockaddr和sockaddr_in:结构、区别与联系
# 互联网
# 也有
# 这就是
# 一台
# 所需
# 或其他
# 被称为
# 要对
# 也为
相关文章:
百度、腾讯、头条加入广告联盟三国杀,谁能独占鳌头?
云淞网络:专注网站等开发,多项指标出色获雇主好评 辽宁网站建设公司推荐
想要通过微信公众号进行引流,首先你得做好公众号运营!
宝妈在家搞副业的4个靠谱路子,手工创作等真能赚钱 淘宝好货关键词排名软件
移动广告平台有哪些?盘点目前主流的8个移动广告投放平台!
分享10个很火的淘客联盟赚钱渠道,副业搞起来!
最适合个人站长赚钱的6大广告联盟推荐!(新手必看)
在推广项目的时候使用短链有什么好处?
想要实现网站变现赚钱,选择一个靠谱的广告联盟非常重要!
做电影站实现高效引流的赚钱方法分享
资深站长总结的快速提升网站排名的5个小技巧分享
微信赚钱项目之如何利用微信解封赚钱?
如何通过建立个人博客网站推广联盟产品赚钱呢?
想要网站通过广告联盟赚钱必须要明白这三者之间的关系!
想要让目标用户知道你的产品,这七种免费的网站推广方法必须掌握!
齐齐哈尔市11月8日至10日开展区域核酸检测的通告 耀州区网站优化
滤镜效果有好有坏,明星也难逃死亡滤镜翻车现场
【联盟基础】利用网盘下载资源进行推广是什么意思?
怎么申请加入谷歌广告联盟赚钱?
从报纸到屏幕,创作工具变迁,视频剪辑 app 扎堆上线的原因? 怎么做数据网站推广工作
流量联盟是真的吗?如何利用流量联盟来赚钱?
自媒体运营前期准备与内容创作要点全解析 市场营销网络推广方法
广告推广赚钱怎么做?国内有哪些靠谱的广告联盟?
微信营销应该怎么做,有哪些需要注意的?
一般人如何靠广告联盟赚钱实现网络副业收入逆袭?
日赚200+的项目新玩法思路分享,快来看看!
个人站长们怎样通过广告联盟赚钱月入过万?
想通过广告联盟作弊快速赚钱?最终只能因为贪心而反噬自身!
广告联盟上日赚1000+的方法和经验分享!
常见的网站申请百度联盟被拒绝的原因有哪些?
策划一个成功的app地推活动方案应该怎么做?
如何利用推广项目从广告联盟赚佣金?8个主流玩法介绍给你!
小红书引流该如何做?10个小红书快速引流方式介绍!
文章引流该怎么做?做好这6点流量源源不断!
新上线的网站运营该如何做?建议从这8个方面着手!
加微信还在傻傻发你好?50个高情商开场白快收藏 招远哪家网站推广好
推广app赚钱怎么做?app推广赚佣金的4个方法!
教你如何从seo优化的角度提升网站流量,值得借鉴!
qq群营销技巧有哪些?如何做好qq群营销实现精准引流?
推广是什么意思?两种最典型的推广赚佣金模式介绍!
app推广怎么做?推荐这8个主流app推广渠道!
被动赚钱日入300+的暴利赚钱玩法介绍
站长联盟的盈利模式都有哪些?个人网站赚钱的三大方法!
送给客户的早安问候语,温暖舒心缩短情感距离 深圳便宜的网站优化方式
2021年4个下班后在家就能做的网上赚钱副业,赶紧行动起来!
微信引流的四大群体,引流这样做才有效果!
如何做好网络营销?网络营销手段和方法策略有哪些?
揭秘广告联盟平台上常见的几种作弊方式!
分享7个合法靠谱且高利润的偏门赚钱项目
提升网站排名和流量的22个网站外链的建设方法汇总!
相关栏目:
【
广告资讯90366 】
【
广告推广18483 】
【
广告优化154267 】
【
广告营销46464 】