server.cpp
#include <stdio.h>
#include <iostream>
#include <map>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
event_base *m_event_base = NULL;
evutil_socket_t m_listenfd = 0;
event *m_listenevent;
using namespace std;
map<evutil_socket_t, bufferevent*> map_tcpHander;
void tcperror_cb(struct bufferevent *bev, short what, void* ctx)
{
evutil_socket_t bufferfd = bufferevent_getfd(bev);
evutil_closesocket(bufferfd);
map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
if (it != map_tcpHander.end())
{
map_tcpHander.erase(it);
}
}
void tcpwrite_cb(struct bufferevent *bev, void *ctx)
{
cout << "write success!" << endl;
return;
}
void tcpread_cb(struct bufferevent *bev, void *ctx)
{
evutil_socket_t bufferfd = bufferevent_getfd(bev);
map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
if (it != map_tcpHander.end())
{
bufferevent* buffer_event = it->second;
evbuffer *inputbuf = bufferevent_get_input(buffer_event);
size_t inputLen = evbuffer_get_length(inputbuf);
while (inputLen > 0)
{
char data[1024] = { 0 };
size_t len = bufferevent_read(buffer_event, data, 1024);
cout << " read data = " << data << endl;
inputLen -= len;
}
char * resp = "server resp data.";
size_t n = bufferevent_write(buffer_event, resp, strlen(resp));
if (n < 0)
{
cout << "write to client failed." << endl;
return;
}
bufferevent_enable(buffer_event, EV_WRITE);
}
}
void listen_accept_cb(evutil_socket_t fd, short what, void *p)
{
sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
size_t addrlen = sizeof(serveraddr);
evutil_socket_t acceptfd = accept(fd, (sockaddr *)&serveraddr, (socklen_t *)&addrlen);
if (acceptfd == -1)
{
printf("accept failed.\n");
return;
}
event_base *eventbase = (event_base*)p;
bufferevent *buffersocket = bufferevent_socket_new(eventbase, acceptfd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(buffersocket, tcpread_cb, tcpwrite_cb, tcperror_cb, eventbase);
bufferevent_enable(buffersocket, EV_READ);
cout << "new connect accept:" << inet_ntoa(serveraddr.sin_addr) << endl;
map_tcpHander.insert(make_pair(acceptfd, buffersocket));
}
int initevent()
{
m_event_base = event_base_new();
m_listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (m_listenfd == -1)
{
printf("socket init failed.\n");
return -1;
}
sockaddr_in listenAddr;
memset(&listenAddr, 0, sizeof(listenAddr));
listenAddr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY 0.0.0.0 ,泛指本机
listenAddr.sin_family = AF_INET;
listenAddr.sin_port = htons(9955);
evutil_make_socket_nonblocking(m_listenfd);
int one = 1;
setsockopt(m_listenfd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one));
int bindres = bind(m_listenfd, (sockaddr*)&listenAddr, sizeof(listenAddr));
if (bindres == -1)
{
printf("bind socket failed.\n");
return -1;
}
listen(m_listenfd, 128);
//accept callback
m_listenevent = event_new(m_event_base, m_listenfd, EV_READ | EV_PERSIST, listen_accept_cb, m_event_base);
event_add(m_listenevent, NULL);
return 0;
}
int main(int argc, char **argv)
{
initevent();
event_base_dispatch(m_event_base);
event_base_free(m_event_base);
event_free(m_listenevent);
evutil_closesocket(m_listenfd);
map_tcpHander.clear();
getchar();
}
client.cpp
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char**argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct hostent *server = gethostbyname("127.0.0.1");
if (server == NULL) {
printf("ERROR, no such host\n");
exit(0);
}
struct sockaddr_in serv_addr;
memset((char*)&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy((char*)server->h_addr,
(char*)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(9955);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("error connect:%d\n", errno);
exit(0);
}
char *buf = "data from client";
int n = write(sockfd, buf, strlen(buf));
char recv[1024] = { 0 };
n = read(sockfd, recv, sizeof(recv));
recv[n] = '\0';
printf("%s\n", recv);
close(sockfd);
return 0;
}