From 068a0fd45a9802035119b6054f4c31cd19925b33 Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 19 四月 2017 18:22:00 +0800 Subject: [PATCH] dev --- FaceServer/ev_server.cpp | 63 ++++++++++++++++++------------- 1 files changed, 37 insertions(+), 26 deletions(-) diff --git a/FaceServer/ev_server.cpp b/FaceServer/ev_server.cpp index 2f423a2..4d5b29c 100644 --- a/FaceServer/ev_server.cpp +++ b/FaceServer/ev_server.cpp @@ -1,6 +1,6 @@ #include "ev_server.h" #include "ev_proto.h" -#include "logger.h" +#include <logger.h> #include <sys/types.h> #include <sys/socket.h> @@ -69,11 +69,11 @@ if (what & EVBUFFER_EOF) { //Client disconnected, remove the read event and the free the client structure. - LOG_INFO << "Client disconnected." << std::endl; + LOG_INFO << "Client disconnected." << LOG_ENDL; } else { - LOG_WARN << "Client socket error, disconnecting." << std::endl; + LOG_WARN << "Client socket error, disconnecting." << LOG_ENDL; } bufferevent_free(client->buf_ev); close(client->fd); @@ -89,12 +89,12 @@ // Write back the read buffer. It is important to note that // bufferevent_write_buffer will drain the incoming data so it // is effectively gone after we call it. - //LOG_DEBUG << (char*)bufev->input << std::endl; + //LOG_DEBUG << (char*)bufev->input << LOG_ENDL; //bufferevent_write_buffer(bufev, bufev->input); //char buff[100] = {'\0'}; //size_t readSize = bufferevent_read(bufev, buff, sizeof(buff)); - //LOG_DEBUG << "readSize=" << readSize << "\t" << buff << std::endl; + //LOG_DEBUG << "readSize=" << readSize << "\t" << buff << LOG_ENDL; EVPHeader* evpHeader = (EVPHeader*)client->recvbuff; @@ -107,7 +107,7 @@ client->read_times = 1; if (readSize != sizeof(headerBuff)) { - LOG_WARN << "client send incomplete header" << std::endl; + LOG_WARN << "client send incomplete header" << LOG_ENDL; buffered_on_error(bufev, 0, arg); return; } @@ -115,10 +115,11 @@ evpHeader = (EVPHeader*)headerBuff; // check header - if (evpHeader->cmd <= EVPCommand::EVPC__FIRST || evpHeader->cmd >= EVPCommand::EVPC__LAST || + if (evpHeader->proto <= EVPProto::EVPP__FIRST || evpHeader->proto >= EVPProto::EVPP__LAST || + evpHeader->cmd <= EVPCommand::EVPC__FIRST || evpHeader->cmd >= EVPCommand::EVPC__LAST || evpHeader->size < sizeof(EVPHeader) || evpHeader->size > CLIENT_BUFFER_MAX) { - LOG_WARN << "client send invalid header" << std::endl; + LOG_WARN << "client send invalid header" << LOG_ENDL; buffered_on_error(bufev, 0, arg); return; } @@ -169,7 +170,7 @@ { size_t writeSize = bufferevent_write(bufev, cs.sendBuff, cs.sendBuffSize); if (writeSize != cs.sendBuffSize) - LOG_WARN << "server send truncate " << (cs.sendBuffSize - writeSize) << " bytes" << std::endl; + LOG_WARN << "server send truncate " << (cs.sendBuffSize - writeSize) << " bytes" << LOG_ENDL; if (cs.deleteSendBuff) delete[] cs.sendBuff; @@ -178,7 +179,7 @@ if (closeClient) { - LOG_DEBUG << "server initiative close" << std::endl; + LOG_DEBUG << "server initiative close" << LOG_ENDL; buffered_on_error(bufev, 0, arg); } @@ -190,7 +191,7 @@ // check read times if (client->read_times > CLIENT_READ_TIMES_MAX) { - LOG_WARN << "client read times to max" << std::endl; + LOG_WARN << "client read times to max" << LOG_ENDL; buffered_on_error(bufev, 0, arg); } } @@ -209,19 +210,19 @@ int client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_len); if (client_fd < 0) { - LOG_WARN << "accept failed" << std::endl; + LOG_WARN << "accept failed" << LOG_ENDL; return; } // Set the client socket to non-blocking mode. if (setnonblock(client_fd) < 0) - LOG_WARN << "failed to set client socket non-blocking" << std::endl; + LOG_WARN << "failed to set client socket non-blocking" << LOG_ENDL; // We've accepted a new client, create a client object. struct EVClient* client = new EVClient; if (client == NULL) { - LOG_ERROR << "malloc failed" << std::endl; + LOG_ERROR << "malloc failed" << LOG_ENDL; } client->fd = client_fd; client->proc = evclient_proc; @@ -232,12 +233,12 @@ // We have to enable it before our callbacks will be called. bufferevent_enable(client->buf_ev, EV_READ); - LOG_INFO << "Accepted connection from " << inet_ntoa(client_addr.sin_addr) << std::endl; + LOG_INFO << "Accepted connection from " << inet_ntoa(client_addr.sin_addr) << LOG_ENDL; } int server_main(int argc, char **argv) { - //initLogger(LV_DEBUG); + LOG_NOTICE << "server_main" << LOG_ENDL; // Initialize libevent. event_init(); @@ -246,7 +247,7 @@ int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd < 0) { - LOG_ERROR << "create socket failed" << std::endl; + LOG_ERROR << "create socket failed" << LOG_ENDL; return EXIT_FAILURE; } @@ -255,26 +256,28 @@ listen_addr.sin_family = AF_INET; listen_addr.sin_addr.s_addr = INADDR_ANY; listen_addr.sin_port = htons(SERVER_PORT); + + int reuseaddr_on = REUSEADDR_ON; + setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_on, sizeof(reuseaddr_on)); + if (setnonblock(listen_fd) < 0) + { + LOG_ERROR << "failed to set server socket to non-blocking" << LOG_ENDL; + return EXIT_FAILURE; + } + if (bind(listen_fd, (struct sockaddr *)&listen_addr, sizeof(listen_addr)) < 0) { - LOG_ERROR << "bind failed" << std::endl; + LOG_ERROR << "bind failed" << LOG_ENDL; return EXIT_FAILURE; } if (listen(listen_fd, 5) < 0) { - LOG_ERROR << "listen failed" << std::endl; + LOG_ERROR << "listen failed" << LOG_ENDL; return EXIT_FAILURE; } // Set the socket to non-blocking, this is essential in event based programming with libevent. - int reuseaddr_on = REUSEADDR_ON; - setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_on, sizeof(reuseaddr_on)); - if (setnonblock(listen_fd) < 0) - { - LOG_ERROR << "failed to set server socket to non-blocking" << std::endl; - return EXIT_FAILURE; - } // We now have a listening socket, we create a read event to be notified when a client connects. struct event ev_accept; @@ -284,9 +287,17 @@ // Start the event loop. event_dispatch(); + close(listen_fd); + listen_fd = 0; return EXIT_SUCCESS; } +void server_stop() +{ + LOG_NOTICE << "server_stop" << LOG_ENDL; + event_loopexit(NULL); +} + void ev_send_status_packet(EVClientStub& client, EVPStatus::EVPS status) { client.sendBuffSize = sizeof(EVPHeader)+sizeof(EVP_Status); -- Gitblit v1.8.0