C ++ Winsock API如何在接受连接之前获取连接客户端IP?

时间:2009-04-04 00:54:27

标签: winsock

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

当有人试图连接时,如何在接受连接之前获取其IP地址?我试图让它只接受来自某些IP地址的连接。

由于

4 个答案:

答案 0 :(得分:6)

SO_CONDITIONAL_ACCEPT套接字选项。 Here

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

而且我不确定你认为会占用多少资源,但接受连接的程度非常低,并不会成为问题。放弃它们非常容易。

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

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

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

这可以做到,但你所说的是内核驱动程序。我不确定你是否可以在用户模式下执行此操作。

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

只是我自己的两分钱,和IMVHO ......

答案 3 :(得分:0)

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

修改

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

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

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