无法在apache模块中保留连接套接字

时间:2012-08-06 02:52:58

标签: apache sockets module

我正在尝试使用套接字创建一个Apache模块以连接到其他服务器。它工作得很好,我可以检索数据,但我遇到了三个问题。

  1. 我无法保持与服务器的连接(每次请求后自动关闭)。
  2. 我在错误日志AH00052: child pid 7970 exit signal Segmentation fault (11)中为每个请求收到2个错误。
  3. 当我在浏览器上连续按f5时出现错误“未收到数据”。
  4. 这是我模块的代码:

    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <sys/select.h>
    
    #include "httpd.h"
    #include "http_config.h"
    #include "http_protocol.h"
    #include "ap_config.h"
    
    static int sockfd = -1;
    static struct sockaddr_in saddr;
    /* The sample content handler */
    static int search_handler(request_rec *r)
    {
        r->content_type = "text/html";
    
        ap_rprintf(r,"sockfd = %d<br>", sockfd);
        if(sockfd == -1){
                sockfd = socket(AF_INET, SOCK_STREAM, 0);
                struct hostent *server = gethostbyname("127.0.0.1");
                if(server == NULL ) return DECLINED;
                bzero((char *) &saddr, sizeof(saddr));
                saddr.sin_family = AF_INET;
                bcopy((char *)server->h_addr, (char *)&saddr.sin_addr.s_addr,server->h_length);
                saddr.sin_port = htons(9999);
                if(sockfd == -1) return DECLINED;
                if(connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
                        ap_rputs("Can't connect.\n", r);
                        return OK;
                }
        }
        send(sockfd, r->args, strlen(r->args), 0);
        fd_set read_sd;
        FD_ZERO(&read_sd);
        FD_SET(sockfd, &read_sd);
        int sel = select(sockfd + 1, &read_sd, 0, 0, 0);
        if(sel < 0) {close(sockfd);return DECLINED;}
        if( sel == 0) {ap_rprintf(r, "time out."); return OK;}
        char buf[5000];
        if(recv(sockfd, buf, 5000, 0) <= 0) return DECLINED;
        ap_rprintf(r, "%s<br>%d", buf, sockfd);
    
        return OK;
    }
    
    static void search_register_hooks(apr_pool_t *p)
    {
        ap_hook_handler(search_handler, NULL, NULL, APR_HOOK_LAST);
    }
    
    /* Dispatch list for API hooks */
    module AP_MODULE_DECLARE_DATA search_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    search_register_hooks  /* register hooks                      */
    };
    

    我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不是一个明确的答案,但我相信您必须在模块中使用apache pools进行资源管理。