服务端的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复用...
epoll中的边缘触发ET和水平触发LT模式 C/C++

epoll中的边缘触发ET和水平触发LT模式

epoll中的触发模式有两种,边缘触发和水平触发,默认情况下使用的是水平触发。 边缘触发(ET)的意思是当电平出现变化的时候才触发事件,如果设置了边缘触发,执行epoll_wait时,内核检测到数据到...
匿名

发表评论

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

拖动滑块以完成验证