服务端的 socket 如何知道客户端是通过什么 IP 地址连接过来的

马谦马谦马谦 C/C++评论1,150字数 363阅读 1 分 12 秒阅读模式

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

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

示例代码:

假设客户端地址是 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-5-15
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2020 年 5 月 9 日 21:36:29
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/how-to-get-destination-addr-in-server-socket.html
给socket分配随机端口 C/C++

给 socket 分配随机端口

客户端的 socket 不需要手动执行 bind 绑定地址,但这不意味着客户端 socket 真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行 connect 时,内核发现没有绑定端口,就会自动选择一个合...
I/O模型 编程语言

I/O 模型

一、 I/O 模型分类 unix 环境下有 5 中 IO 模型: 阻塞式 I/O 非阻塞式 I/O I/O 多路复用 信号驱动 I/O 异步 I/O(POSIX 中的 aio_系列函数) 常用的是前三种方式,特别是多路 I/O 复用...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证