一、Libev TCPecho服务端
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#include <netinet/in.h>
#include <strings.h>
#include <ev.h>
#define PORT 8333
#define BUFFER_SIZE 1024
//gcc test.c -lm ev.o
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
char buffer[BUFFER_SIZE];
ssize_t read;
if(EV_ERROR & revents)
{
printf("error event in read");
return;
}
read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
if(read < 0)
{
printf("read error,errno:%d\n", errno);
return;
}
else if(0 == read)
{
printf("someone disconnected.errno:%d\n", errno);
ev_io_stop(loop,watcher);
free(watcher);
return;
}
else
{
printf("get the message:%s\n", buffer);
}
send(watcher->fd, buffer, read, 0);
bzero(buffer, read);
}
void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sd;
struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));
if(EV_ERROR & revents)
{
printf("error event in accept\n");
return;
}
client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);
if (client_sd < 0)
{
printf("accept error\n");
return;
}
printf("someone connected.\n");
ev_io_init(w_client, read_cb, client_sd, EV_READ);
ev_io_start(loop, w_client);
}
int main()
{
struct ev_loop *loop = ev_default_loop(0);
int sd = -1;
struct sockaddr_in addr;
//int addr_len = sizeof(addr);
struct ev_io socket_watcher;
//ev_timer timeout_watcher;
if((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket error. errno:%d\n", errno);
return -1;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)
{
printf("bind error.errno:%d\n",errno);
return -1;
}
if(listen(sd, 2) < 0)
{
printf("listen error\n");
return -1;
}
printf("ev_loop beg\n") ;
//设置cb函数,字段等
ev_io_init(&socket_watcher, accept_cb, sd, EV_READ);
ev_io_start(loop, &socket_watcher);
//ev_timer_init(&timeout_watcher, timeout_cb, 2, 1);
//ev_timer_start(loop, &timeout_watcher);
while (1)
{
printf("ev_loop\n") ;
ev_loop(loop, 0);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <ev.h>
#include <errno.h>
#define PORT 8333
#define MAXDATASIZE 100
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
char buffer[MAXDATASIZE];
ssize_t read;
if(EV_ERROR & revents)
{
printf("error event in read");
return;
}
read = recv(watcher->fd, buffer, MAXDATASIZE, 0);
if(read < 0)
{
printf("read error,errno:%d\n", errno);
return;
}
else if(0 == read)
{
printf("someone disconnected.errno:%d\n", errno);
ev_io_stop(loop, watcher);
ev_break(EV_A_ EVBREAK_ALL);
return;
}
else
{
printf("get the message:%s\n", buffer);
}
//send(watcher->fd, buffer, read, 0);
//bzero(buffer, read);
}
int main(int argc, char *argv[])
{
struct ev_loop *loop = ev_default_loop(0);
int sockfd;
//char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
struct ev_io socket_watcher;
if (argc!=2)
{
printf("Usage:%s <IP Address>\n",argv[0]);
exit(1);
}
if((he=gethostbyname(argv[1]))==NULL)
{
printf("gethostbyname()error\n");
exit(1);
}
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1)
{
printf("socket()error\n");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family= AF_INET;
server.sin_port = htons(PORT);
server.sin_addr =*((struct in_addr *)he->h_addr);
if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
printf("connect()error\n");
exit(1);
}
//设置cb函数,字段等
ev_io_init(&socket_watcher, read_cb, sockfd, EV_READ);
ev_io_start(loop, &socket_watcher);
ev_run(loop, 0);
close(sockfd);
sockfd = -1;
return 0;
}