问题场景:服务器有多个网卡,分别绑定了地址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后可以得到对方的地址。
此处评论已关闭