socket编程学习---(一)基本术语

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41572450/article/details/80044499

ipv4套接口地址结构

struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; 
in_port_t sin_port;  //2 byte
struct in_addr sin_addr; //4 byte
char sin_zero[8];
};

通用套接口地址结构

struct sockaddr{
uint8_t sin_len;
sa_family_t sin_family;
char sa_data[14];
};

大端字节序

最高有效位放在内存最低地址,最低有效位放在内存最高地址。

小端字节序

最高有效位放在内存最高地址,最低有效位放在内存最低地址。

主机字节序

x86 是小端字节序,ARM字节序可配置

网络字节序

人为规定位大端字节序

uint32_t x = 0x12345678;
uint8_t *p = (uint8_t *)&x;
printf("%0x %0x %0x %0x",p[0],p[1],p[2],p[3]);

字节序转换函数

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 ,s代表short,l代表long

地址转换函数

in_addr_t inet_addr(const char *cp); //1
char *inet_ntoa(struct in_addr in);  //2
int inet_aton(const char *cp,struct in_addr *inp);//3

//1 把点分ip转换成网络字节序返回
//2 把网络字节序转换成点分ip
//3 和1一样,但是从inp输出
例:

unsigned long addr = inet_ntoa("192.168.0.100");
printf("addr = %u",ntohl(addr));

struct in_addr ipaddr;
ipaddr.s_addr = addr;
printf("%s",inet_ntoa(ipaddr.s_addr));

套接字类型

流式套接字(SOCK_STREAM) —-TCP

面向连接的、可靠的数据传输,数据无差错、无重复的发送,且按发送顺序接收

数据报式套接字(sock_DGRAM) —-UDP

无连接服务、不提供无错保证、数据可能丢失或重复、且接收顺序混乱

原始套接字(SOCK_RAM)

猜你喜欢

转载自blog.csdn.net/weixin_41572450/article/details/80044499