在上一篇博客里,大家也许会对htons()感到疑惑吧,其实就是字节序的转换,所以这篇博客我们就来详细的解释一下什么是字节序。

也就是让大家对 bind函数有更加深刻而性感的认识

计算机是小端字节序,网络中是大端字节序。

内存中的多字节数据相对于内存地址有大端和小端之分。

计算机有两种储存数据的方式 : 大端字节序 和 小端字节序。

"大端字节序":

高位字节在前,低位字节在后,这也就和我们人类读写数字的方式是相同的。

"小端字节序":

低位字节在前,高位字节在后,小端字节序和大端字节序是相反的。

那么博主就给大家举一个例子吧。

比如说:
这就是大端字节序和小端字节序的存放了。

如果大家还是不能理解那么博主只能动用自己的表情包了!!!

看完这个图肯定还是会有同学有疑惑?为什么需要字节序?那为什么字节序还要区分大小呢??

Q:大家是不是会疑惑???明明大端字节序已经才是我们正常生活中的啊??为啥要在搞一个小端字节序出来,这不是自找麻烦吗???
A:要详细解释这个就要牵扯到计算机原理了,简单来说就是为了效率(因为计算都是从低位开始的),计算机电路是优先处理低位字节的。而我们图中已经说的很明白了,我们的字节序是从高位到低位来排列的,如果正常读取

(计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节)

会出现错误,而在将数据反过来读取效率又太低,所以就出现了

小端字节序。

希望大家明白,除了计算机的内部是小端字节序外,其他的基本都是大端字节序.

对于字节序的处理,大家只要记住只有读取的时候,才必须区分字节序,其他情况都不用考虑

所以大家现在明白了吧,在我们输入了Ip和端口号之后,计算基会给我们处理成小端字节序,所以此时我们就要将小端字节序转换成大端字节序了。也就会用到我们的 htons()函数

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数将
主机字节序(小端字节序)转换成网络字节序(大端字节序),或者将网络字节序转换成主机字节序

#include <arpa/inet.h>
//主机字节序(小端字节序)转换成网络字节序(大端字节序)
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);//网络字节序(大端字节序)转换成主机字节序(小段字节序)
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);h表示"host",n表示network,l表示32位长整数,s表示16位短整数。

相信大家对字节序的概念已经有很性感的认识了。
所以我们再看一看 bind()函数那一整块代码

struct sockaddr_in servaddr; //为了让bind()绑定IP和端口号而定义的bzero(&serv_addr, sizeof(serv_addr));    //将网络地址清空
memset(&serv_addr,0,sizeof(serv_addr));//z这个方法也可以servaddr.sin_family = AF_INET;//与socket()的第一个参数 int domain一样的协议
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  //绑定IP
servaddr.sin_port = htons(6666);   //绑定端口号bind(serv_addr, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

是不是看到了熟悉的 htons() 和 htonl()了???

可是这个我们还是不知道啊 INADDR_ANY??

这个其实就与我们 bind()的第二个参数有关了不知道大家忘记没有,第二个参数有两个结构体哟,如果记不住的话博主在把之前的图拿出来给大家看一看


看到了吧??存放32位的IP地址是不是有那么一点儿感觉了??哈哈没错其实就是 htonl()转换后的32位放到哪个结构体成员里面的。

INADDR_ANY:
相信大家再看到bind()函数应该很舒服了吧。

struct sockaddr_in servaddr; //为了让bind()绑定IP和端口号而定义的bzero(&serv_addr, sizeof(serv_addr));    //将网络地址清空
memset(&serv_addr,0,sizeof(serv_addr));//z这个方法也可以servaddr.sin_family = AF_INET;//与socket()的第一个参数 int domain一样的协议
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  //绑定IP
servaddr.sin_port = htons(6666);   //绑定端口号bind(serv_addr, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//第三个参数就是第二个参数的大小
至于为什么要强制转化我在上一篇博客已经说了,就不再赘述了。

也许会有同学问,如果我想要绑定固定的IP地址呢???我不想用 INADDR_ANY。那么就要用到我们另外的函数了----->IP地址转换函数

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>in_addr_t inet_addr(const char *cp);

下面是书上对 IP地址转换函数的应用。
那里面的 argv[1]就是你自己输入的 IP地址

大家是不是又看到了陌生的东西了吧??

htons(atoi(argv[2]))??? htons()我倒是知道哦,但是 atoi()又是啥呀?? 其实很容易的,你看看前面是 serv_addr.sin.port所以是端口号,你在输入端口号和IP时,其实输入的是字符串,而atoi()函数的作用就是把字符串转换成整型数的一个函数。

//小技巧相比于上文介绍的字节序转换函数:
如果要使用特定的IP的对比
#include <arpa/inet.h>
//主机字节序(小端字节序)转换成网络字节序(大端字节序)
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);//网络字节序(大端字节序)转换成主机字节序(小段字节序)
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);h表示"host",n表示network,l表示32位长整数,s表示16位短整数。//还有一种转换方式:
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
支持IPv4和IPv6
可重入函数
其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr。
因此函数接口是void *addrptr。//二者的区别:
"192.168.1.24" -->unsigned int --> htonl() --> 网络字节序
"192.168.1.24" ------------------> 网络字节序  inet_pton();
网络字节序 ------------------> 点分十进制字符串  inet_ntop();
也就是 inet_pton();可以直接将IP字符串转换成网络字节序。而在使用htonl();之前还需要将IP字符串转换成无符号整数之后才行(转换方法atoi()上面有所提及)。如果直接用 INADDR_ANY 这个宏(他本身就是无符号整数)所以直接用htonl即可。

好啦,bind()函数讲到这里相信大家一定不会再感到陌生了。下面再看一看bind()函数吧,最后一次加强印象了。

struct sockaddr_in servaddr; //为了让bind()绑定IP和端口号而定义的bzero(&serv_addr, sizeof(serv_addr));    //将网络地址清空
memset(&serv_addr,0,sizeof(serv_addr));//这个方法也可以  二选一servaddr.sin_family = AF_INET;//与socket()的第一个参数 int domain一样的协议
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  //绑定IP
servaddr.sin_port = htons(6666);   //绑定端口号bind(serv_addr, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
                             谢谢观看

网络编程之 字节序和深入理解bind()函数相关推荐

  1. linux网络编程之字节序

    进程间通信 特点:依赖于内核,造成缺陷--无法实现多机通信. 网络编程 地址:由IP地址和端口号构成,端口号用来判断客户端接入哪个服务器. 数据的交流:涉及到协议(http,tcp,udp),其实就是 ...

  2. python3 网络编程 主机字节序 网络字节序 相互转换

    编写底层低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据.在这种操作中,需要把主机操作系统发出的数据转换成网络格式,或者做逆向转换,因为这两种数据的表示方式不一样. 1. 代码 # 主 ...

  3. 网络传输大端序_基于大端法、小端法以及网络字节序的深入理解

    关于字节序(大端法.小端法)的定义<UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起 ...

  4. Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)

    参考:网络编程前的一些小知识–Linux笔记 作者:一只青木呀 发布时间: 2021-04-12 23:19:10 网址:https://blog.csdn.net/weixin_45309916/a ...

  5. 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...

  6. 使用htons和ntohs进行字节序转换的理解

    字符数组中存储顺序,可以理解为是内存中存储的顺序!!!!! 1.示例 uint16_t   value = 0xabcd; uchar ch[2]; memcpy(ch,&value,size ...

  7. 大小字节序的深入理解和鉴定系统字节序方法

    2019独角兽企业重金招聘Python工程师标准>>> 最近在项目中的soket通信时,遇到了大小字节序问题和网络传输时的字节序问题,现在给大家整理一下,希望大家对字节序有个比较深入 ...

  8. 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom

    1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...

  9. UNIX网络编程笔记(6):I/O复用之select函数

    上一讲中我们正确处理了僵尸子进程,使得这个简单的服务器更加健壮.不幸的是,这个程序仍然有问题.想象一下,如果一个客户正在和一个服务器子进程连接建立完毕正在通话,而服务器子进程意外终止(比如kill), ...

最新文章

  1. 影响HP服务器的磁盘性能的重要因素 -- 阵列卡的缓存和电池
  2. Science背靠背: NLR受体介导植物抗病反应新机制
  3. QSettings allKeys读取为空分析
  4. Java基础之集合归总
  5. python表头写进csv文件_Python读取CSV文件列并在CSV-fi中写入文件名和列名
  6. css定位:相对定位
  7. 【C#】隐式类型var
  8. 打断点是什么意思_英语微课堂:“Give me a break”是什么意思呢?
  9. iOS开发,第三方应用微信授权登录,获取微信unionid
  10. [Laravel] 如何使用PHP实现前端分页
  11. IDEA 2017破解 license server激活
  12. 图像算法之3D人脸识别技术原理概述
  13. html页面广告5秒之后跳过
  14. 波司登 × 阿里云 × 奇点云:教科书式的数智化转型实践
  15. 【Java入门练习100例】03.短路与和逻辑与的区别——老实人和机灵鬼
  16. java flv转mp3_java调用FFmpeg及mencoder转换视频为FLV并截图
  17. option标签的默认值设置
  18. 一键实现前程无忧(51job)简历不停刷新(selenium)
  19. DISM命令使用小结
  20. Anders Hejlsberg 技术理想架构开发传奇

热门文章

  1. android开发微博前的包准备,新浪微博开发之前期准备篇
  2. “小米都造车了,为什么华为不造?”华为轮值董事长亲自回应
  3. 通过代码学 Sutton 强化学习:SARSA、Q-Learning 时序差分算法训练 CartPole
  4. 再见,Navicat!这个 IDEA 的兄弟,真香!
  5. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
  6. Code Review 13 大必知必会,学习了!
  7. @IT老司机 云服务、BI大数据、协同办公等五大技术选型研讨会,震撼来袭!
  8. 华为发布政企战略及华为云Stack,瞄准新基建下政企的数字化转型
  9. 痛失 3000 万美元比特币现金,只因一张 SIM 卡?
  10. 小米冲击高端,这次能否成功?