[关闭]
@Dubyoo 2017-08-15T03:00:00.000000Z 字数 1983 阅读 3335

2014-04-01 Linux网络编程 - 大端小端,ip转换

Linux网络编程


套接字(套接口)

它是网络进程的ID。网络通信就是(不同计算机)进程间的通信。

套接字是网络地址(IP)和端口号(PORT)的组合可以唯一确定整个网络中的一个网络进程。

TCP/IP协议中端口号范围0~65535。应用程序固定的端口0~1023,用户自定义的通常大于1024 。

socket

  1. //socket信息数据结构
  2. struct sockaddr
  3. {
  4. unsigned short sa_family; /*地址族*/
  5. char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/
  6. };
  7. struct sockaddr_in
  8. {
  9. short int sa_family; /*地址族*/
  10. unsigned short int sin_port; /*端口号*/
  11. struct in_addr sin_addr; /*IP地址*/
  12. unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/
  13. };
  14. struct in_addr
  15. {
  16. unsigned long int s_addr; /* 32位IPv4地址,网络字节序 */
  17. };

大端小端: 数据存储优先顺序的替换

计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。

  1. //举例:存放数据 0x12345678
  2. 向计算机内存中存放 32bit 数据 ---> 0x 12 34 56 78
  3. 数据高位 ---> 低位
  4. 小端存储:
  5. 低地址 ---> 高地址(低位低地址,高位高地址)
  6. | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
  7. | 0x78 | 0x56 | 0x34 | 0x12 |
  8. 大端存储:
  9. 低地址 ---> 高地址(高位低地址,低位高地址)
  10. | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
  11. | 0x12 | 0x34 | 0x56 | 0x78 |
  12. 网络中传输的数据字节序都是大端模式的
  13. #include <netinet/in.h>
  14. htons() //传入主机字节序的16位数值,返回网络字节序
  15. ntohs() //传入网络字节序的16位数值,返回主机字节序
  16. htonl() //传入主机字节序的32位数值,返回网络字节序
  17. ntohl() //传入网络字节序的32位数值,返回主机字节序
  18. h: host n: network s: short l: long
  19. 通常16位的端口号用short表示,32位的IP地址用long表示。
  1. /* test.c(测试本机是大端还是小端) */
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int a = 0x12345678;
  6. char * p ;
  7. p = (char*)&a ;
  8. if((*p) == 0x78)
  9. printf("your computer is small-endian\n") ;
  10. else if((*p) == 0x12)
  11. printf("your computer is big-endian\n") ;
  12. return 0 ;
  13. }

地址格式的转换

  1. // ipv4
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. int inet_aton(const char *straddr, struct in_addr *addrptr);
  6. /*将点分十进制数的IP地址转换成为网络字节序的32位二进制数值。返回值:成功,则返回1,不成功返回0 。*/
  7. /*参数straddr:存放输入的点分十进制数IP地址字符串。*/
  8. /*参数addrptr:传出参数,保存网络字节序的32位二进制数值。*/
  9. char * inet_ntoa(struct in_addr inaddr);
  10. /*将网络字节序的32位二进制数值转换为点分十进制的IP地址。*/
  11. in_addr_t inet_addr(const char *straddr);
  12. /*功能同inet_aton(),返回值不同。inet_addr()若成功则返回32位二进制的网络字节序地址。*/
  1. // ipv4 || ipv6
  2. #include <arpa/inet.h>
  3. int inet_pton(int family, const char *src, void *dst);
  4. /*同inet_aton(),
  5. family = AF_INET表示是IPv4
  6. family = AF_INET6,表示IPv6协议*/
  7. const char *inet_ntop(int family, const void *src, char *dst, socklen_t len);
  8. /*同inet_ntoa()
  9. family同上
  10. 其中len表示表示转换之后的长度(字符串的长度)。 */
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注