sockaddr_in , sockaddr , in_addr的区别
来源:互联网 发布:wish优化 编辑:程序博客网 时间:2024/05/02 21:18
1.
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
2.
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
3.
struct in_addr就是32位IP地址。
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
};
inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。
主机字节序:
不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。最常见的有两种 1.Little endian:低字节存高地址,高字节存低地址 2.Big endian:低字节存低地址,高字节存高地址
网络字节序:
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换bsd socket提供了转换的函数,有下面四个网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
htons 把unsigned short类型从主机序转换到网络序,htonl 把unsigned long类型从主机序转换到网络序,ntohs 把unsigned short类型从网络序转换到主机序,ntohl 把unsigned long类型从网络序转换到主机序。
在使用little endian的系统中 这些函数会把字节序进行转换 在使用big endian类型的系统中这些函数会定义成空宏
- sockaddr_in & sockaddr & in_addr 的区别
- sockaddr_in , sockaddr , in_addr的区别
- sockaddr_in、sockaddr(SOCKADDR)、in_addr 的区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别 .
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- sockaddr_in , sockaddr , in_addr区别
- 雪中送炭论
- 使用C#和Excel进行报表开发(四)-复制单元格
- fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'ARM
- 和菜鸟一起学linux总线驱动之初识spi总线协议
- editplus 保存时 去掉txt.bak文件
- sockaddr_in , sockaddr , in_addr的区别
- 推荐一系列优秀的Android开发源码
- CRM2011和CRM4.0表单区别
- 马尔科夫模型
- Extjs3.3.1 gridview focusRow函数在FIREFOX下的bug
- lotus domino¬es版本和补丁说明
- jQuery Ajax 全解析
- VS错误error C3872: '0x3000': this character is not allowed in an identifier
- android 数据库操作