博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
阅读量:6718 次
发布时间:2019-06-25

本文共 2237 字,大约阅读时间需要 7 分钟。

IPv4套接字地址结构struct sockaddr_in{    uint8_t sinlen;(4个字节)    sa_family_t sin_family;(4个字节)    in_port_t sin_port;(2个字节)    struct in_addr sin_addr;(4个字节)    char sin_zero[8];};sin_len:整个sockaddr_in结构体的长度,部分Linux内核版本没有该成员sin_family:指定该地址家族,一般设置为AF_INET(使用TCP,UDP协议)sin_port:端口sin_addr:IPv4的地址sin_zero:暂不使用,一般将其设置为0通用地址结构struct sockaddr{    uint8_t sin_len;(4个字节)    sa_family_t sin_family;(4个字节)    char sa_data[14];};sin_len:整个sockaddr结构的长度sin_family:指定该地址家族sa_data:由sin_family决定它的形式结论:struct sockaddr_in与struct sockaddr结构大小相同
字节序大端字节序--最高有效位存储与最低内存地址处,最低有效位存储于最高内存地址处小端字节序--最高有效位存储于最高内存地址处,最低有效位存储于最低内存地址处主机字节序--不同主机有不同的字节序,如x86小端字节序,,Motorola 6800为大端字节序网络字节序--网络字节序规定为大端字节序字节序说明:一个int类型变量254存储在内存中,如果变量的百位存储于内存地址条上的低地址处, 个位存储于内存地址条上的高地址处(即变量存储序列和内存地址序列相反)这就是大端字节序,反之则是小端字节序。 各个主机的字节序是不同的,但是在网络中传输,必须要一个统一的字节序,这就是网络字节序。
字节序转换函数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代表networks;s代表short;l代表long。
#include 
#include
#include
#include
#include
#include
#include
int main(int arg, char *args[]){ unsigned int data = 0x12345678; char *p = (char *)&data; printf("%x,%x,%x,%x\n", p[0], p[1], p[2], p[3]); /* * 对于数组而言,内存地址一定是递增的,p[0]=*(p+0);p[1]=*(p+1); * 如果data变量的最低有效位处于p+0这个低内存地址位,说明这是小端字节序 * */ if (p[0] == 0x78) { printf("主机是小端字节序\n"); } else { printf("主机是大端字节序\n"); } //字节序转换函数 uint32_t ndata = htonl(data); p = (char *)&ndata; printf("%x,%x,%x,%x\n", p[0], p[1], p[2], p[3]); if (p[0] == 0x78) { printf("网络字节序是小端字节序\n"); } else { printf("网络字节序是大端字节序\n"); } return 0;}
地址转换函数typedef uint32_t in_addr_t;struct in_addr {    in_addr_t s_addr;};int inet_aton(const char *p,struct in_addr *inp);将点分十进制(192.168.1.116)转化成struct in_addrin_addr_t inet_addr(const char * cp);将点分十进制转化成32bitchar *inet_ntoa(struct in_addr in);//注意:这里参数是结构体变量,而非结构体指针将struct结构体变量转化成点分十进制 inet_ntoa()返回值是char *,这个char *的内存空间是在inet_ntoa()函数中静态分配的,因此inet_ntoa()后面的调用会覆盖上一次调用,inet_ntoa()是线程不安全函数。
套接字类型1.流式套接字(SOCK_STREAM)--提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。2.数据报式套接字(SOCK_DGRAM)--提供无连接服务,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。3.原始套接字(SOCK_RAW)

 

转载地址:http://pzumo.baihongyu.com/

你可能感兴趣的文章
web 应用通用数据访问层 Fetchr
查看>>
《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2 建立基准...
查看>>
绕过 Windows 10 Cloud 限制 成功运行 Win32 应用程序
查看>>
Alamofire —— Swift 的 HTTP 客户端开发包
查看>>
《程序员的呐喊》一一1.13 弱类型机制够不够强
查看>>
Windows 10 Redstone 终将引入交互式动态瓷贴
查看>>
《机器人与数字人:基于MATLAB的建模与控制》——3.1节平移和旋转
查看>>
《途客圈创业记:不疯魔,不成活》一一1.3 iWeekend创业周末
查看>>
《精通SNMP》——2.4 标签类型和子类型
查看>>
《云数据中心构建实战:核心技术、运维管理、安全与高可用》——导读
查看>>
《Python自动化运维:技术与最佳实践》一2.4 探测Web服务质量方法
查看>>
《Android UI基础教程》——2.4节显示列表
查看>>
《Scala机器学习》一一1.5 使用Scala和Spark的Notebook工作
查看>>
Fast-FrameWork v0.1.1,JDK 8 MVC 框架
查看>>
《IP组播(第1卷)》一导读
查看>>
《高效能程序员的修炼》一学会读源代码
查看>>
3大军团、266个项目,菜鸟技术如何玩转双11项目管理?
查看>>
魅族隔空回应雷军:开放 Flyme 对抗 MIUI
查看>>
成为阿里云大使的笔记
查看>>
《深入解析IPv6(第3版)》——2.10 参考文献
查看>>