-
Notifications
You must be signed in to change notification settings - Fork 4
/
TcpEpollServer.cpp
123 lines (93 loc) · 2.69 KB
/
TcpEpollServer.cpp
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* File: TcpEpoolServer.cpp
* Author: Administrator
*
* Created on 2014年1月28日, 下午2:29
*/
#include "TcpEpollServer.h"
namespace CommLib {
TcpEpollSockImp::TcpEpollSockImp(int sock
, TcpEpollServerImp* pEServ
)
: TcpSock(sock)
, pEServ_(pEServ) {
}
int TcpEpollSockImp::OnSend() {
return 0;
}
int TcpEpollSockImp::OnClose() {
Close();
pEServ_->OnCloseClient(shared_from_this());
pEServ_->OnClientClose(shared_from_this());
return 0;
}
void CheckLoop::LoopTask() {
pImp->Check();
}
TcpEpollServerImp::TcpEpollServerImp(
boost::shared_ptr<Epoll> epoll,
std::string thrname,
std::string checklpname, int looptime)
: epoll_(epoll), bStarted_(false),
Thread(boost::bind(&TcpEpollServerImp::Schedule, this), thrname),
checkloop_(checklpname, looptime) {
checkloop_.pImp = this;
}
bool TcpEpollServerImp::Start(int nPort) {
if (bStarted_)
return false;
bStarted_ = true;
SockAddr addr(nPort, "0.0.0.0", Sock::IP);
if (-1 == Bind(addr)) {
perror("TcpEpollServer::Start false");
return false;
}
if (-1 == Listen(10)) {
perror("TcpEpollServer::Start false");
return false;
}
assert(0 == epoll_->epollAdd(this, Epoll::EVENT_READ));
this->Setnonblocking();
StartThread();
checkloop_.StartThread();
}
bool TcpEpollServerImp::Stop() {
// Epoll_->Close();
if (!bStarted_)
return false;
bStarted_ = false;
Join();
checkloop_.StopLoop();
checkloop_.Join();
}
bool TcpEpollServerImp::Schedule() {
while (epoll_->Schedule(10));
return false;
}
//
int TcpEpollServerImp::OnAccept() {
sockaddr_in addr;
socklen_t addrlen = sizeof (sockaddr_in);
int socket = accept(Getsock(), (struct sockaddr *) &addr, &addrlen);
if (socket < 0) {
return 0;
}
boost::shared_ptr<TcpEpollSockImp> sock = MakeNewClient(socket);
SockAddr skAddr(addr);
sock->Setnonblocking();
assert(0 == epoll_->epollAdd(sock.get(), Epoll::EVENT_READ));
sock->SetRemoteAddr(skAddr);
OnAddClient(sock);
return 1;
}
int TcpEpollServerImp::OnSend() {
return 1;
};
int TcpEpollServerImp::OnClose() {
Close();
return Stop();
};
void TcpEpollServerImp::OnCloseClient(boost::shared_ptr<TcpEpollSockImp> sock) {
epoll_->epollDel(sock.get());
}
}