拒绝来自主机的连接

Cal*_*ius 6 c++ sockets network-programming cross-platform

我正在使用套接字编写一个简单的tcp服务器应用程序.据我所知,我可以在调用accept()后获取客户端的IP地址和端口.

现在假设我有一个banlist,我想从我的服务器禁止一些IP地址.有没有比接受连接然后丢弃它更好的方法?

有没有办法在接受连接之前获取客户端的IP和端口?如果我们接受()为什么我们没有像垃圾()那样的东西?有没有办法拒绝连接或只是忽略来自主机的连接尝试?

mar*_*k4o 14

TCP实现通常在用户进程甚至可以访问连接之前完成TCP 3次握手,并且该accept()函数仅从队列中获取下一个连接.因此,假装服务器已关闭已为时已晚.这对于常规TCP数据的工作方式相同; TCP实现不会recv()在发送TCP ACK之前等待应用程序实际发送数据.这使得另一方不必要地重新传输正确接收的数据包,并允许吞吐量保持高,即使应用程序被其他东西陷入困境.在新连接(SYN数据包)的情况下,这也允许内核保护自己(和应用程序)免受SYN泛洪攻击.

虽然不可移植,但许多平台提供某种防火墙功能,允许根据IP地址/端口过滤传入连接.但是,这通常是在系统范围内配置,而不是由单个应用程序配置.