簡單的libevent例子

   現在用libevent做一個簡單的字符串轉大寫的服務器程序,具體就是客戶端發送過來一串字符串,然後服務器返回該字符串的大寫形式。


服務器端代碼

#include <unistd.h>
#include <event.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
char* touppers(char* lpstr,int num)
{
    int i=0;
    char* p = lpstr;
    for(;i<num;++i)
    {
        p[i] = toupper(p[i]);
    }
    return lpstr;
}
void
readcb(struct bufferevent *bev, void *ctx)
{
    struct evbuffer *input, *output;
    char *line;
    size_t nread,size,ret;
    char* buffer = NULL;
                                                                                                                              
    input = bufferevent_get_input(bev);
    output = bufferevent_get_output(bev);
    size = evbuffer_get_length(input);
    buffer = (char*)malloc(size+1);
    if(buffer == NULL)
        perror("malloc error");
    memset(buffer,0,size+1);
    nread = evbuffer_remove(input,buffer,size+1);
    printf("in data:%s\n",buffer);
                                                                                                                              
    touppers(buffer,size);
                                                                                                                              
    ret = evbuffer_add(output,buffer,size);
    if(ret == -1)
        perror("add data to buffer failed");
    free(buffer);
}
void
do_accept(evutil_socket_t listener, short event, void *arg)
{
    struct event_base *base = arg;
    struct sockaddr_storage ss;
    socklen_t slen = sizeof(ss);
    int fd = accept(listener, (struct sockaddr*)&ss, &slen);
    if (fd < 0)
    {
        perror("accept");
    }
    else if (fd > FD_SETSIZE)
    {
        close(fd);
    }
    else
    {
        struct bufferevent *bev;
        struct timeval newtime;
        evutil_gettimeofday(&newtime,NULL);
        printf("----accept..%d\n",newtime);
                                                                                                                                  
        evutil_make_socket_nonblocking(fd);
        bev = bufferevent_socket_new(base, fd, 0);
        bufferevent_setcb(bev, readcb, NULL, NULL, NULL);
        bufferevent_setwatermark(bev, EV_READ, 0, 0);
        bufferevent_enable(bev, EV_READ|EV_WRITE);
    }
}
int main()
{
    evutil_socket_t listener;
    struct sockaddr_in sin;
    struct event_base* base;
    struct event* listener_event;
                                                                                                                              
    base = event_base_new();
    if(!base)
        return -2;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = 0;
    sin.sin_port = htons(32000);
                                                                                                                              
    listener = socket(AF_INET,SOCK_STREAM,0);
    evutil_make_socket_nonblocking(listener);
                                                                                                                              
    if (bind(listener, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        perror("bind");
        return -2;
    }
    if (listen(listener, 32)<0)
    {
        perror("listen");
        return -2;
    }
    listener_event = event_new(base, listener, EV_READ | EV_PERSIST, do_accept, (void*)base);
    event_add(listener_event, NULL);
    event_base_dispatch(base);
                                                                                                                              
    return 0;
}


寫個簡單的Makefile文件方便編譯

main:main.c

gcc main.c -o main -levent -Wl,-rpath,/usr/local/lib


客戶端是簡單python腳本

import socket
HOST = '10.10.15.194'   
PORT = 32000           
sdata = ['hello world','you are','baby','do....just..all']
rdata = ''
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'connect to server..'
s.connect((HOST, PORT))
for data in sdata:
    print 'send data ',data
    s.sendall(data)
    print 'recv..'
    rdata = s.recv(len(data))
    print 'Received', repr(rdata),'\n'
s.close()



程序運行客戶和服務器輸出截圖

wKioL1MDPmrzesLmAAIJuvUyIyM488.jpg

wKiom1MDPo-xI9Y5AAEm3g5b_6Y670.jpg



然後我用loadrunner做了個測試,跑了100個用戶,每個用戶就是不停的往服務器發字符串,然後在退出的階段報了錯,然後一看服務器的程序已經死掉了,具體原因還不清楚,

wKioL1MDP2XyVVGRAADKvASTeqc469.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章