libevent简单使用

来源:互联网 发布:java电商系统源码 编辑:程序博客网 时间:2024/05/22 07:56

libevent的安装还是挺简单的,点击打开链接

服务器端

#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <event.h>#include <string.h>#define MEM_SIZ (1024)struct sock_ev {    struct event* read_ev;    struct event* write_ev;    char* buffer;};static struct event_base * base;#define release_sock(sock_ev)  do{  \event_del((sock_ev)->read_ev); \free((sock_ev)->read_ev);\free((sock_ev)->write_ev);\free((sock_ev)->buffer);\free(sock_ev);\}while(0)\void on_write(int sockfd, short event, void* arg){struct sock_ev * sock_ev;sock_ev = (struct sock_ev *)arg;printf("begin write.\n");send(sockfd, sock_ev->buffer, strlen(sock_ev->buffer), 0);free(sock_ev->buffer);sock_ev->buffer = NULL;}void on_read(int sockfd, short event, void* arg){struct sock_ev * sock_ev;ssize_t read_bytes;sock_ev = (struct sock_ev *)arg;sock_ev->buffer = (char *)malloc(MEM_SIZ);read_bytes = recv(sockfd, sock_ev->buffer, MEM_SIZ, 0);(sock_ev->buffer)[read_bytes] = 0;if(0 == read_bytes){release_sock(sock_ev);close(sockfd);return ;}printf("recv:%s\n", sock_ev->buffer);event_set(sock_ev->write_ev, sockfd, EV_WRITE, on_write, sock_ev);event_base_set(base, sock_ev->write_ev);event_add(sock_ev->write_ev, NULL);}void on_accept(int sockfd, short event, void* arg){struct sockaddr_in cli_addr;socklen_t addrlen;struct sock_ev * sock_ev;int cli_fd;cli_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addrlen);sock_ev= (struct sock_ev *)malloc(sizeof(struct sock_ev));sock_ev->read_ev = (struct event*)malloc(sizeof(struct event));sock_ev->write_ev = (struct event*)malloc(sizeof(struct event)); event_set(sock_ev->read_ev, cli_fd, EV_READ | EV_PERSIST, on_read, sock_ev);event_base_set(base, sock_ev->read_ev);event_add(sock_ev->read_ev, NULL);}int main(){int sock;int ret;int yes = 1;struct sockaddr_in my_addr;struct event listen_ev;sock = socket(AF_INET, SOCK_STREAM, 0);setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(9999);my_addr.sin_addr.s_addr =htonl(INADDR_ANY);ret = bind(sock, (struct sockaddr *)&my_addr, sizeof(my_addr));listen(sock, 5);   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;}
客户端

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <strings.h>#include <string.h>#include <errno.h>   int main(){int sockfd;int ret;struct sockaddr_in serv_addr;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);   serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(9999);inet_pton(AF_INET, "127.0.0.1", &(serv_addr.sin_addr));ret = connect(sockfd, (struct sockaddr *)&serv_addr,            sizeof(struct sockaddr_in));if(0 == ret){printf("connection established.\n");}else{printf("connection established failed. \n%d %s\n", ret, strerror(errno));return -1;}while(1){printf("Send:");scanf("%s", buffer);send(sockfd, buffer, strlen(buffer), 0);bzero(buffer, 1024);ret = recv(sockfd, buffer, 1024, 0);if(ret == 0){printf("connection failed.\n");break;}printf("Recv:%s\n", buffer);}return 0;}



0 0