2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Linux 网络编程详解一(IP套接字结构体 网络字节序 地址转换函数)

Linux 网络编程详解一(IP套接字结构体 网络字节序 地址转换函数)

时间:2023-12-06 09:09:13

相关推荐

Linux 网络编程详解一(IP套接字结构体 网络字节序 地址转换函数)

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 <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <arpa/inet.h>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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。