zoukankan      html  css  js  c++  java
  • 从SOCKADDR_STORAGE结构中取IP地址和端口

    本人在做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);
    取得端口的信息,方法同上,
    此问题困扰我几天了,在网上也没有找到关于此问题的答案,现把自己摸索出来的东东,发出来,
    交流,以获得更好的方法.
    完毕!!!

  • 相关阅读:
    基于Proxy的小程序状态管理
    还不会正则表达式?看这篇!
    Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG
    JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
    5种处理Vue异常的方法
    重构:一项常常被忽略的基本功
    SQL Server中使用SQL语句关闭数据库连接和删除数据库文件
    SQL Server使用加密连接SSL/TLS (转载)
    SQL Server使用sp_executesql在存储过程中执行多个批处理
    How to call a stored procedure in EF Core 3.0 via FromSqlRaw(转载)
  • 原文地址:https://www.cnblogs.com/xiaOt119/p/2538770.html
Copyright © 2011-2022 走看看