如何过滤传入的网络连接?
如何过滤传入的网络连接?
看起来你已经用select在监听监听套接字的连接请求了,不过现在想搞清楚怎么过滤这些传入的连接对吧?我来给你唠唠具体的做法~
首先得明确:select只是告诉你有连接请求过来了,但真正能拿到客户端的关键信息(比如IP、端口,甚至协议内容),是在调用accept()之后。所以过滤逻辑肯定是要放在accept之后来做的。
先看看你现有的代码片段:
while (!InterruptWaitForConnections) { const int status = select(ListenSocket+1, &readfds, writefds, exceptfds, timeout); if (status == -1) { // ERROR: do something return false; } else if (status > 0) { // - The socket buffer has data // - Check if it is a valid connection } }
接下来给你一步步加过滤逻辑:
第一步:先调用
accept()拿到客户端套接字和地址信息
这一步能让你获取到发起连接的客户端的IP、端口这些核心信息,是过滤的基础。第二步:根据你的需求写过滤规则
比如你要做IP白名单、端口黑名单,或者校验协议合法性,都在这一步处理:- 如果客户端符合你的规则,再启动线程去处理这个连接;
- 如果不符合,直接关闭客户端套接字,忽略这个连接就行。
给你改个示例代码,比如做IP白名单过滤:
#include <arpa/inet.h> // 别忘了加对应的头文件 while (!InterruptWaitForConnections) { const int status = select(ListenSocket+1, &readfds, writefds, exceptfds, timeout); if (status == -1) { // ERROR: do something return false; } else if (status > 0) { // 先accept拿到客户端的地址和套接字 struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); int client_sock = accept(ListenSocket, (struct sockaddr*)&client_addr, &addr_len); if (client_sock == -1) { // 处理accept失败的情况,直接跳过 continue; } // 提取客户端IP地址 char client_ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN); // 这里写你的过滤逻辑:比如只允许指定IP的客户端连接 int is_valid = 0; const char* allowed_ips[] = {"192.168.1.100", "192.168.1.200"}; int allowed_count = sizeof(allowed_ips)/sizeof(allowed_ips[0]); for (int i=0; i<allowed_count; i++) { if (strcmp(client_ip, allowed_ips[i]) == 0) { is_valid = 1; break; } } if (is_valid) { // 符合规则,启动线程处理这个连接 // 这里替换成你实际启动线程的代码,比如pthread_create相关逻辑 handle_client_connection(client_sock); } else { // 不符合规则,直接关闭套接字,拒绝连接 close(client_sock); } } }
另外还有几种过滤思路可以参考:
- 端口过滤:如果要拒绝某个特定端口的客户端连接,可以通过
ntohs(client_addr.sin_port)拿到客户端端口,然后判断是否在黑名单里 - 协议校验:如果你的服务有特定的握手协议,可以在
accept之后先recv一小段数据,检查是否符合协议格式,不符合就直接断开 - 连接频率限制:如果怕被恶意连接,可以记录每个IP的连接频率,超过阈值就暂时拒绝
总之核心思路就是:先accept拿到客户端的所有信息,再根据你的业务规则做判断,符合才处理,不符合直接断开就行~
备注:内容来源于stack exchange,提问作者IVANEZEDITIONS
相关产品推荐
相关产品推荐

