📄 server.cpp
字号:
#include "debug.hpp"
#include "server.hpp"
TcpServer::TcpServer(const unsigned short port, const unsigned int thread_count) throw (ErrorCode) {
m_listen_addr.sin_family = AF_INET;
m_listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
m_listen_addr.sin_port = htons(port);
m_thread_count = thread_count;
pthread_mutex_init(&m_accept_lock, NULL);
m_stop = false;
}
TcpServer::~TcpServer() {
stop();
close(m_listen_socket);
pthread_mutex_destroy(&m_accept_lock);
}
void TcpServer::start() throw (ErrorCode) {
m_listen_socket = socket(PF_INET, SOCK_STREAM, 0);
if (m_listen_socket < 0) {
throw TcpServer::ERROR_CREATING_SOCKET;
}
if (bind(m_listen_socket, (sockaddr *)&m_listen_addr, sizeof(sockaddr_in)) < 0) {
throw TcpServer::ERROR_BINDING_ADDRESS;
}
if (listen(m_listen_socket, m_thread_count*2) < 0) {
throw TcpServer::ERROR_LISTENING;
}
for (unsigned int i=0; i<m_thread_count; ++i) {
pthread_t thread;
pthread_create(&thread, NULL, worker_wrapper, (void *)this);
m_threads.insert(thread);
}
}
void TcpServer::stop() {
for (ThreadSet::iterator i=m_threads.begin(); i!=m_threads.end(); ++i) {
pthread_cancel(*i);
}
}
void TcpServer::worker_entry() {
sockaddr_in client;
for (;;) {
pthread_mutex_lock(&m_accept_lock);
if (m_stop) {
pthread_mutex_unlock(&m_accept_lock);
return;
}
socklen_t len;
int serve_socket = accept(m_listen_socket, (sockaddr *)&client, &len);
pthread_mutex_unlock(&m_accept_lock);
if (serve_socket < 0) {
continue;
}
serve(serve_socket, client);
}
}
void *TcpServer::worker_wrapper(void *param) {
((TcpServer *)param)->worker_entry();
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -