读书人

单机下万客户端连接

发布时间: 2012-10-13 11:38:17 作者: rapoo

单机上万客户端连接
转: http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3

#include <sys/types.h>#include <sys/time.h>#include <sys/queue.h>#include <stdlib.h>#include <err.h>#include <event.h>#include <evhttp.h>#include <unistd.h>#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <time.h>#include <pthread.h>#define BUFSIZE 4096#define NUMCONNS 62000#define SERVERADDR "74.125.71.99"#define SERVERPORT 80#define SLEEP_MS 10char buf[BUFSIZE];int bytes_recvd = 0;int chunks_recvd = 0;int closed = 0;int connected = 0;// called per chunk receivedvoid chunkcb(struct evhttp_request * req, void * arg){    int s = evbuffer_remove( req->input_buffer, &buf, BUFSIZE );    //printf("Read %d bytes: %s\n", s, &buf);    bytes_recvd += s;    chunks_recvd++;    if(connected >= NUMCONNS && chunks_recvd%10000==0)        printf(">Chunks: %d\tBytes: %d\tClosed: %d\n", chunks_recvd, bytes_recvd, closed);}// gets called when request completesvoid reqcb(struct evhttp_request * req, void * arg){    closed++;}int main(int argc, char **argv){    event_init();    struct evhttp *evhttp_connection;    struct evhttp_request *evhttp_request;    char addr[16];    char path[32]; // eg: "/test/123"    int i,octet;    for(octet=1; octet<=17; octet++){        sprintf(&addr, "172.17.3.%d", octet);        for(i=1;i<=NUMCONNS;i++) {            evhttp_connection = evhttp_connection_new(SERVERADDR, SERVERPORT);            evhttp_connection_set_local_address(evhttp_connection, &addr);            evhttp_set_timeout(evhttp_connection, 864000); // 10 day timeout            evhttp_request = evhttp_request_new(reqcb, NULL);            evhttp_request->chunk_cb = chunkcb;            sprintf(&path, "/?%d", ++connected);            if(i%100==0)  printf("Req: %s\t->\t%s\n", addr, &path);            evhttp_make_request( evhttp_connection, evhttp_request, EVHTTP_REQ_GET, path );            evhttp_connection_set_timeout(evhttp_request->evcon, 864000);            event_loop( EVLOOP_NONBLOCK );            if( connected % 200 == 0 )                printf("\nChunks: %d\tBytes: %d\tClosed: %d\n", chunks_recvd, bytes_recvd, closed);            usleep(SLEEP_MS*1000);        }    }    event_dispatch();    return 0;}

$ gcc -o httpclient httpclient.c -levent$ ./httpclient

# netstat -n | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'


读书人网 >编程

热点推荐