深入解析sockaddr和sockaddr_in:结构、区别与联系 黄山搜狗网站优化

发布时间 - 2026-01-15 18:39:22    点击率:

一、

在/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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 涿州SEO优化,提升网站在搜索引擎中的排名,让您的业务腾飞,忻州关键词网站优化  黄陂SEO优化费用介绍,如何精准投资,实现网站流量翻倍,seo1 小视频  拉萨抖音SEO公司,助力企业抖音营销的得力助手,seo教育推广引流  广州快速SEO优化收费标准介绍,如何选择性价比高的服务,seo网站抉择火星推荐  SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名  广州百度推广费用记账,优化成本管理的关键策略,优酷土豆网站推广  河北SEO推广外包公司,助力企业高效提升网络知名度,奇台seo培训  日常生活中微信成重要沟通工具,如何把录音发送到微信?   探索广州百度推广主页,助力企业数字化营销新突破,营销平台线上推广方案  SEO网站链接优化步骤,提升网站排名的关键方法,seo职位薪资架构  中消协发布消费提示:惕免密支付风险,网购谨慎开启   抖音SEO排名引流方法,如何让你的短视频轻松霸屏!,沁阳网站自然优化多少钱  娄底淘宝SEO优化,打造电商新篇章的关键策略,深圳布吉营销推广  SEO用户:如何为您的网站带来持续流量和转化,惠州网站推广哪个好  SEO外包:提升网站排名与品牌曝光的最佳选择,大创建设网站  SEO在国外市场的崛起,影响与启示,广州seo服务推广价格  房产中介SEO推广攻略,让您的房产网站脱颖而出,seo专员怎么样优化  建瓯SEO排名,介绍提升网站流量与品牌影响力的方法,上海优化seo平台  中共昆明市委党校:四库建设推动教学创新,抓现场教学提科学化水平   花都建网站SEO优化步骤,让您的网站在搜索引擎中脱颖而出,如优化网站认定云速捷  黄冈谷歌SEO营销,助力企业互联网品牌崛起的方法,汕头seo公司推荐23火星  江门全网营销SEO外包,助力企业腾飞的新引擎,韶关网站优化案例  SEO场景下的数字营销:如何通过精准优化提升网站流量,陕西融发建设集团网站  杭州SEO排名优化,白帽步骤助力企业网络营销,网站优化编辑工作内容  广州百度推广费退款问题解析及解决方法,安顺网络推广网站建设  介绍营口抖音SEO价格,投资回报,你值得拥有!,seo十大关键词排名  自媒体营销新纪元,如何在这个变革的时代抓住机遇?,温州最牛叉的seo  如何设置福建百度推广关键词才能达到**效果,摄影师网站怎么做推广赚钱  SEO实际:如何在竞争激烈的市场中脱颖而出,dz论坛seo如何设置  潮州短|视频|SEO优化,打造爆款|视频|,抢占流量高地,seo公司是怎么做seo的  SEO和品牌营销:如何通过搜索引擎优化打造品牌影响力,建邺seo软件  SEO短视:为何眼前的成效不能成为长久的策略?,网站上线seo优化  SEO特点与实施策略:提升网站流量与排名的关键,定西抖音seo价格查询  酒香咖啡豆SEO,如何让您的咖啡店在互联网上独树一帜,西城seo优化厂家  SEO助力优质服务推广,介绍高效步骤与方法,如何搜衣服关键词排名  广州百度推广销售的机遇与策略,天津天猫网站推广好处  探索火星旅游的奥秘与可能性,钓鱼活动文案网站推广  介绍短|视频|SEO代理价格,如何选择性价比最高的服务,SEO在线引蜘蛛平台  马蜂窝SEO软件,助力旅游行业企业实现高效网络营销,手机端网站排名优化软件  广州百度推广有没有用?深入解析其价值与效果,服务类营销推广方案范文  SEO抓取:让您的网站从零到一的秘诀,佛山网站建设哪家效果好  揭秘SEO优化背后的黑科技,低成本打造高效网站,黄石网站关键词优化报价  SEO要不,来看看如何通过SEO优化提高网站流量和曝光度,seo 获客技巧  日常求人不得?这6款老司机才懂的见光死网站快收藏   打造个性化家居空间_SEO书架装饰画的魅力与选择指南,常德谷歌seo哪家好  广州百度推广加盟,助力企业腾飞的优选之路,泸州营销推广哪家专业培训好  详细介绍SEO教学设计在美术领域的应用与创新,福建seo推广知识模式  扬州SEO推广前景,把握数字营销风口,助力企业腾飞,seo骨灰级  SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星  探索未知,我的成长之旅与自媒体营销的融合,seo中标题写法