zoukankan      html  css  js  c++  java
  • 服务器搭建3 安装libevent2.0.20

    1.检测是否安装

    安装了的话应该是这样的:如果不是,那就装一下。

    root@iZ23nyl8frqZ:/home/upload# ls -a /usr/lib |grep libevent
    libevent-2.0.so.5
    libevent-2.0.so.5.1.9
    libevent.a
    libevent_core-2.0.so.5
    libevent_core-2.0.so.5.1.9
    libevent_core.a
    libevent_core.la
    libevent_core.so
    libevent_extra-2.0.so.5
    libevent_extra-2.0.so.5.1.9
    libevent_extra.a
    libevent_extra.la
    libevent_extra.so
    libevent.la
    libevent_pthreads-2.0.so.5
    libevent_pthreads-2.0.so.5.1.9
    libevent_pthreads.a
    libevent_pthreads.la
    libevent_pthreads.so
    libevent.so

    2.下载

    http://libevent.org/

    3.安装

    tar -xf libevent-2.0.22-stable.tar.gz
    
    ./configure –prefix=/usr         //配置目录
    make
    sudo make install

    4.验证

    root@iZ23nyl8frqZ:/home/upload# ls -a /usr/lib |grep libevent
    libevent-2.0.so.5
    libevent-2.0.so.5.1.9
    libevent.a
    libevent_core-2.0.so.5
    libevent_core-2.0.so.5.1.9
    libevent_core.a
    libevent_core.la
    libevent_core.so
    libevent_extra-2.0.so.5
    libevent_extra-2.0.so.5.1.9
    libevent_extra.a
    libevent_extra.la
    libevent_extra.so
    libevent.la
    libevent_pthreads-2.0.so.5
    libevent_pthreads-2.0.so.5.1.9
    libevent_pthreads.a
    libevent_pthreads.la
    libevent_pthreads.so
    libevent.so

    5.测试

    服务器端ser.c

    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <string.h>
    #include <event.h>
    #include <stdlib.h>
    
    #define PORT        25341
    #define BACKLOG     5
    #define MEM_SIZE    1024
    
    struct event_base* base;
    struct sock_ev
    {
        struct event* read_ev;
        struct event* write_ev;
        char* buffer;
    };
    
    void release_sock_event(struct sock_ev* ev)
    {
        event_del(ev->read_ev);
        free(ev->read_ev);
        free(ev->write_ev);
        free(ev->buffer);
        free(ev);
    }
    
    void on_write(int sock, short event, void* arg)
    {
        char* buffer = (char*)arg;
        send(sock, buffer, strlen(buffer), 0);
    
        free(buffer);
    }
    
    void on_read(int sock, short event, void* arg)
    {
        struct event* write_ev;
        int size;
        struct sock_ev* ev = (struct sock_ev*)arg;
        ev->buffer = (char*)malloc(MEM_SIZE);
        bzero(ev->buffer, MEM_SIZE);
        size = recv(sock, ev->buffer, MEM_SIZE, 0);
        printf("receive data:%s, size:%d
    ", ev->buffer, size);
        if (size == 0) 
        {
            release_sock_event(ev);
            close(sock);
            return;
        }
        event_set(ev->write_ev, sock, EV_WRITE, on_write, ev->buffer);
        event_base_set(base, ev->write_ev);
        event_add(ev->write_ev, NULL);
    }
    
    void on_accept(int sock, short event, void* arg)
    {
        struct sockaddr_in cli_addr;
        int newfd, sin_size;
        struct sock_ev* ev = (struct sock_ev*)malloc(sizeof(struct sock_ev));
        ev->read_ev = (struct event*)malloc(sizeof(struct event));
        ev->write_ev = (struct event*)malloc(sizeof(struct event));
        sin_size = sizeof(struct sockaddr_in);
        newfd = accept(sock, (struct sockaddr*)&cli_addr, &sin_size);
        event_set(ev->read_ev, newfd, EV_READ|EV_PERSIST, on_read, ev);
        event_base_set(base, ev->read_ev);
        event_add(ev->read_ev, NULL);
    }
    
    int main(int argc, char* argv[])
    {
        struct sockaddr_in my_addr;
        int sock;
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
        int yes = 1;
        setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sin_family = AF_INET;
        my_addr.sin_port = htons(PORT);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        bind(sock, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
        listen(sock, BACKLOG);
    
        struct event listen_ev;
        base = event_base_new();
        event_set(&listen_ev, sock, EV_READ|EV_PERSIST, on_accept, NULL);
        event_base_set(base, &listen_ev);
        event_add(&listen_ev, NULL);
        event_base_dispatch(base);
    
        return 0;
    }

    客户端client.c:

    #include <unistd.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <string.h>
    #define cerror(str) do{perror(str); exit(EXIT_FAILURE); }while(0)
    
    static int port; 
    static char addr[256];
    static int nlen;
    static char msg[]="hello
    ";
    int main(int argc, char*argv[])
    {
        int fd;
        struct sockaddr_in sin;
        
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
      
        if(argc<3)
        {
            port = 8888;
        }else
        {
            port = atoi(argv[2]);
        }
        
        sin.sin_port = htons(port);
        
        if(argc<2)
        {
            strcpy(addr, argv[1]);
            if (inet_pton(AF_INET, addr, &(sin.sin_addr) )<0)
            {
                 struct hostent *psh;  
                 psh=gethostbyname(addr);
                 if(psh!=NULL)
                    inet_pton(AF_INET, psh->h_addr, &(sin.sin_addr) );
                 else
                    cerror("inet_pton");
            }
        }
        
        if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
            cerror("socket");
        
        if(connect(fd, (struct sockaddr*)&sin, sizeof(sin))<0 )
            cerror("sonnect");
        
        if( (nlen = write(fd,msg, strlen(msg)))<0 )
            cerror("write");
            
        if( (nlen = read(fd,msg, strlen(msg)))<0 )
            cerror("read");
        msg[nlen]='';
        printf("msg: %s
    ", msg);
        return 0;
    }

    编译

    chen@chen-book1:~/libevent20/sample$ gcc echo_client.c -o client
    chen@chen-book1:~/libevent20/sample$ gcc ser.c -o ser -levent
    chen@chen-book1:~/libevent20/sample$ ./ser &
    [1] 6995
    chen@chen-book1:~/libevent20/sample$ ./client localhost 25341
    receive data:hello
    , size:6
    msg: hello
    
    receive data:, size:0
    chen@chen-book1:~/libevent20/sample$ ./client localhost 25341
    receive data:hello
    , size:6
    msg: hello
  • 相关阅读:
    【转】Redis主从复制简介
    Redis配置文件详解
    Redis在Windows环境下搭建
    Redis桌面管理工具 RedisDesktopManager
    Redis服务停止报错解决方案[NOAUTH Authentication required]
    Redis启动警告错误解决
    修改tcp内核参数:somaxconn
    CentOS6.8安装Redis3.2.5
    Github之协同开发
    自定义实现栈的功能
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/5800714.html
Copyright © 2011-2022 走看看