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