Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2151603
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-06-19 17:52:06

1. 两个结构体
1.1 sockaddr
  1. kernel/include/linux/socket.h
  2. struct sockaddr {
  3.     sa_family_t sa_family;      //协议族: AF_XXX
  4.     char sa_data[14];           //14字节的端口号+地址
  5. };
1.2 sockaddr_in
  1. kernel/include/linux/in.h
  2. struct in_addr {
  3.     __be32 s_addr;             //4个字节: 255.255.255.255
  4. };

  5. struct sockaddr_in {
  6.   sa_family_t sin_family;         //协议族: AF_XXX
  7.   __be16 sin_port;                //2字节的端口号
  8.   struct in_addr sin_addr;        //4字节的地址
  9. };
sockaddr与sockaddr_in的排列都是: 2字节的端口+4字节的地址+8字节的pad
所以两者可以直接转换

2. 两个结构体的转换
  1. char * sock_ntop(const struct sockaddr *sa, socklen_t salen)
  2. {
  3.     char portstr[8];
  4.     static char str[128]; /* Unix domain is largest */
  5.     struct sockaddr_in *sin = (struct sockaddr_in *) sa;
  6.     //只处理AF_INET: 先将4字节的数字地址转为字符串
  7.     if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
  8.         return(NULL);
  9.     //将2字节的数字端口号用snprintf转为字符串
  10.     if (ntohs(sin->sin_port) != 0) {
  11.         snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));
  12.         strcat(str, portstr);
  13.     }
  14.     return(str);
  15. }
sock_ntop的返回--> 127.0.0.1:52574
3. 分析
  1. 对sockaddr中的14字节打印如下:
  2. for(i=0; i<14; i++)
  3.     dbmsg("%d= 0x%x",i, (unsigned char)pcliaddr->sa_data[i]);

  4. udpserv.c:dg_echo[16]: 0= 0xb5
  5. udpserv.c:dg_echo[16]: 1= 0xba
  6. udpserv.c:dg_echo[16]: 2= 0x7f
  7. udpserv.c:dg_echo[16]: 3= 0x0
  8. udpserv.c:dg_echo[16]: 4= 0x0
  9. udpserv.c:dg_echo[16]: 5= 0x1
  10. udpserv.c:dg_echo[16]: 6= 0x0
  11. udpserv.c:dg_echo[16]: 7= 0x0
  12. udpserv.c:dg_echo[16]: 8= 0x0
  13. udpserv.c:dg_echo[16]: 9= 0x0
  14. udpserv.c:dg_echo[16]: 10= 0x0
  15. udpserv.c:dg_echo[16]: 11= 0x0
  16. udpserv.c:dg_echo[16]: 12= 0x0
  17. udpserv.c:dg_echo[16]: 13= 0x0
  18. 其中 0xb5 0xba = b5ba=46522 --> client的端口号
  19.      7f 00 00 01--> 127.0.0.1 --> client的地址

阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~