-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServer.cpp
More file actions
118 lines (100 loc) · 3.14 KB
/
Server.cpp
File metadata and controls
118 lines (100 loc) · 3.14 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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//
// Created by parallels on 2020/1/19.
//
#include "Server.h"
#include "UtilFun.h"
#include <unp.h>
#include "WebLimit.h"
#include <functional>
#include "HttpData.h"
Server::Server(EventLoop* loop, int port) : mutex_(), listen_fd(startListen(port)), threadPool_(new ThreadPool(loop_)), loop_(loop), task_(new Task(loop_, listen_fd)) {}
Server::~Server() {}
void Server::start() {
threadPool_->creatThreadPool();
task_->epoll_->addEpoll(task_);
task_->setMainLoop();
task_->setConnHandle(std::bind(&Server::newConnHandle, this));
for(;;) {
std::vector<std::shared_ptr<Task> > req;
req = task_->epoll_->poll();
for(auto &it : req) {
//mutex_.lock();
it->eventHandle();
//mutex_.unlock();
}
}
}
int Server::startListen(int port) {
int listenfd, connfd, epfd, nfds, sockfd;
struct sockaddr_in servaddr, chiladdr;
char buff[MAXLINE];
char ipbuf_tmp[50];
ssize_t n;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("errno: %2d\t%s\n",errno,strerror(errno));
ERR_MSG("socket_error");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);
if((bind(listenfd, (SA *)&servaddr, sizeof(servaddr))) != 0) {
ERR_MSG("bind error");
printf("errno: %2d\t%s\n",errno,strerror(errno));
exit(0);
}
if((listen(listenfd, LISTENQ)) != 0) {
ERR_MSG("listen error");
printf("errno: %2d\t%s\n",errno,strerror(errno));
exit(0);
}
return listenfd;
}
void Server::test1() {
printf("test1\n");
fflush(stdout);
}
void Server::test2() {
printf("test2\n");
fflush(stdout);
}
void Server::test3() {
printf("test3\n");
fflush(stdout);
}
void Server::newConnHandle() {
//task_->epoll_->addEpoll(task_);
int fd_ = task_->fd_;
struct epoll_event ev;
int connfd;
struct sockaddr_in chiladdr;
bzero(&chiladdr, sizeof(chiladdr));
socklen_t chillen = sizeof(chiladdr);
read(fd_, buff, MAXLINE);
connfd = accept(fd_, (SA *) &chiladdr, &chillen);
if (connfd < 0) {
ERR_MSG("connfd error(value < 0)");
return;
}
EventLoop *loop = threadPool_->getNext();
std::shared_ptr<Task> task;
std::shared_ptr<HttpData> http;
//原先在http里面创建 task,但是这样子在压测中会造成初始化还没成功就进行到下一语句的情况
task = std::make_shared<Task>(loop, connfd);
http = std::make_shared<HttpData>(loop, connfd, task);
task->setHolder(http);
loop->epoll_->addEpoll(task);
//usleep(100);
//http->getTime();
//printf("New connect from %s port: %d\n",inet_ntop(AF_INET, &chiladdr.sin_addr.s_addr, ipbuf_tmp_, sizeof(ipbuf_tmp_)),ntohs(chiladdr.sin_port));
ev.data.fd = fd_;
ev.events = EPOLLIN | EPOLLONESHOT;
epoll_ctl(task_->epoll_->epollfd_, EPOLL_CTL_MOD, fd_, &ev);
loop->wakeup();
/*
ev.data.fd = connfd;
ev.events = EPOLLIN;
//ev.events=EPOLLIN|EPOLLET;
epoll_ctl(task_->epoll_->epollfd_, EPOLL_CTL_ADD, connfd, &ev);
*/
}