关于nginx模块的输出问题?如何解决?
An output problem about nginx module?How to fix it?
我是 nginx 的新手,我正在尝试开发一个简单的 nginx 模块,特别是一个处理程序模块。虽然这不是我真正想做的事,但我还是尽量先完成这个任务。我试图在浏览器(或客户端)连接到 nginx.And 时获取 socketfd 我已经得到它 successfully.However,当我尝试使用 dup2() 输出某些内容时,nginx 始终挂起并且只是输出 nothing.Sometimes 我可以在很长一段时间后得到输出,一旦我像 nginx -s stop 这样停止 nginx,输出就会立即出现。
像这样:
达到 http://100.100.60.199/nc?search=123456
得到
搜索=123456 HTTP/1.l
主机
output
我读了一些关于 nginx 模块的博客,我发现 handler 模块有自己的模式(据我所知?)。例如,输出应该是 nginx_chain_t,我应该构建那个链像常规 c 一样使用 dup2 code.So 我想知道是否可以像下面的函数那样获得输出。
这是我的处理函数:
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;
}
所以我想知道它是否可行,我怎样才能使用上面的方法把事情做好,或者有人能说这是不可能的,而构建链是唯一的方法吗?
我终于解决了这个问题,试图理解nginx works.In 到底有多短,我需要做的就是在 output.But 中添加一个 http header 没那么容易就像我描述的那样。
我是 nginx 的新手,我正在尝试开发一个简单的 nginx 模块,特别是一个处理程序模块。虽然这不是我真正想做的事,但我还是尽量先完成这个任务。我试图在浏览器(或客户端)连接到 nginx.And 时获取 socketfd 我已经得到它 successfully.However,当我尝试使用 dup2() 输出某些内容时,nginx 始终挂起并且只是输出 nothing.Sometimes 我可以在很长一段时间后得到输出,一旦我像 nginx -s stop 这样停止 nginx,输出就会立即出现。
像这样: 达到 http://100.100.60.199/nc?search=123456 得到 搜索=123456 HTTP/1.l 主机
output
我读了一些关于 nginx 模块的博客,我发现 handler 模块有自己的模式(据我所知?)。例如,输出应该是 nginx_chain_t,我应该构建那个链像常规 c 一样使用 dup2 code.So 我想知道是否可以像下面的函数那样获得输出。
这是我的处理函数:
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;
}
所以我想知道它是否可行,我怎样才能使用上面的方法把事情做好,或者有人能说这是不可能的,而构建链是唯一的方法吗?
我终于解决了这个问题,试图理解nginx works.In 到底有多短,我需要做的就是在 output.But 中添加一个 http header 没那么容易就像我描述的那样。