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 フュージョンで実行しています。問題は、それを実行すると、サーバーからのみ接続が拒否されることです。Wireshark でさらに調査したところ、このコードが背後から GET ではなく HTTP POST リクエストを作成しているため、接続が拒否されたことがわかりました。現在、同じコードが私の Mac または ubuntu マシンでうまく機能します。仮想OSの構成の問題のようです。誰かがそれが何であるかを指摘できますか? これは私の仮想OSが送信しているものです:

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

 HTTP/1.1 405 Method Not Allowed
4

0 に答える 0