这个代码没有参考价值,大家不用看了
如果想看看实现的话参考这个吧:https://github.com/Addision/libevent_thread.git
只是windows 环境下, linux 需要自己写个cmake编译
服务器端代码:
#include "lib_net.h"
#include "lib_thread.h"
#include "lib_public.h"
#include<event.h>
#include<event2/util.h>
#define BACKLOG 10
#define MAX_EVENTS 500
char ip[24];
short port;
struct st_listenserv
{
int sockfd;
struct event *ev_listen;
struct event_base *base;
};
struct st_connserv
{
int clifd;
struct event_base *base;
struct event *ev_read;
struct event *ev_write;
char buf[1024];
};
void initsocket(struct st_listenserv *listenserv);
void accept_cb(int fd, short events, void *arg);
void read_cb(int fd, short events, void *arg);
void send_cb(int fd, short events, void *arg);
void start_thrd(int fd);
void thrd_readwrite(int sockfd);
void release_read(struct st_connserv *connserv);
void release_write(struct st_connserv *connserv);
int main(int argc, char *argv[])
{
if(argc < 1)
{
perror("input server port");
return -1;
}
memcpy(ip, argv[1], 24);
port = atoi(argv[2]);
struct st_listenserv listenserv;
initsocket(&listenserv);
listenserv.base = event_base_new();
listenserv.ev_listen = event_new(listenserv.base, listenserv.sockfd,EV_READ | EV_PERSIST,accept_cb,NULL);
event_add(listenserv.ev_listen, NULL);
event_base_dispatch(listenserv.base);
}
void initsocket(struct st_listenserv *listenserv)
{
listenserv->sockfd = lib_tcpsrv_init(ip,port);
if(listenserv->sockfd < 0)
{
perror("server create socket error");
return;
}
if(lib_set_nonblock(listenserv->sockfd) < 0)
{
perror("set nonblock error");
return;
}
printf("init socket ok\n");
}
void accept_cb(int fd, short events, void *arg)
{
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
int clifd = lib_tcpsrv_accept(fd, &cin);
if(clifd <0)
{
perror("accept error");
}
if(lib_set_nonblock(clifd) < 0)
{
perror("set nonblock error");
return;
}
printf("new conneciotn [%s:%d]\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
start_thrd(clifd);
}
void start_thrd(int fd)
{
pthread_t pid;
lib_thread_create(&pid, thrd_readwrite, (void*)fd, 1);
}
void thrd_readwrite(int sockfd)
{
struct st_connserv connserv;
connserv.clifd = sockfd;
connserv.base = event_base_new();
connserv.ev_read = event_new(connserv.base, connserv.clifd, EV_READ|EV_PERSIST, read_cb, &connserv);
event_add(connserv.ev_read,NULL);
event_base_dispatch(connserv.base);
}
void read_cb(int fd, short events, void *arg)
{
struct st_connserv *conn = (struct st_connserv*)arg;
int recvlen = lib_tcp_recv(conn->clifd, conn->buf,1024, -1);
if(recvlen < 0)
{
perror("recv error");
close(conn->clifd);
release_read(conn);
}
printf("recv data:%s\n", conn->buf);
conn->ev_write = event_new(conn->base, conn->clifd, EV_WRITE, send_cb, conn);
event_add(conn->ev_write, NULL);
}
void send_cb(int fd, short events, void *arg)
{
struct st_connserv *conn = (struct st_connserv*)arg;
int sendlen = lib_tcp_send(conn->clifd, conn->buf, 1024);
if(sendlen < 0)
{
perror("send error");
close(conn->clifd);
release_write(conn);
}
}
void release_read(struct st_connserv *connserv)
{
if(connserv == NULL)
{
return;
}
event_del(connserv->ev_read);
event_base_loopexit(connserv->base, NULL);
if(NULL != connserv->ev_read){
free(connserv->ev_read);
}
event_base_free(connserv->base);
free(connserv);
}
void release_write(struct st_connserv *connserv)
{
if(connserv != NULL)
{
event_del(connserv->ev_write);
free(connserv->ev_write);
free(connserv);
}
}
完整代码地址:https://github.com/Addision/test_libevent_thrd_server
简单客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 9999
#define IPADDR "127.0.0.1"
int main(int argc, char *argv[])
{
/* 套接字描述符*/
int sockfd, numbytes;
char buf[1024];
struct sockaddr_in their_addr;
if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
/* 网络字节顺序,短整型*/
their_addr.sin_port = htons(PORT);
their_addr.sin_addr.s_addr = inet_addr(IPADDR);
/* 将结构剩下的部分清零*/
bzero(&(their_addr.sin_zero),8);
if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
int ret = send(sockfd, "123456", 6,0);
if(ret > 0)
{
printf("send ok\n");
}
ret = recv(sockfd, buf, 1024,0);
if(ret > 0)
{
printf("recv data %s\n", buf);
}
getchar();
return 0;
}