实现一个简单的TCP网络程序(多进程,多线程,线程池版本的服务器)

这里只放了三个版本的服务器代码,完整代码请前往我的GitHub仓库—>戳我,戳我

tcp_process_server.hpp

#pragma once
#include"tcp_socket.hpp"
#include<signal.h>

typedef void (*Handler)(const string& buf,string& ret);

class TcpProcessServer{
  public:
    TcpProcessServer()
    {}
    ~TcpProcessServer(){
      _sock.Close();
    }
    bool Start(const string& ip,const int port,Handler handler){
      signal(SIGCLD,SIG_IGN);
      if(_sock.Bind(ip,port)==false)
        return false;
      if(_sock.Listen()==false)
        return false;
      while(1){
        TcpSocket NewSock;
        string ClientIp;
        int ClientPort;
        if(_sock.Accept(&NewSock,ClientIp,ClientPort)==false)
          continue;
        printf("[%s:%d]客户端已连接!~\n",ClientIp.c_str(),ClientPort);
        ProcessConnect(NewSock,ClientIp,ClientPort,handler);
      }
      return true;
    }
  private:
    void ProcessConnect(TcpSocket& NewSock,const string& ip,const int port,Handler handler){
      int fid=fork();
      if(fid>0){
        NewSock.Close();
        return;
      }
      while(1){
        string msg;
        int n=NewSock.Recv(msg);
        if(n<0){
          continue;
        }
        else if(n==0){
          printf("[%s:%d]客户端已断开!\n",ip.c_str(),port);
          break;
        }
        printf("[%s:%d]客户端发送了:%s\n",ip.c_str(),port,msg.c_str());
        string ret;
        handler(msg,ret);
        if(NewSock.Send(ret)==false)
          continue;
      }
      NewSock.Close();
      exit(0);
    }
    TcpSocket _sock;
};

tcp_thread_server.hpp

#pragma once
#include"tcp_socket.hpp"
#include<pthread.h>
typedef void (*Handler)(const string& buf,string& ret);

class TcpThreadServer{
  public:
    TcpThreadServer(){

    }
    ~TcpThreadServer(){
      _listen_sock.Close();
    }
    bool Start(const string& ip,const int port,Handler handler){
      int n=_listen_sock.Bind(ip,port);
      if(n<0){
        return false;
      }
      n=_listen_sock.Listen();
      if(n<0){
        return false;
      }
      while(1){
        TcpSocket client_sock;
        string peer_ip;
        int peer_port;
        if(_listen_sock.Accept(&client_sock,peer_ip,peer_port)==false)
          continue;
        printf("[%s:%d]客户端已连接!\n",peer_ip.c_str(),peer_port);
        ProcessClient(client_sock,ip,port,handler);
      }
    }
  private:
    TcpSocket _listen_sock;
    struct ThreadEntryArg{
      TcpSocket client_sock;
      string ip;
      int port;
      Handler handler;
    };
    void ProcessClient(TcpSocket& client_sock,const string& ip,const int port,Handler handler){
      pthread_t tid;
      ThreadEntryArg* arg=new ThreadEntryArg;
      arg->client_sock=client_sock;
      arg->ip=ip;
      arg->handler=handler;
      arg->port=port;
      pthread_create(&tid,NULL,ThreadEntry,(void*)arg);
      pthread_detach(tid);
    }
    static void* ThreadEntry(void* arg){
      ThreadEntryArg* argument=(ThreadEntryArg*)arg;
      string ip=argument->ip;
      int port=argument->port;
      Handler handler=argument->handler;
      TcpSocket client_sock=argument->client_sock;

      while(1){
        string req;
        int ret=client_sock.Recv(req);
        if(ret<0){
          continue;
        }
        else if(ret==0){
          printf("[%s:%d]客户端断连接!\n",ip.c_str(),port);
          break;
        }
        printf("[%s:%d]客户端输入:%s\n",ip.c_str(),port,req.c_str());
        string resp;
        handler(req,resp);
        client_sock.Send(resp);
      }
      client_sock.Close();
      delete argument;
      return NULL;
    }
};

tcp_threadpool_server.hpp

#pragma once
#include"tcp_socket.hpp"
#include<pthread.h>
#include"threadpool.hpp"
#include<sys/syscall.h>
#include<unistd.h>
#include<stdio.h>
  
typedef void (*Handler)(const string& ip,string& ret);
struct Arg{
  TcpSocket _sock;
  string _ip;
  int _port;
  Handler _handler;
};

class MyStack:public Stack{
  public:
    MyStack(void* arg)
      :Stack(arg)
      {}
    virtual void Entry()override
    {
      Arg *ret=(Arg*)_arg;
      TcpSocket ArgSock=ret->_sock;
      string ArgIp=ret->_ip;
      int ArgPort=ret->_port;
      Handler ArgHandler=ret->_handler;
      while(1){
        string msg;
        int n=ArgSock.Recv(msg);
        if(n<0){
          continue;
        }
        else if(n==0){
          printf("[%s:%d]客户端已经关闭!\n",ArgIp.c_str(),ArgPort);
          break;
        }
        printf("[%s:%d]客户端输入:%s\n",ArgIp.c_str(),ArgPort,msg.c_str());
        string ret;
        ArgHandler(msg,ret);
        if(ArgSock.Send(ret)==false)
          continue;
      }
      ArgSock.Close();
      delete ret;
    }
};


class TcpThreadServer{
  public:
    TcpThreadServer()
      :pool(10)
    {}
    ~TcpThreadServer(){
      _sock.Close();
    }
    bool Start(const string& ip,const int port,Handler handler){
      if(_sock.Bind(ip,port)==false)
        return false;
      if(_sock.Listen()==false)
        return false;
      while(1){
        Arg *NewArg=new Arg;
        NewArg->_handler=handler;
        if(_sock.Accept(&(NewArg->_sock),NewArg->_ip,NewArg->_port)==false)
          continue;
        printf("[%s:%d]客户端已连接!\n",NewArg->_ip.c_str(),NewArg->_port);
        pool.AddStack(new MyStack((void*)NewArg));
      }
    }

  private:
    TcpSocket _sock;
    ThreadPool pool;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Linux多线程服务器编程PDF》是一本关于在Linux系统下进行多线程服务器编程的电子书。它主要讲解了如何利用Linux的多线程技术来搭建高性能的服务器应用程序。 这本书首先介绍了多线程编程的基本概念和原理,包括线程的创建与销毁、线程同步与互斥、线程调度等。然后,针对服务器应用开发过程中的常见问题,详细讲解了如何利用多线程解决这些问题,比如如何处理多个客户端的并发请求、如何实现高效的请求处理、如何解决资源竞争和线程安全等。 除了基础知识和问题解决方法,本书还深入探讨了多线程服务器的性能优化技巧。作者通过实例演示了如何利用线程池、异步IO和事件驱动等技术来提高服务器的并发性能和响应速度。同时,还介绍了一些常用的性能监测工具和调优方法,帮助读者找出性能瓶颈并进行优化。 阅读这本书可以帮助读者掌握Linux下多线程服务器编程的核心技术,从而设计和实现高性能、稳定性好的服务器应用程序。无论是对于专业开发人员还是对于对服务器编程感兴趣的学习者来说,都是一本非常实用的参考书籍。 ### 回答2: 《Linux多线程服务器编程PDF》是一本关于如何在Linux环境下进行多线程服务器编程的书籍。这本书主要介绍了如何利用Linux操作系统的特性来实现高效的多线程服务器程序。 在这本书中,首先会介绍多线程服务器编程的基础知识,包括线程和进程的概念,以及多线程编程的优势和挑战。然后,会详细讲解如何使用Linux提供的系统调用和库函数来创建和管理线程,以及如何利用线程之间的同步和互斥机制来实现高效的并发处理。 此外,书中还会介绍如何利用Linux提供的网络编程接口来实现基于TCP/IP协议的网络通信。它将介绍如何创建和管理套接字,以及如何使用套接字进行客户端和服务器之间的通信。同时,也会介绍如何使用多线程来处理多个客户端的请求,以及如何利用线程池来优化服务器的性能。 除了介绍基本的多线程服务器编程技术之外,这本书还会介绍一些高级的主题,如如何处理并发访问共享资源的问题,如何利用信号来实现进程间的通信,以及如何使用多进程多线程的混合编程模型。 总之,这本《Linux多线程服务器编程PDF》是一本全面而实用的指南,适合对多线程服务器编程感兴趣的读者学习和参考。通过学习这本书,读者可以了解到在Linux环境下如何编写高效且稳定的多线程服务器程序,提高应对高并发访问的能力,并为实际项目开发提供指导和支持。 ### 回答3: 《Linux多线程服务器编程》是一本介绍在Linux环境下开发多线程服务器程序的PDF电子书。本书主要内容包括多线程编程的基础知识、线程间同步与通信、线程池的设计与实现多线程服务器的模型与架构等。这本书通过详细讲解多线程编程的原理、技巧和注意事项,帮助读者理解多线程服务器的基本概念和工作原理,掌握多线程编程的核心技术。 《Linux多线程服务器编程》首先介绍了多线程编程的基本概念和背景,包括线程的定义、线程的创建与销毁、线程的同步与互斥等。然后,书中详细讲解了多线程编程中常用的同步与通信机制,如互斥量、条件变量、信号量等,以及它们的具体应用场景和用法。 接着,本书介绍了线程池的设计与实现线程池是一种常用的服务器编程模型,可以提高服务器的性能和可扩展性。本书详细讲解了线程池的设计原理、线程池的管理与调度算法,以及线程池在实际服务器程序中的应用。通过学习线程池的设计与实现,读者可以更好地理解服务器程序的并发模型和性能优化技巧。 最后,本书介绍了多线程服务器的模型与架构。通过实际案例和代码示例,读者可以了解到多线程服务器的常用设计模式和架构思想,如单线程多路复用模型、多线程非阻塞模型等。这些模型和思想可以帮助读者设计和开发高性能、稳定可靠的多线程服务器程序。 综上所述,《Linux多线程服务器编程》是一本非常实用和全面的指南,适合对Linux服务器编程感兴趣的读者学习和参考。无论是初学者还是有一定经验的程序员,都可以通过阅读本书,全面提升自己在多线程服务器编程方面的能力和水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值