从SOCKADDR_STORAGE结构中取IP地址和端口
来源:互联网 发布:小站tpo mac下载 编辑:程序博客网 时间:2024/05/29 15:03
本人在做IOCP模型的编程时,
遇到一个问题
就是从SOCKADDR_STORAGE结构中,取出客户的IP地址和端口,以利于统计
因为SOCKADDR_STORAGE结构比较复杂,而且兼容了IPV4和IPV6的版本,是直接取不出来的,
仔细研究"windows 网络编程"中的代码,意识到,不管怎么样,在收发消息的函数中,肯定是要用到IP和Port信息的,
收发消息函数如下:
rc=WSARecvFrom(sock->s,&wbuf,1,&bytes,&flags,(SOCKADDR*)&recvobj->addr,&recvobj->addrLen,&recvobj->ol,NULL);
rc = WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&sendobj->addr,sendobj->addrLen,&sendobj->ol,NULL);
这两个函数都用到了结构SOCKADDR,把SOCKADDR_STORAGE结构,强制转换成了SOCKADDR结构,
而SOCKADDR结构如下:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
而在我的意识中,好像还有一个结构与于几乎是等价的,就是sockaddr_in结构,如下:
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */ 此为端口
struct in_addr sin_addr; /* Internet address */ 此为IP地址,
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
看到上面的结构,胜利就在眼前了,再加把劲
in_addr结构定义如下:
struct in_addr {
unsigned long s_addr;
};
从上述结构得知,IP地址是以无符号长整型方式存储的,但是在计算机中,是类似于"192.168.1.3"格式的
所以从sockaddr_in结构中取IP,肯定有一定的函数,直接转换过来,查找资料得知
inet_ntoa()函数实现上述格式,即"192.168.1.3"
而inet_addr()函数恰与它相反,即把"192.168.1.3"转换为无符号长整型.
以上都准备好了,就可以进行转换了,如下:
SOCKADDR_STORAGE ssaddr;
int rc=WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&ssaddr,sendobj->addrLen,&sendobj->ol,NULL)
此函数调用成功后,ssaddr中会被填入对方(即客户)的IP地址和端口,
强制转换后:
char *temp;
temp=inet_ntoa(((sockaddr_in*)((SOCKADDR*)&sendobj->addr))->sin_addr);
或
temp=inet_ntoa(((sockaddr_in*)&sendobj->addr)->sin_addr);
取得端口的信息,方法同上,
此问题困扰我几天了,在网上也没有找到关于此问题的答案,现把自己摸索出来的东东,发出来,
交流,以获得更好的方法.
完毕!!!
遇到一个问题
就是从SOCKADDR_STORAGE结构中,取出客户的IP地址和端口,以利于统计
因为SOCKADDR_STORAGE结构比较复杂,而且兼容了IPV4和IPV6的版本,是直接取不出来的,
仔细研究"windows 网络编程"中的代码,意识到,不管怎么样,在收发消息的函数中,肯定是要用到IP和Port信息的,
收发消息函数如下:
rc=WSARecvFrom(sock->s,&wbuf,1,&bytes,&flags,(SOCKADDR*)&recvobj->addr,&recvobj->addrLen,&recvobj->ol,NULL);
rc = WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&sendobj->addr,sendobj->addrLen,&sendobj->ol,NULL);
这两个函数都用到了结构SOCKADDR,把SOCKADDR_STORAGE结构,强制转换成了SOCKADDR结构,
而SOCKADDR结构如下:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
而在我的意识中,好像还有一个结构与于几乎是等价的,就是sockaddr_in结构,如下:
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */ 此为端口
struct in_addr sin_addr; /* Internet address */ 此为IP地址,
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
看到上面的结构,胜利就在眼前了,再加把劲
in_addr结构定义如下:
struct in_addr {
unsigned long s_addr;
};
从上述结构得知,IP地址是以无符号长整型方式存储的,但是在计算机中,是类似于"192.168.1.3"格式的
所以从sockaddr_in结构中取IP,肯定有一定的函数,直接转换过来,查找资料得知
inet_ntoa()函数实现上述格式,即"192.168.1.3"
而inet_addr()函数恰与它相反,即把"192.168.1.3"转换为无符号长整型.
以上都准备好了,就可以进行转换了,如下:
SOCKADDR_STORAGE ssaddr;
int rc=WSASendTo(sock->s,&wbuf,1,&bytes,0,(SOCKADDR*)&ssaddr,sendobj->addrLen,&sendobj->ol,NULL)
此函数调用成功后,ssaddr中会被填入对方(即客户)的IP地址和端口,
强制转换后:
char *temp;
temp=inet_ntoa(((sockaddr_in*)((SOCKADDR*)&sendobj->addr))->sin_addr);
或
temp=inet_ntoa(((sockaddr_in*)&sendobj->addr)->sin_addr);
取得端口的信息,方法同上,
此问题困扰我几天了,在网上也没有找到关于此问题的答案,现把自己摸索出来的东东,发出来,
交流,以获得更好的方法.
完毕!!!
- 从SOCKADDR_STORAGE结构中取IP地址和端口
- 从SOCKADDR_STORAGE结构中取IP地址和端口 .
- 从sockaddr中取得Ip地址和端口号
- IP地址和端口
- IP地址和端口
- 从接收套接字中提取对方的ip地址和端口信息
- 【VS开发】从sockaddr中取得客户端或者数据源的Ip地址和端口号
- IP地址和端口号
- sockaddr中取得Ip地址和端口号
- 【web】项目中如何获取ip地址和端口号
- 从ip addr add和ifconfig的区别看linux网卡ip地址的结构
- 从ip addr add和ifconfig的区别看linux网卡ip地址的结构
- 从ip addr add和ifconfig的区别看linux网卡ip地址的结构
- 从ip addr add和ifconfig的区别看linux网卡ip地址的结构
- 从命令行取linux中eth0的IP地址学习awk
- 从dhcpd.lease中提取MAC和IP地址
- Winpcap中sockaddr_storage问题
- 在xfire中取客户端IP地址
- ORACLE删除重复数据的一种高效的方法(转)
- 建模、数据结构、算法?
- oracle 10g 体系结构
- 分布式的Flex开发
- Windows SDK入门浅谈 — 写给初学者
- 从SOCKADDR_STORAGE结构中取IP地址和端口
- WTL文档
- 自动匹配输入框
- KMP算法中next和nextval数组的计算方法
- 分析Windows和Linux动态库
- 隐藏显示在任务栏中的对话框程序
- 转php+mysql编码的一篇文章
- Ubuntu 7.04下Virtualbox安装及网络桥接
- 开始写技术文章