问题场景:服务器有多个网卡,分别绑定了地址A、地址B和地址C,当客户端连接请求过来的时候,如何知道是从哪个IP地址请求过来的?

解决方案:服务端accept客户端的连接后,对这个新接受的socket进行getsockname就可以了。

示例代码:

fd = accept(listen_fd, (struct sockaddr *)&addr, &addr_len);
if (fd < 0) {
    // xxxx
} else {
    getsockname(fd, (struct sockaddr *)&fd_addr, &addr_len);
    // fd_addr此时就保存了客户端连接过来的目的地址
}

假设客户端地址是1.1.1.1,通过connect(2.2.2.2)过来,此时拿到的就是2.2.2.2这个地址。

拓展

getsockname和getpeername:

  • getsockname:获取当前socket绑定的地址,执行bind后可以获取当前socket的地址信息,执行accept后可以获取对端连入的地址。
  • getpeername:获取对端socket绑定的地址,connect或者accept后可以得到对方的地址。
最后修改:2020 年 05 月 15 日
如果觉得我的文章对你有用,请随意赞赏