26 void sigchld_handler(
int s)
28 while(waitpid(-1, NULL, WNOHANG) > 0);
36 Server::Server(
string port,
int waiting,
Service serv)
40 logger = Logger::getLogger(
"Server");
41 struct addrinfo hints, *servinfo, *p;
46 memset(&hints, 0,
sizeof hints);
47 hints.ai_family = AF_UNSPEC;
48 hints.ai_socktype = SOCK_STREAM;
49 hints.ai_flags = AI_PASSIVE;
50 if ((rv = getaddrinfo(NULL, port.c_str(), &hints, &servinfo)) != 0) {
51 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
55 for(p = servinfo; p != NULL; p = p->ai_next)
57 if ((this->sock = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1)
59 perror(
"server: socket");
62 if (setsockopt(this->sock, SOL_SOCKET, SO_REUSEADDR, &yes,
67 if (bind(this->sock, p->ai_addr, p->ai_addrlen) == -1) {
69 perror(
"server: bind");
77 fprintf(stderr,
"server: failed to bind\n");
80 freeaddrinfo(servinfo);
81 if (listen(this->sock, BACKLOGM) == -1)
86 sa.sa_handler = sigchld_handler;
87 sigemptyset(&sa.sa_mask);
88 sa.sa_flags = SA_RESTART;
89 if (sigaction(SIGCHLD, &sa, NULL) == -1)
94 logger << (
"waiting for connections on " + port +
".....") << endl;
105 FD_SET(this->sock, &master);
112 int nfds = select(fdmax+1, &read_fds, NULL, NULL, NULL);
115 perror(
"epoll_wait");
118 for(
int n=0;n<=fdmax;n++)
120 if (FD_ISSET(n, &read_fds))
124 int new_fd = this->Accept();
132 fcntl(new_fd, F_SETFL, fcntl(new_fd, F_GETFD, 0) | O_NONBLOCK);
133 FD_SET(new_fd, &master);
134 if (new_fd > fdmax) {
151 Server::Server(
string port,
bool block,
int waiting,
Service serv,
int mode)
155 logger = Logger::getLogger(
"Server");
158 struct addrinfo hints, *servinfo, *p;
163 if(mode<1 || mode >3)
166 memset(&hints, 0,
sizeof hints);
167 hints.ai_family = AF_UNSPEC;
168 hints.ai_socktype = SOCK_STREAM;
169 hints.ai_flags = AI_PASSIVE;
170 if ((rv = getaddrinfo(NULL, port.c_str(), &hints, &servinfo)) != 0) {
171 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
175 for(p = servinfo; p != NULL; p = p->ai_next)
177 if ((this->sock = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1)
179 perror(
"server: socket");
182 if (setsockopt(this->sock, SOL_SOCKET, SO_REUSEADDR, &yes,
183 sizeof(
int)) == -1) {
184 perror(
"setsockopt");
187 if (bind(this->sock, p->ai_addr, p->ai_addrlen) == -1) {
189 perror(
"server: bind");
200 fprintf(stderr,
"server: failed to bind\n");
203 freeaddrinfo(servinfo);
204 if (listen(this->sock, BACKLOGM) == -1)
209 sa.sa_handler = sigchld_handler;
210 sigemptyset(&sa.sa_mask);
211 sa.sa_flags = SA_RESTART;
212 if (sigaction(SIGCHLD, &sa, NULL) == -1)
217 logger << (
"waiting for connections on " + port +
".....") << endl;
227 Thread servicing_thread(&servicing,
this);
228 servicing_thread.execute();
238 void* Server::servicing(
void* arg)
241 Service serv = server->service;
244 int new_fd = server->Accept();
252 Thread pthread(serv, &new_fd);
261 socklen_t sin_size =
sizeof their_addr;
262 int new_fd = accept(this->sock, (
struct sockaddr *)&(this->their_addr), &sin_size);
265 int Server::Send(
int fd,
string data)
267 int bytes = send(fd,data.c_str(),data.length(),0);
270 logger <<
"send failed" << endl;
274 int Server::Send(
int fd,vector<char> data)
276 int bytes = send(fd,&data[0],data.size(),0);
279 logger <<
"send failed" << endl;
283 int Server::Send(
int fd,vector<unsigned char> data)
285 int bytes = send(fd,&data[0],data.size(),0);
288 logger <<
"send failed" << endl;
292 int Server::Send(
int fd,
char *data)
294 int bytes = send(fd,data,
sizeof data,0);
297 logger <<
"send failed" << endl;
301 int Server::Send(
int fd,
unsigned char *data)
303 int bytes = send(fd,data,
sizeof data,0);
306 logger <<
"send failed" << endl;
311 int Server::Receive(
int fd,
string &data,
int bytes)
316 int bytesr = recv(fd, buf, bytes, 0);
324 string temp(buf,buf+bytesr);
326 memset(&buf[0], 0,
sizeof(buf));
329 int Server::Receive(
int fd,vector<char> &data,
int bytes)
334 int bytesr = Receive(fd,te,bytes);
336 copy(te,te+bytes,data.begin());
339 int Server::Receive(
int fd,vector<unsigned char>& data,
int bytes)
344 int bytesr = Receive(fd,te,bytes);
346 copy(te,te+bytes,data.begin());
349 int Server::Receive(
int fd,
char data[],
int bytes)
353 int bytesr = recv(fd, data, bytes, 0);
356 int Server::Receive(
int fd,
unsigned char data[],
int bytes)
360 int bytesr = recv(fd, data, bytes, 0);
363 int Server::Receive(
int fd,vector<string>& data,
int bytes)
369 int bytesr = Receive(fd,te,bytes);
372 while(getline(ss,temp,
'\n'))
374 data.push_back(temp);
377 memset(&te[0], 0,
sizeof(te));
381 int Server::createListener(
string port,
bool block)
384 struct addrinfo hints, *servinfo, *p;
389 memset(&hints, 0,
sizeof hints);
390 hints.ai_family = AF_UNSPEC;
391 hints.ai_socktype = SOCK_STREAM;
392 hints.ai_flags = AI_PASSIVE;
393 if ((rv = getaddrinfo(NULL, port.c_str(), &hints, &servinfo)) != 0) {
394 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
398 for(p = servinfo; p != NULL; p = p->ai_next)
400 if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1)
402 perror(
"server: socket");
405 if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
406 sizeof(
int)) == -1) {
407 perror(
"setsockopt");
410 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
412 perror(
"server: bind");
419 fprintf(stderr,
"server: failed to bind\n");
422 freeaddrinfo(servinfo);
423 if (listen(sockfd, BACKLOGM) == -1)
428 sa.sa_handler = sigchld_handler;
429 sigemptyset(&sa.sa_mask);
430 sa.sa_flags = SA_RESTART;
431 if (sigaction(SIGCHLD, &sa, NULL) == -1)
439 fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0) | O_NONBLOCK);
444 int Server::createListener(
string ipAddress,
string port,
bool block)
447 struct addrinfo hints, *servinfo, *p;
452 memset(&hints, 0,
sizeof hints);
453 hints.ai_family = AF_UNSPEC;
454 hints.ai_socktype = SOCK_STREAM;
455 hints.ai_flags = AI_PASSIVE;
457 const char *ip_addr = NULL;
459 ip_addr = ipAddress.c_str();
461 if ((rv = getaddrinfo(ip_addr, port.c_str(), &hints, &servinfo)) != 0) {
462 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
466 for(p = servinfo; p != NULL; p = p->ai_next)
468 if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1)
470 perror(
"server: socket");
473 if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
474 sizeof(
int)) == -1) {
475 perror(
"setsockopt");
478 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
480 perror(
"server: bind");
487 fprintf(stderr,
"server: failed to bind\n");
490 freeaddrinfo(servinfo);
491 if (listen(sockfd, BACKLOGM) == -1)
496 sa.sa_handler = sigchld_handler;
497 sigemptyset(&sa.sa_mask);
498 sa.sa_flags = SA_RESTART;
499 if (sigaction(SIGCHLD, &sa, NULL) == -1)
507 fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0) | O_NONBLOCK);