You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤传入的网络连接?

如何过滤传入的网络连接?

看起来你已经用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:13:08