nginxnginx-module

An output problem about nginx module?How to fix it?


I'm new to nginx and I'm trying to develope a simple nginx module,a handler module specifically. Although it's not what I really wanna do,I try to finish this task first. I'm trying to get the socketfd when a browser(or a client) connects to nginx.And I have get it successfully.However, when I tried to output something using dup2(),the nginx is always pending and just outputs nothing.Sometimes I can get output after a long time and once I stop nginx like nginx -s stop,and the output appears immediately.

Like this: reach http://100.100.60.199/nc?search=123456 get search=123456 HTTP/1.l HOST

output

I have read some blogs about nginx module and I found that handler module has its own pattern (to my understanding?).For example, the output should be nginx_chain_t,and I should construct that chain instead of using dup2 like a regular c code.So I wonder if it's feasible to get output like the function below.

Here is my handler function:

static ngx_int_t ngx_http_nc_handler(ngx_http_request_t *r){
    //ngx_int_t rc;
    ngx_socket_t connfd = r->connection->fd;
    int nZero=0;
    //if(setsockopt(connfd,SOL_SOCKET,SO_SNDBUF,(const void*)&nZero,sizeof(nZero))==0)
    if(setsockopt(connfd,IPPROTO_TCP,TCP_NODELAY,(const void*)&nZero,sizeof(int))==0){
        setbuf(stdout,NULL); 
        setbuf(stdin,NULL);
        setbuf(stderr,NULL);
        dup2(connfd,STDOUT_FILENO); 
        dup2(connfd,STDERR_FILENO);
        dup2(connfd,STDIN_FILENO);
        printf("%s\n", r->args.data);
        //close(connfd);
    }
    return NGX_OK;
}

So I wonder if it's feasible,how can I get things right using the method above or can anybody just say it's impossible and construct a chain is the only way?


Solution

  • I finally solved this problem by trying to understand how exactly nginx works.In short,all I need to do is to add a http header to the output.But it's not that easy like what I described.