【问题标题】:How to make a G-WAN servlet close its connection silently without sending any reply如何让 G-WAN servlet 静默关闭其连接而不发送任何回复
【发布时间】:2012-11-08 03:06:36
【问题描述】:

如何让 gwan 对某些请求不发送回复,即在不构建和发送回复的情况下让 servlet 静默关闭?

减少从服务器端传出的带宽很有用。

仅用于收集数据,无需向客户端响应任何内容。

【问题讨论】:

    标签: ddos g-wan


    【解决方案1】:

    您还可以通过执行类似(未经测试)的操作来关闭来自 servlet 的连接:

    #include <sys/socket.h>
    
    char buf[1024];
    int s = (int)get_env(argv, CLIENT_SOCKET);
    shutdown(s, SHUT_WR);
    while(read(s, buf, sizeof(buf)) > 0);
    close(s);
    return 500;
    

    然后像上面一样返回 500 这样您就不必建立回复。

    【讨论】:

    • 或者,我应该建议拥有一个gwan内置功能,即每当一个servlet返回500或444或0,类似的东西,gwan会静默关闭连接没有建立并向客户发送回复?是否很难在 gwan core 中添加 if-else 检查这个返回值?
    • 还不错:返回0;会这样做,它与处理程序的行为是一致的。好点子!
    • 非常感谢。等待实施。
    • K. K. Lou,您应该“接受”您的问题的答案,方法是单击其投票数以添加绿色对勾。
    【解决方案2】:

    您可以使用 gwan connection handler 来做到这一点。

    我认为这是您需要在处理程序上捕获的事件。由于您希望 servlet 运行,然后关闭连接。

    HDL_BEFORE_WRITE, // after a reply was built, but before it is sent
    

    这是connection handler 的示例代码。您仍然需要添加过滤器。此代码将在构建回复后关闭所有请求。

    int init(int argc, char *argv[])
    { 
       u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
       *states =  (1 << HDL_BEFORE_WRITE)
    }
    
    int main(int argc, char *argv[])
    {
        long state = (long)argv[0];
        if(state == HDL_BEFORE_WRITE)
        {
            return 0; // Close connection
        }
        return(255); // continue G-WAN's default execution path
    }
    

    【讨论】:

    • 对不起,我不知道在哪里使用 init() 函数。它会被 gwan 在内部使用,还是应该放在 main() 中的某个地方?
    • 你不需要调用它。 G-WAN 仅在加载时运行一次 init() 函数。当您指定要捕获的状态时,处理程序上的 main() 函数将在每个请求上被调用。 G-WAN 的文档和示例将使您更了解处理程序的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多