⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 是一个多线程虚函数实现的c++版的socket程序
💻 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 + -