linux网络编程-socket(1)

摘要:
以0x12345678为例。从高位到低位的字节为0x12、0x34、0x56和0x78。高/低地址端和高/低字节已明确。

linux网络编程-socket(1)第1张

 上面是对应的IpV4的地址结构:

sin_len整个结构的大小

sin_family协议族,对应Tcp固定为AF_INET,除了tcp协议外还支持unix域协议等

sin_port socket通信的端口

sin_addr是一个无符号的32位的网络字节地址

上面的结构体仅仅支持IPv4地址协议,如果支持其他协议咱办了,后面引入了通用协议的地址协议

linux网络编程-socket(1)第2张

在使用的使用可以将IPv4协议转换成通过的地址结构,其中IPv4的

sin_port socket通信的端口 2个字节

sin_addr是一个无符号的32位的网络字节地址 4个字节

sin_zero[8] 8个字节

一共加起来就是14个字节

刚好通用的sa_data[14]个字节对应起来

linux网络编程-socket(1)第3张

 在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高/低地址端和高/低字节都弄清了。我们再来回顾 一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)

Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
栈 顶 (低地址)

我们通过代码来测试下:

#include<stdio.h>

int main(){
    
    unsigned int a = 0x12345678;
    unsigned char*p = (char*)&a;
    printf("%0x %0x %0x %0x 
",p[0],p[1],p[2],p[3]);
    return 0;
    
}

程序的运行结果是:

linux网络编程-socket(1)第4张

说明当前的机器是小端模式

linux网络编程-socket(1)第5张

我们来测试下,将一个32位的本机地址转换成网络字节,网络字节输出应该是大端模式

我们来看程序的代码:

#include<stdio.h>
#include <arpa/inet.h>
int main(){
    
    unsigned int a = 0x12345678;
    unsigned char*p = (char*)&a;
    printf("%0x %0x %0x %0x 
",p[0],p[1],p[2],p[3]);
    
    unsigned int y = htonl(a);
    unsigned char*p2 = (char*)&y;
    printf("%0x %0x %0x %0x 
",p2[0],p2[1],p2[2],p2[3]);
    
    return 0;
    
}

我们使用ftp将代码上传到ubuntu系统上,我们使用gcc进行编译

我们的源代码为1.c,我们进行到存储1.c的目录使用gcc进行编译

 gcc 1.c  -o 1

然后执行输出的1这个可执行文件

./1

我们来看程序的输出结果是:

78 56 34 12
12 34 56 78

说明经过转换之后变成了大端模式

 linux网络编程-socket(1)第6张

 我们比较直观的ip地址是192.168.2.132这个地址,但是这个地址对应的32位的网络地址是多少了,我们就需要用到上面的地址转换函数

inet_addr是将192.168.2.132点分十进制的地址转换成32位的整数

linux网络编程-socket(1)第7张

免责声明:文章转载自《linux网络编程-socket(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】oracle之函数与过程相似图片搜索的三种哈希算法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java虚拟机14:Java对象大小、对象内存布局及锁状态变化

一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小。 不过有一点不同的...

【VS开发】【C/C++开发】memcpy和memmove的区别

memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count);...

DPDK并行计算

参考文献: 《深入浅出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言:   处理器提高性能主要是通过两个途径,一个是提高IPC(CPU每一时...

flask中路由系统

flask中的路由我们并不陌生,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 1.@app.route()装饰器中的参数 methods:当前url地址,允许访问的请求方式 @app.route("/info", methods=["GET", "POST"]) def student_info(...

统计一个版本代码变化行数

项目总结时,我们常常需要统计代码行数,来查看每个项目开发者的代码总量,提交次数和变更文件数。 这里介绍一下statsvn工具统计代码行数的方法。   1、安装tortoise svn 下载tortoise svn,下载地址:https://tortoisesvn.net/downloads.html,附件给出了64位的版本。 点击运行,按照提示安装完成。...

char码值对应列表大全

Char("0") 为0的字符Char("1")Char("2")Char("3")Char("4")Char("5")Char("6")Char("7") 响铃Char("8") 回格Char("9") tab(水平制表符)Char("10") 换行Char("11") tab(垂直制表符)Char("12") 换页Char("13") 回车 chr(1...