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;
}