SOCKADDR_STORAGE结构中取IP地址和端口

本人在作IOCP模型的编程时,
遇到一个问题
就是从SOCKADDR_STORAGE结构中,取出客户的IP地址和端口,以利于统计
由于SOCKADDR_STORAGE结构比较复杂,并且兼容了IPV4和IPV6的版本,是直接取不出来的,
仔细研究"windows 网络编程"中的代码,意识到,无论怎么样,在收发消息的函数中,确定是要用到IP和Port信息的,
收发消息函数以下:
编程

1 rc=WSARecvFrom(sock->s,&wbuf,1,&bytes,&flags,(SOCKADDR*)&recvobj->addr,&recvobj->addrLen,&recvobj->ol,NULL);
2 rc = WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&sendobj->addr,sendobj->addrLen,&sendobj->ol,NULL);


这两个函数都用到告终构SOCKADDR,把SOCKADDR_STORAGE结构,强制转换成了SOCKADDR结构,
而SOCKADDR结构以下:

windows

1 struct sockaddr {
2 unsigned  short  sa_family;     /* address family, AF_xxx */
3 char  sa_data[14];                 /* 14 bytes of protocol address */
4 };


而在个人意识中,好像还有一个结构与于几乎是等价的,就是sockaddr_in结构,以下:

网络

1 struct  sockaddr_in {
2 short  int  sin_family;                      /* Address family */
3 unsigned  short  int  sin_port;       /* Port number */       此为端口
4 struct  in_addr  sin_addr;              /* Internet address */  此为IP地址,
5 unsigned  char  sin_zero[8];         /* Same size as struct sockaddr */
6 };


看到上面的结构,胜利就在眼前了,再加把劲

函数

1 in_addr结构定义以下:
2 struct  in_addr {
3 unsigned  long  s_addr;
4 };


从上述结构得知,IP地址是以无符号长整型方式存储的,可是在计算机中,是相似于"192.168.1.3"格式的
因此从sockaddr_in结构中取IP,确定有必定的函数,直接转换过来,查找资料得知
inet_ntoa()函数实现上述格式,即"192.168.1.3"
而inet_addr()函数恰与它相反,即把"192.168.1.3"转换为无符号长整型.

以上都准备好了,就能够进行转换了,以下:


spa

1 SOCKADDR_STORAGE    ssaddr;
2 int rc=WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&ssaddr,sendobj->addrLen,&sendobj->ol,NULL)


此函数调用成功后,ssaddr中会被填入对方(即客户)的IP地址和端口,
强制转换后:

code

1 char  *temp;
2 temp=inet_ntoa(((sockaddr_in*)((SOCKADDR*)&sendobj->addr))->sin_addr);




orm

1 temp=inet_ntoa(((sockaddr_in*)&sendobj->addr)->sin_addr);


取得端口的信息,方法同上ci

相关文章
相关标签/搜索