1
- #include " EventLoop.h"
2
1
#include " Server.h"
2
+ #include " Socket.h"
3
+ #include " InetAddress.h"
4
+ #include " Channel.h"
5
+ #include < functional>
6
+ #include < string.h>
7
+ #include < unistd.h>
3
8
4
- int main () {
5
- EventLoop *loop = new EventLoop ();
6
- Server *server = new Server (loop);
7
- loop->loop ();
8
- return 0 ;
9
+ #define READ_BUFFER 1024
10
+
11
+ Server::Server (EventLoop *_loop) : loop(_loop){
12
+ Socket *serv_sock = new Socket ();
13
+ InetAddress *serv_addr = new InetAddress (" 127.0.0.1" , 8888 );
14
+ serv_sock->bind (serv_addr);
15
+ serv_sock->listen ();
16
+ serv_sock->setnonblocking ();
17
+
18
+ Channel *servChannel = new Channel (loop, serv_sock->getFd ());
19
+ std::function<void ()> cb = std::bind (&Server::newConnection, this , serv_sock);
20
+ servChannel->setCallback (cb);
21
+ servChannel->enableReading ();
22
+
23
+ }
24
+
25
+ Server::~Server ()
26
+ {
27
+
9
28
}
29
+
30
+ void Server::handleReadEvent (int sockfd){
31
+ char buf[READ_BUFFER];
32
+ while (true ){ // 由于使用非阻塞IO,读取客户端buffer,一次读取buf大小数据,直到全部读取完毕
33
+ bzero (&buf, sizeof (buf));
34
+ ssize_t bytes_read = read (sockfd, buf, sizeof (buf));
35
+ if (bytes_read > 0 ){
36
+ printf (" message from client fd %d: %s\n " , sockfd, buf);
37
+ write (sockfd, buf, sizeof (buf));
38
+ } else if (bytes_read == -1 && errno == EINTR){ // 客户端正常中断、继续读取
39
+ printf (" continue reading" );
40
+ continue ;
41
+ } else if (bytes_read == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))){// 非阻塞IO,这个条件表示数据全部读取完毕
42
+ printf (" finish reading once, errno: %d\n " , errno);
43
+ break ;
44
+ } else if (bytes_read == 0 ){ // EOF,客户端断开连接
45
+ printf (" EOF, client fd %d disconnected\n " , sockfd);
46
+ close (sockfd); // 关闭socket会自动将文件描述符从epoll树上移除
47
+ break ;
48
+ }
49
+ }
50
+ }
51
+
52
+ void Server::newConnection (Socket *serv_sock){
53
+ InetAddress *clnt_addr = new InetAddress (); // 会发生内存泄露!没有delete
54
+ Socket *clnt_sock = new Socket (serv_sock->accept (clnt_addr)); // 会发生内存泄露!没有delete
55
+ printf (" new client fd %d! IP: %s Port: %d\n " , clnt_sock->getFd (), inet_ntoa (clnt_addr->addr .sin_addr ), ntohs (clnt_addr->addr .sin_port ));
56
+ clnt_sock->setnonblocking ();
57
+ Channel *clntChannel = new Channel (loop, clnt_sock->getFd ());
58
+ std::function<void ()> cb = std::bind (&Server::handleReadEvent, this , clnt_sock->getFd ());
59
+ clntChannel->setCallback (cb);
60
+ clntChannel->enableReading ();
61
+ }
0 commit comments