Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7711
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-25 12:51
文章分类

全部博文(2)

文章存档

2016年(2)

我的朋友
最近访客

分类: C/C++

2016-08-25 15:06:37

1、socket类型说明和地址转换函数例子

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <arpa/inet.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #if 0
  7. typedef uint32_t in_addr_t

  8. typedef unsigned short sa_family_t;
  9. #define __CONST_SOCKADDR_ARG  __const struct sockaddr *
  10. #define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family
  11. #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
  12. typedef uint16_t in_port_t; /* Type to represent a port. */
  13. struct in_addr { /* struct in_addr其实就是32位IP地址 */
  14.         unsigned long s_addr;
  15. };

  16. struct sockaddr {
  17.         sa_family_t sa_family; /* address family, AF_xxx */
  18.         char sa_data[14]; /* 14 bytes of protocol address */
  19. }
  20. struct sockaddr_in
  21. {
  22.     __SOCKADDR_COMMON (sin_);
  23.     in_port_t sin_port; /* Port number. */
  24.     struct in_addr sin_addr; /* Internet address. */
  25.     /* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小
  26.      和结构体struct sockaddr的大小相等
  27.      */
  28.     /* Pad to size of `struct sockaddr'. */
  29.     unsigned char sin_zero[sizeof (struct sockaddr) -
  30.                            __SOCKADDR_COMMON_SIZE -
  31.                            sizeof (in_port_t) -
  32.                            sizeof (struct in_addr)];
  33. };
  34. #endif

  35. int main(int argc, char *argv[])
  36. {
  37.     in_addr_t net;
  38.     in_addr_t hostID, netID;
  39.     struct in_addr NetHostAddr;
  40.     struct in_addr net_addr, ret;
  41.     char buf[128];
  42.     /*1、IPv4地址转换 */
  43.     /* 1.1、32位与点分十进制转换 */
  44.     net = inet_addr("192.168.3.1");//转换为网络字节顺序
  45.     net_addr.s_addr = net;
  46.     printf("inet_ntoa:%s\n", inet_ntoa(net_addr));
  47.     
  48.     inet_aton("192.168.3.2", &ret);
  49.     printf("ret.s_addr=%x\n", ret.s_addr);
  50.     printf("inet_ntoa:%s\n", inet_ntoa(ret));
  51.     printf("\n");
  52.     
  53.     /* 1.2、点分十进制转换为32位*/
  54.     net = inet_addr("192.168.3.1");//点分十进制转换为32位网络字节顺序
  55.     printf("inet_addr(192.168.3.1)=0x%x %02x %02x %02x %02x \n", net, net>>24&0xff, net>>16&0xff, net>>8&0xff, net&0xff);
  56.     net = inet_network("192.168.3.1");//点分十进制转换为32位主机字节顺序
  57.     printf("inet_network(192.168.3.1)=0x%x %02x %02x %02x %02x \n", net, net>>24&0xff, net>>16&0xff, net>>8&0xff, net&0xff);

  58.     /*3、基于地址类型转换 */
  59.     inet_pton(AF_INET, "192.168.3.10", &ret);
  60.     inet_ntop(AF_INET, &ret, buf, 128);
  61.     printf("buf=%s\n",buf);

  62.     /*4、通过IP地址获取网络ID和主机ID */
  63.     inet_aton("192.168.3.4", &NetHostAddr);
  64.     printf("\nNetHostAddr.s_addr=%x\n", NetHostAddr.s_addr);
  65.     hostID = inet_lnaof(NetHostAddr);//提取主机ID
  66.     printf("inet_lnaof:%x\n", hostID);
  67.     netID = inet_netof(NetHostAddr);
  68.     printf("inet_netof:%x\n", netID);
  69.     NetHostAddr = inet_makeaddr(netID, hostID);
  70.     printf("inet_makeaddr:%x\n", NetHostAddr.s_addr);
  71. }

阅读(735) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:字节顺序与大小端问题整理

给主人留下些什么吧!~~