4

我正在使用 Winsock API(不是 CAsyncSocket)来创建一个侦听传入连接的套接字。

当有人尝试连接时,我怎样才能在接受连接之前获取他们的 IP 地址?我试图让它只接受来自某些 IP 地址的连接。

谢谢

4

4 回答 4

6

SO_CONDITIONAL_ACCEPT 套接字选项。这里

此外,很确定它在 XP 和 Server 2003 中可用,而不仅仅是在 Vista 中。

于 2009-06-09T02:07:21.500 回答
1

使用 ATM 时,CONNECT ACK 数据包将来自最近的交换机,而不是最终客户端。因此,您必须在套接字上调用 accept(),然后查看地址(基于传递的 addr_family),然后关闭套接字。当它到达请求者时,它可能只会失败。

而且我不确定您认为这会占用多少资源,但接受连接处于非常低的水平,并且不会成为真正的问题。丢弃它们很容易。

如果您受到 DoS 攻击,您的代码可以在预设的时间内退出侦听,因此如果您非常担心,攻击者只会失败。

客户端是否知道有一个套接字正在侦听真的很重要吗?尝试使用 telnet 连接到端口 137 上的本地主机,看看 Windows 中的文件共享断开连接的速度有多快......(如果你启用了它,并且我记得正确的端口号......呵呵......)

但是,在 SOCKET 级别,您将无法做您想做的事。您正在谈论深入到 TCP 级别,查看传入的连接请求,并在那里处理它们。

这是可以做到的,但是您正在谈论一个内核驱动程序来做到这一点。我不确定您是否可以在用户模式下执行此操作。

如果您需要内核帮助,请告诉我。我也许可以给你一些例子,或者指导。

只有我自己的两分钱,而且 IMVHO ......

于 2009-04-08T18:42:45.873 回答
1

我不想接受连接以检查远程 IP 地址的两个原因:

1)。客户端会看到此端口上有一个侦听套接字。如果我决定拒绝客户端连接,我不希望他们知道有一个套接字正在侦听此端口。

2)。这种技术效率不高,需要更多的 CPU、RAM 和网络使用;所以在拒绝服务攻击的情况下是不好的。

于 2009-04-04T01:45:24.260 回答
0

接受连接,查看IP,如果不允许,关闭连接

编辑

我假设你在谈论 TCP 连接。当您侦听端口并且连接来自客户端时,API 将执行 TCP 3 次握手,并且客户端将知道正在侦听此端口。

我不确定是否有办法阻止发送任何数据包(即接受连接),以便您可以先查看 IP 地址然后再决定。

我能想到的唯一方法是在网络层根据源IP进行包过滤(例如使用防火墙)。

于 2009-04-04T00:57:24.017 回答