124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
/*
|
|
* @Author: your name
|
|
* @Date: 2021-07-04 16:06:47
|
|
* @LastEditTime: 2021-07-15 22:52:22
|
|
* @LastEditors: Please set LastEditors
|
|
* @Description: In User Settings Edit
|
|
* @FilePath: \server\tcp_swarm_libevent.cpp
|
|
*/
|
|
#define _WSPIAPI_H_
|
|
#define _WINSOCKAPI_
|
|
#include"tcp_swarm_libevent.h"
|
|
#include <cstring>
|
|
void conn_writecb(struct bufferevent *, void *);
|
|
void conn_readcb(struct bufferevent *, void *);
|
|
void conn_eventcb(struct bufferevent *, short, void *);
|
|
|
|
void conn_writecb(struct bufferevent *bev, void *user_data) {
|
|
|
|
}
|
|
|
|
// 运行线程
|
|
int thread_dispatch(TcpSwarmClientLibevent *p) {
|
|
if (nullptr != p) {
|
|
int ret = event_base_dispatch(p->m_base);;
|
|
return ret;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void conn_readcb(struct bufferevent *bev, void *user_data)
|
|
{
|
|
TcpSwarmClientLibevent *server = (TcpSwarmClientLibevent*)user_data;
|
|
struct evbuffer *input = bufferevent_get_input(bev);
|
|
size_t sz = evbuffer_get_length(input);
|
|
if (sz > 0)
|
|
{
|
|
uint8_t *msg = new uint8_t[sz];
|
|
int ret = bufferevent_read(bev,msg,sz);
|
|
printf("%s\n", msg);
|
|
delete[] msg;
|
|
}
|
|
}
|
|
|
|
void conn_eventcb(struct bufferevent *bev, short events, void *user_data)
|
|
{
|
|
TcpSwarmClientLibevent *server;
|
|
server = (TcpSwarmClientLibevent *)user_data;
|
|
if (events & BEV_EVENT_EOF)
|
|
{
|
|
evutil_socket_t fd = bufferevent_getfd(bev);
|
|
bufferevent_free(bev);
|
|
server->removeConection(fd);
|
|
}
|
|
else if (events & BEV_EVENT_ERROR)
|
|
{
|
|
|
|
}
|
|
else if (events & BEV_EVENT_CONNECTED)
|
|
{
|
|
evutil_socket_t fd = bufferevent_getfd(bev);
|
|
server->addConection(fd,bev);
|
|
}
|
|
}
|
|
|
|
TcpSwarmClientLibevent::TcpSwarmClientLibevent(int count){
|
|
m_count = count;
|
|
}
|
|
|
|
int TcpSwarmClientLibevent::addConection(evutil_socket_t fd,struct bufferevent* bev) {
|
|
if(nullptr != bev)
|
|
m_clients[fd] = bev;
|
|
return 0;
|
|
}
|
|
|
|
|
|
int TcpSwarmClientLibevent::removeConection(evutil_socket_t fd){
|
|
m_clients.erase(fd);
|
|
return 0;
|
|
}
|
|
|
|
int TcpSwarmClientLibevent::ConnectToServer(string server, int port){
|
|
memset(&m_addr, 0, sizeof(m_addr));
|
|
#ifdef linux
|
|
m_addr.sin_addr.s_addr = inet_addr(server.c_str());
|
|
m_addr.sin_family = AF_INET;
|
|
#endif
|
|
#ifdef _WIN32
|
|
m_addr.sin_addr.S_un.S_addr = inet_addr(server.c_str());
|
|
m_addr.sin_family = AF_INET;
|
|
#endif
|
|
m_addr.sin_port = htons(port);
|
|
m_base = event_base_new();
|
|
if (!m_base){
|
|
printf("Could not initialize libevent\n");
|
|
return -1;
|
|
}
|
|
#ifdef WIN32
|
|
evthread_use_windows_threads();
|
|
#else
|
|
evthread_use_pthreads();
|
|
#endif
|
|
evthread_make_base_notifiable(m_base);
|
|
for(uint32_t i = 0; i < this->m_count;i++){
|
|
m_bev = bufferevent_socket_new(m_base, -1,
|
|
BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE);
|
|
if (nullptr == m_bev) {
|
|
return - 1;
|
|
}
|
|
bufferevent_setcb(m_bev, conn_readcb, conn_writecb, conn_eventcb, this);
|
|
int flag = bufferevent_socket_connect(m_bev, (struct sockaddr *)&m_addr, sizeof(m_addr));
|
|
bufferevent_enable(m_bev, EV_READ | EV_WRITE);
|
|
if (-1 == flag)
|
|
{
|
|
printf("Connect failed\n");
|
|
bufferevent_free(m_bev);
|
|
m_bev = nullptr;
|
|
return -1;
|
|
}
|
|
}
|
|
this->m_thread = new thread(thread_dispatch,this);
|
|
return 0;
|
|
}
|
|
|