1

我编写了一个简单的程序,使用 libevent 和这个示例代码同时连接到 Web 服务器

#include <stdio.h>
#include <event2/event.h> 
#include <evhttp.h>
#include <unistd.h>
#include <time.h>
#include <pthread.h>

int success_count = 0;
int failure_count = 0;
time_t start,end;

void _reqhandler(struct evhttp_request *req, void *state)
{
   printf("in _reqhandler. state == %s\n", (char *) state);
   if (req == NULL) {
       printf("timed out!\n");
       failure_count ++;
    } else if (req->response_code == 0) {
    printf("connection refused!\n");
    failure_count++;
    } else if (req->response_code != 200) {
    printf("error: %u %s\n", req->response_code, req->response_code_line);
    failure_count++;
    } else {
    printf("success: %u %s\n", req->response_code, req->response_code_line);
    success_count++;
    }
    evhttp_connection_free((evhttp_connection*)state);
}


void* thread_func(void* arg)
{
   printf("starting event loop..\n");
   sleep(1);
   event_base_dispatch((struct event_base*)arg);
   printf("returning");
}
int main(int argc, char *argv[])
{
    struct event_base* base = event_init();
    printf("Using Libevent with backend method %s.",event_base_get_method(base));   
    pthread_t id;
    int ret = pthread_create(&id,NULL,thread_func,base);
    int x = 10;
    start = time (NULL);
    while(x--){
        printf("%s\n","adding");
        const char *addr = "74.125.131.103";
        unsigned int port = 80;
        struct evhttp_connection *conn;
        struct evhttp_request *req;

        //printf("initializing libevent subsystem..\n");

        conn = evhttp_connection_new(addr, port);
        evhttp_connection_set_timeout(conn, 5);
        req = evhttp_request_new(_reqhandler, (void *)conn);
        evhttp_add_header(req->output_headers, "Host", addr);
        evhttp_add_header(req->output_headers, "Content-Length", "0");
        evhttp_make_request(conn, req, EVHTTP_REQ_GET, "/");
    }
    pthread_join( id, NULL);
    end = time(NULL);
    double dif = difftime(end,start);
    printf("total seconds taken: %.2lf for %d success connections and %d failed  
    connections\n", dif, success_count,failure_count);
    return 0;
}

我在一个带有 centos 的 vmware fusion 上运行它。问题是当我运行它时,我只得到服务器拒绝的连接。在对wireshark的进一步调查中,我意识到这段代码是从后面发出HTTP POST请求而不是GET请求,因此连接被拒绝。现在相同的代码在我的 mac 或 ubuntu 机器上运行良好。这似乎是虚拟操作系统的配置问题。谁能指出它可能是什么?这是我的虚拟操作系统发出的:

 POST / HTTP/1.1
 Host: 74.125.131.103
 Content-Length: 0

 HTTP/1.1 405 Method Not Allowed
4

0 回答 0