-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPredictServer.cpp
More file actions
95 lines (88 loc) · 2.95 KB
/
PredictServer.cpp
File metadata and controls
95 lines (88 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
Time : 2016/06/13
Author: Kay Yang (1025115216@qq.com)
*/
#include "PredictServer.h"
#include "PredictSession.h"
#include "PredictKeyHandleUI.h"
#include "FormatString.h"
#include "PredictPrint.h"
void Connecting(evutil_socket_t listener, short event, void *arg)
{
struct event_base *base = (struct event_base *)arg;
struct sockaddr_in ss;
int slen = sizeof(ss);
int fd = accept(listener, (struct sockaddr*)&ss, &slen);
if (fd < 0)
{
ClientPrint::PrintMessage("", "accept fail fd = -1.");
return;
}
DataStructures::HexString ip = inet_ntoa(ss.sin_addr);
if (ip == "127.0.0.1")
{
evutil_closesocket(fd);// close socket manual
return;
}
ClientPrint::PrintMessage("", FormatString("someone connected, fd %d, ip: %s, port: %d", fd, ip.C_String(), ntohs(ss.sin_port)));
struct bufferevent *bev;
evutil_make_socket_nonblocking(fd);
bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
PredictSession* session = new PredictSession(bev);
session->SetSessionId(PredictGameThread::GeneratorSessionId());
PredictSessionManager::Instance()->AddSession(session);
bufferevent_setcb(bev, Reading, Writing, Wrong, session);
bufferevent_enable(bev, EV_READ | EV_WRITE | EV_PERSIST);
}
void Disconnect(struct bufferevent *bev, void *ctx)
{
bufferevent_free(bev);
}
void Reading(struct bufferevent *bev, void *ctx)
{
PredictSession* session = (PredictSession*)ctx;
session->ReadMessage();
}
void Writing(struct bufferevent *bev, void *ctx)
{
//evbuffer* output = bufferevent_get_output(bev);
//int len = evbuffer_get_length(output);
//ClientPrint::GetPrint()->PrintMessage(FormatString("write bytes len : %d", len));
//char* bytes = (char*)malloc(len);
//bufferevent_read(bev, bytes, len);
//bufferevent_write();
}
void Wrong(struct bufferevent *bev, short error, void *ctx)
{
// int err = EVUTIL_SOCKET_ERROR();
PredictSession* sesson = (PredictSession*)ctx;
sesson->IsNeedRemove(true);
DataStructures::HexString temp;
if (error & BEV_EVENT_EOF)
{
/* connection has been closed, do any clean up here */
// Disconnect(bev, ctx);
temp = "BEV_EVENT_EOF";
}
else if (error & BEV_EVENT_ERROR)
{
/* check errno to see what error occurred */
//ClientPrint::PrintMessage(sesson->GetGameName(), "BEV_EVENT_ERROR");
temp = "BEV_EVENT_ERROR";
//bufferevent_free(bev);
}
else if (error & BEV_EVENT_TIMEOUT)
{
/* must be a timeout event handle, handle it */
//ClientPrint::PrintMessage(sesson->GetGameName(), "BEV_EVENT_TIMEOUT");
temp = "BEV_EVENT_TIMEOUT";
//bufferevent_free(bev);
}
struct sockaddr_in ss;
int slen = sizeof(ss);
int fd = bufferevent_getfd(bev);
getpeername(bufferevent_getfd(bev), (sockaddr*)&ss, &slen);
int success = evutil_closesocket(fd);// close socket manual
ClientPrint::PrintMessage(sesson->GetGameName(), FormatString(" %s someone disconnect, fd %d, ip: %s, port: %d. close socket %s", temp.C_String(), fd, inet_ntoa(ss.sin_addr), ntohs(ss.sin_port), success == 0 ? "successfully" : "failed"));
bufferevent_free(bev);
}