【问题标题】:How to get the client IP address before accepting the connection in C++如何在 C++ 中接受连接之前获取客户端 IP 地址
【发布时间】:2020-03-10 21:13:40
【问题描述】:

我正在学习 c++ 套接字编程... 服务器程序绑定到一个套接字并开始侦听连接请求...好的,现在我如何列出侦听请求的 IP 地址? 我知道我可以在接受连接后获取 IP 地址,但可以说我不想接受来自特定 IP 地址的连接...

【问题讨论】:

  • 您不应该使用防火墙来管理此类需求吗?
  • 哥们,我正在编程!!!
  • 我同意。这就是众多路由器/交换机安全规定的用途。如果 IP 在您的黑名单上,我认为您能做的最好的事情就是立即关闭连接。

标签: c++ sockets ip


【解决方案1】:

仅在 Windows 上,您可以使用 WinSock2 的 WSAAccept() 函数的条件回调功能在接受连接之前访问客户端信息,甚至在接受连接之前拒绝连接。

【讨论】:

  • 哇,我不知道这一点(尽管我认为我非常了解winsock2)。但我相信 TCP 驱动程序本身并不支持这些特定的东西。
【解决方案2】:

这在标准套接字 API 方面是无法做到的。在我所知道的所有平台上,系统实际上接受连接(即用 SYN+ACK TCP 数据报响应)应用程序有机会监控挂起的请求之前。 p>

【讨论】:

  • 除非您使用 UDP,否则您甚至不会大惊小怪。
  • 那么它在监听的时候会做什么呢?那么它会收集什么样的数据?
【解决方案3】:

为了获得最佳性能,这可以通过在网络堆栈中进行过滤来解决,但是这样做的细节将取决于操作系统(这不是套接字接口的一部分,您的应用程序通常甚至没有权限以这种方式配置您的网络堆栈。)

另一个机会是在accept 之后,此时连接已在 TCP 级别被接受 (CONNECT ACK)。

我认为你不能在你希望的中间阶段做到这一点。但是,无论如何,这与在accept 之后执行此操作没有太大区别。

【讨论】:

  • 我不是专家,但仅仅为了获取 IP 地址而接受连接不是很危险吗?
  • @user1378573,此时它已通过防火墙和网络上设置的所有检查 IP 地址等的所有内容。
  • @user1378573 - accept 调用不会授予任何人任何新权限。它只是使您可以通过套接字 API 访问您这边的单个连接。对方对你的伤害相对较小;拒绝服务攻击,或检测到您的端口已打开。但即使你不“接受”,他们也可以这样做。您无法在应用级别模拟防火墙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2016-01-01
  • 2013-05-18
  • 2012-12-26
  • 2010-11-28
相关资源
最近更新 更多