在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢?

实际上,当sockaddr_in.sin_family = AF_INET时,sockaddr = sockaddr_in。

据此,我们可以做一下转换,就可以利用 inet_ntoa() 来得到ip地址和端口号了:



    int new_fd = accept(sock, &clientAddr, &sin_size);

    )

    {

        ];

        bzero(msg,sizeof(msg));

        sprintf(msg,"accept failed");

        log::outputSysErr(msg);

    }

    else

    {

        // 将sockaddr强制转换为 sockaddr_in

        sockaddr_in sin;

        memncpy(&sin, &clientAddr, sizoef(sin));



        // 取得ip和端口号

        sprintf(info.ip, inet_ntoa(sin.sin_addr));

        info.port = sin.sin_port;

        info.sock = new_fd;

    }

上面说的“转换”看起来是不是有些奇怪?实际上,你可以通过真正意义上的强制转来转换:



sockaddr_in* pSin = (sockaddr_in*)&clientAddr;

而第一种方法,间接说明了另外一个意思:他们占用的内存大小是一样的,当sockaddr_in.sin_family = AF_INET时,他们的内存布局也一样的!看看sockaddr结构体自身就知道了,它仅仅是个char数组,大小与sockaddr_in等同:



/* Structure describing a generic socket address.  */

struct sockaddr

  {

    __SOCKADDR_COMMON (sa_); /* Common data: address family and length.  */

    ];  /* Address data.  */

  };

sockaddr_in的结构定义如下:



/* Structure describing an Internet socket address.  */

struct sockaddr_in

  {

    __SOCKADDR_COMMON (sin_);

    in_port_t sin_port;   /* Port number.  */

    struct in_addr sin_addr;  /* Internet address.  */



    /* Pad to size of `struct sockaddr'.  */

    unsigned char sin_zero[sizeof (struct sockaddr) -

      __SOCKADDR_COMMON_SIZE -

      sizeof (in_port_t) -

      sizeof (struct in_addr)];

  };



/* Ditto, for IPv6.  */

struct sockaddr_in6

  {

    __SOCKADDR_COMMON (sin6_);

    in_port_t sin6_port; /* Transport layer port # */

    uint32_t sin6_flowinfo; /* IPv6 flow information */

    struct in6_addr sin6_addr; /* IPv6 address */

    uint32_t sin6_scope_id; /* IPv6 scope-id */

  };

【VS开发】从sockaddr中取得客户端或者数据源的Ip地址和端口号的更多相关文章

  1. 从sockaddr中取得Ip地址和端口号

    在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢? ...

  2. 在ASP.NET Core中获取客户端和服务器端的IP地址(转载)

    随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...

  3. Websocket-Sharp获取客户端IP地址和端口号

    //OnOpen事件 protected override void OnOpen() { string IPAddress = base.Sessions.Sessions.First().Cont ...

  4. VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装

    VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装在阿里云开源镜像地址下载镜像Index of /centos/7.2.1511/isos/x86_64/http://mirro ...

  5. Java Web项目获取客户端和服务器的IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. 在tomcat5中发布项目时,用IP地址+端口不能访问项目,而用localhost加端口时可以访问成功

    最近在开发项目中,遇到的一个问题是: 在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/fm访问项目,不能用 http://127.0.0.1:8 ...

  7. Java中使用HttpRequest获取用户真实IP地址端口

    import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author X-rapido * ...

  8. Linux上DNS解析总是选择resolv.conf中第二位的DNS服务器IP地址

    问题现象: 在Linux机器上,用户自建了一台DNS服务器.然后改动/etc/resolv.conf将其服务器IP地址添加到第一项.将阿里云的内网DNS放到第二位,然而在测试过程中发现telnet,p ...

  9. LNAMP架构中后端Apache获取用户真实IP地址的2种方法(转)

    一.Nginx反向代理配置: 1.虚拟主机配置 复制代码代码如下: location / {    try_files $uri @apache;} location @apache {interna ...

随机推荐

  1. Day16:小前端

    回到顶部 <style type="text/css"> body { height: 8000px; } h1 { color: #000; } img { posi ...

  2. 修改windows网络参数,让上网更快

    管理员运行CMD,运行 netsh int tcp show global 查询活动状态... TCP 全局参数 ------------------------------------------- ...

  3. ORA-01033:ORACLE initialization or shutdown

    ora-01033 错误处理:DOS下依次执行以下命令sqlplus/nologconnect sys/密码@orcl as sysdbashutdown normalstartup mountSQL ...

  4. 第2组 团队Git现场编程实战

    目录 组员职责分工(1 2分) github 的提交日志截图(2 1分) 程序运行截图(3 3分) 程序运行环境(4 1分) GUI界面(5 5分) 基础功能实现(6 10分) 鼓励有想法且有用的功能 ...

  5. 【BZOJ】BZOJ3040 最短路 线段树优化Dijkstra

    题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数. ...

  6. 优雅地使用eruda在移动端上调试网页

    注:本文有一小部分截图为桌面端,但所有内容都亲测在移动端上可用. 你曾否在洛谷上用<F12>把错的数据点改成AC?是否有过自己尝试搭建网站,在移动端上js代码运行出错?如果你的回答是肯定的 ...

  7. Check if List<Int32> values are consecutive

    Check if List<Int32> values are consecutive One-liner, only iterates until the first non-conse ...

  8. ubuntu取消自动登录

    /etc/lightdm/lightdm.conf.d/50-nvidia.conf 注释 autologin-user=<YOUR USER>

  9. 《浅谈F5健康检查常用的几种方式》—那些你应该知道的知识(二)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sinat_17736151/articl ...

  10. Java开发手册-编程规约精选

    # Java开发手册-编程规约精选 ## 总约 - 采用驼峰写法 ## 变量 - 首字母小写 ## 方法 - 方法名首字母小写- 参数首字母小写 ## 引用 - <阿里巴巴Java开发手册> ...