当前位置: 首页 > news >正文

做网站需要什么服务器重庆网上注册公司网站

做网站需要什么服务器,重庆网上注册公司网站,泉州百度推广排名优化,商标注册查询官网app多进程网络服务端详细说明文档 一、概述 本项目实现了一个基于多进程的 TCP 网络服务端#xff0c;主要用于处理多个客户端的连接请求。为了提高代码的可维护性和可复用性#xff0c;分成了头文件#xff08;.h#xff09;和多个源文件#xff08;.cpp#xff09;。具体…多进程网络服务端详细说明文档 一、概述 本项目实现了一个基于多进程的 TCP 网络服务端主要用于处理多个客户端的连接请求。为了提高代码的可维护性和可复用性分成了头文件.h和多个源文件.cpp。具体包含 ctcpserver.h、ctcpserver.cpp 和 multi_process_network_server.cpp 三个文件。 二、文件结构及功能 1. ctcpserver.h 功能该头文件主要用于声明 ctcpserver 类定义了类的成员变量和成员函数接口起到了对类的功能进行抽象和声明的作用方便其他源文件引用该类。关键内容 成员变量 m_listenfd监听的 socket 描述符-1 表示未初始化。m_clientfd客户端连接的 socket 描述符-1 表示客户端未连接。m_clientip客户端的 IP 地址以字符串形式存储。m_port服务端用于通信的端口号。 成员函数声明包含了构造函数、析构函数以及一系列用于初始化服务端、接受客户端连接、发送和接收数据、关闭 socket 等操作的函数声明。 class ctcpserver { private:int m_listenfd;int m_clientfd;std::string m_clientip;unsigned short m_port; public:ctcpserver();~ctcpserver();bool initserver(const unsigned short in_port);bool accept();const std::string clientip() const;bool send(const std::string buffer);bool recv(std::string buffer, const size_t maxlen);bool closelisten();bool closeclient(); };2. ctcpserver.cpp 功能该源文件实现了 ctcpserver.h 中声明的 ctcpserver 类的所有成员函数是类的具体实现部分。关键函数及实现细节 构造函数 ctcpserver::ctcpserver()初始化 m_listenfd 和 m_clientfd 为 -1表示初始状态下监听 socket 和客户端 socket 未初始化。析构函数 ctcpserver::~ctcpserver()调用 closelisten() 和 closeclient() 函数确保在对象销毁时关闭监听 socket 和客户端 socket释放资源。initserver 函数 使用 socket() 函数创建一个 TCP 套接字使用 IPv4 协议AF_INET和面向连接的 TCP 协议SOCK_STREAM。填充 sockaddr_in 结构体设置协议族、端口号使用 htons() 进行字节序转换和 IP 地址INADDR_ANY 表示监听所有可用 IP。使用 bind() 函数将套接字绑定到指定的 IP 和端口若绑定失败则关闭套接字并返回 false。使用 listen() 函数将套接字设置为监听状态允许最多 5 个客户端连接请求进入队列若设置失败则关闭套接字并返回 false。 accept 函数 使用 accept() 函数从监听队列中取出一个客户端连接请求返回一个新的套接字描述符用于与该客户端通信。使用 inet_ntoa() 函数将客户端的 IP 地址从大端序转换为字符串格式并存储在 m_clientip 中。 send 函数检查客户端 socket 是否有效若有效则使用 send() 函数向客户端发送数据。recv 函数 清空接收缓冲区并调整其大小为指定的最大长度。使用 recv() 函数接收客户端发送的数据若接收失败则清空缓冲区并返回 false否则根据实际接收的字节数调整缓冲区大小并返回 true。 closelisten 函数关闭监听 socket 并将 m_listenfd 设置为 -1。closeclient 函数关闭客户端 socket 并将 m_clientfd 设置为 -1。 3. multi_process_network_server.cpp 功能该文件是整个服务端程序的入口包含 main 函数和信号处理函数负责初始化服务端、处理客户端连接和信号处理。关键流程及函数说明 main 函数 参数检查检查命令行参数是否正确若不正确则输出使用说明并退出程序。信号处理设置 使用 for 循环忽略所有信号避免程序被不必要的信号干扰同时解决僵尸进程问题。设置 SIGTERM 和 SIGINT 信号的处理函数为 FathEXIT允许通过 kill 命令或 Ctrl C 正常终止程序。 服务端初始化调用 tcpserver.initserver() 函数初始化服务端监听 socket若初始化失败则输出错误信息并退出。客户端连接处理 使用 while 循环不断接受客户端连接请求若接受失败则输出错误信息并退出。调用 fork() 函数创建子进程父进程关闭客户端 socket 并继续等待下一个客户端连接子进程关闭监听 socket重新设置信号处理函数并与客户端进行通信。 子进程通信处理 循环接收客户端发送的数据若接收失败则退出循环。接收到数据后向客户端发送 “ok” 作为响应若发送失败则退出循环。 信号处理函数 FathEXIT 函数处理父进程接收到的 SIGTERM 和 SIGINT 信号。首先屏蔽这两个信号防止信号处理函数被中断输出父进程退出信息使用 kill(0, SIGTERM) 向所有子进程发送终止信号关闭监听 socket 并退出父进程。ChldEXIT 函数处理子进程接收到的 SIGTERM 信号。屏蔽 SIGINT 和 SIGTERM 信号输出子进程退出信息关闭客户端 socket 并退出子进程。 四、注意事项 资源管理每个子进程在处理完与客户端的通信后必须退出否则会继续进入 accept 函数导致错误。同时要确保在程序结束时正确关闭所有 socket 资源避免资源泄漏。信号处理信号处理函数中屏蔽了 SIGINT 和 SIGTERM 信号防止信号处理函数被中断确保程序的稳定性。高并发场景该程序使用多进程处理客户端连接每个客户端连接会创建一个新的子进程可能会消耗较多的系统资源。在高并发场景下可以考虑使用多线程或异步 I/O 技术进行优化。 1. ctcpserver.h 头文件 #ifndef CTCP_SERVER_H #define CTCP_SERVER_H#include iostream #include string #include sys/types.h #include sys/socket.h #include arpa/inet.h #include netdb.h #include unistd.hclass ctcpserver { private:int m_listenfd; // 监听的socket-1表示未初始化int m_clientfd; // 客户端连上来的socket-1表示客户端未连接std::string m_clientip; // 客户端字符串格式的IPunsigned short m_port; // 服务端用于通讯的端口 public:ctcpserver();~ctcpserver();// 初始化服务端用于监听的socketbool initserver(const unsigned short in_port);// 受理客户端的连接bool accept();// 获取客户端的IP(字符串格式)const std::string clientip() const;// 向对端发送报文bool send(const std::string buffer);// 接收对端的报文bool recv(std::string buffer, const size_t maxlen);// 关闭监听的socketbool closelisten();// 关闭客户端连上来的socketbool closeclient(); };#endif2. ctcpserver.cpp 源文件 #include ctcpserver.h// 构造函数初始化监听socket和客户端socket为未初始化状态 ctcpserver::ctcpserver() : m_listenfd(-1), m_clientfd(-1) {}// 析构函数关闭监听socket和客户端socket ctcpserver::~ctcpserver() {closelisten();closeclient(); }// 初始化服务端用于监听的socket bool ctcpserver::initserver(const unsigned short in_port) {// 第1步创建服务端的socket// AF_INET表示使用IPv4协议SOCK_STREAM表示使用面向连接的TCP协议if ((m_listenfd socket(AF_INET, SOCK_STREAM, 0)) -1) return false;m_port in_port;// 第2步把服务端用于通信的IP和端口绑定到socket上struct sockaddr_in servaddr; // 用于存放协议、端口和IP地址的结构体memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET; // 协议族固定填AF_INETservaddr.sin_port htons(m_port); // 指定服务端的通信端口htons用于将主机字节序转换为网络字节序servaddr.sin_addr.s_addr htonl(INADDR_ANY); // 如果操作系统有多个IP全部的IP都可以用于通讯// 绑定服务端的IP和端口为socket分配IP和端口if (bind(m_listenfd, (struct sockaddr *)servaddr, sizeof(servaddr)) -1) {close(m_listenfd);m_listenfd -1;return false;}// 第3步把socket设置为可连接监听的状态// 5表示监听队列的最大长度if (listen(m_listenfd, 5) -1) {close(m_listenfd);m_listenfd -1;return false;}return true; }// 受理客户端的连接从已连接的客户端中取出一个客户端 // 如果没有已连接的客户端accept()函数将阻塞等待 bool ctcpserver::accept() {struct sockaddr_in caddr; // 客户端的地址信息socklen_t addrlen sizeof(caddr); // struct sockaddr_in的大小// 从监听队列中取出一个客户端连接if ((m_clientfd ::accept(m_listenfd, (struct sockaddr *)caddr, addrlen)) -1) return false;m_clientip inet_ntoa(caddr.sin_addr); // 把客户端的地址从大端序转换成字符串return true; }// 获取客户端的IP(字符串格式) const std::string ctcpserver::clientip() const {return m_clientip; }// 向对端发送报文成功返回true失败返回false bool ctcpserver::send(const std::string buffer) {if (m_clientfd -1) return false;// 发送报文if ((::send(m_clientfd, buffer.data(), buffer.size(), 0)) 0) return false;return true; }// 接收对端的报文成功返回true失败返回false // buffer - 存放接收到的报文的内容maxlen - 本次接收报文的最大长度 bool ctcpserver::recv(std::string buffer, const size_t maxlen) {buffer.clear(); // 清空容器buffer.resize(maxlen); // 设置容器的大小为maxlen// 直接操作buffer的内存接收数据int readn ::recv(m_clientfd, buffer[0], buffer.size(), 0);if (readn 0) {buffer.clear();return false;}buffer.resize(readn); // 重置buffer的实际大小return true; }// 关闭监听的socket bool ctcpserver::closelisten() {if (m_listenfd -1) return false;::close(m_listenfd);m_listenfd -1;return true; }// 关闭客户端连上来的socket bool ctcpserver::closeclient() {if (m_clientfd -1) return false;::close(m_clientfd);m_clientfd -1;return true; }3. multi_process_network_server.cpp 主源文件 #include iostream #include cstdio #include cstring #include cstdlib #include unistd.h #include netdb.h #include signal.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #include ctcpserver.hctcpserver tcpserver;// 父进程的信号处理函数 void FathEXIT(int sig); // 子进程的信号处理函数 void ChldEXIT(int sig);int main(int argc, char *argv[]) {// 检查命令行参数if (argc ! 2) {std::cout Using:./multi_process_network_server 通讯端口\nExample:./multi_process_network_server 5005\n\n;std::cout 注意运行服务端程序的Linux系统的防火墙必须要开通5005端口。\n;std::cout 如果是云服务器还要开通云平台的访问策略。\n\n;return -1;}// 忽略全部的信号不希望被打扰。顺便解决了僵尸进程的问题for (int ii 1; ii 64; ii) signal(ii, SIG_IGN);// 设置信号,在shell状态下可用 kill 进程号 或 Ctrlc 正常终止些进程// 但请不要用 kill -9 进程号 强行终止signal(SIGTERM, FathEXIT);signal(SIGINT, FathEXIT); // SIGTERM 15 SIGINT 2// 初始化服务端用于监听的socketif (tcpserver.initserver(atoi(argv[1])) false) {perror(initserver());return -1;}while (true) {// 受理客户端的连接从已连接的客户端中取出一个客户端// 如果没有已连接的客户端accept()函数将阻塞等待if (tcpserver.accept() false) {perror(accept());return -1;}// 创建子进程处理客户端连接int pid fork();if (pid -1) {perror(fork());return -1;} // 系统资源不足if (pid 0) {// 父进程tcpserver.closeclient(); // 父进程关闭客户端连接的socketcontinue; // 父进程返回到循环开始的位置继续受理客户端的连接}// 子进程tcpserver.closelisten(); // 子进程关闭监听的socket// 子进程需要重新设置信号signal(SIGTERM, ChldEXIT); // 子进程的退出函数与父进程不一样signal(SIGINT, SIG_IGN); // 子进程不需要捕获SIGINT信号// 子进程负责与客户端进行通讯std::cout 客户端已连接( tcpserver.clientip() )。\n;std::string buffer;while (true) {// 接收对端的报文如果对端没有发送报文recv()函数将阻塞等待if (tcpserver.recv(buffer, 1024) false) {perror(recv());break;}std::cout 接收 buffer std::endl;buffer ok;if (tcpserver.send(buffer) false) { // 向对端发送报文perror(send);break;}std::cout 发送 buffer std::endl;}return 0; // 子进程一定要退出否则又会回到accept()函数的位置} }// 父进程的信号处理函数 void FathEXIT(int sig) {// 以下代码是为了防止信号处理函数在执行的过程中再次被信号中断signal(SIGINT, SIG_IGN);signal(SIGTERM, SIG_IGN);std::cout 父进程退出sig sig std::endl;kill(0, SIGTERM); // 向全部的子进程发送15的信号通知它们退出// 在这里增加释放资源的代码全局的资源tcpserver.closelisten(); // 父进程关闭监听的socketexit(0); }// 子进程的信号处理函数 void ChldEXIT(int sig) {// 以下代码是为了防止信号处理函数在执行的过程中再次被信号中断signal(SIGINT, SIG_IGN);signal(SIGTERM, SIG_IGN);std::cout 子进程 getpid() 退出sig sig std::endl;// 在这里增加释放资源的代码只释放子进程的资源tcpserver.closeclient(); // 子进程关闭客户端连上来的socketexit(0); }代码说明 ctcpserver.h定义了 ctcpserver 类的接口包括类的成员变量和成员函数的声明。使用了预处理器指令 #ifndef、#define 和 #endif 来防止头文件被重复包含。ctcpserver.cpp实现了 ctcpserver 类的成员函数包括构造函数、析构函数以及各种操作函数。multi_process_network_server.cpp主源文件包含了 main 函数和信号处理函数使用 ctcpserver 类来实现多进程的网络服务端。 编译和运行 将上述三个文件放在同一目录下使用以下命令进行编译 g -o multi_process_network_server ctcpserver.cpp multi_process_network_server.cpp编译成功后使用以下命令运行服务端程序 ./multi_process_network_server 5005其中 5005 是服务端监听的端口号你可以根据需要修改。
http://www.zqtcl.cn/news/156000/

相关文章:

  • 网站设计开发网站用c 建网站时怎么做导航菜单栏
  • 哪些网站做推广比较有效果厦门网站建设公司名单
  • 街头小吃加盟网站建设网站专题制作
  • 网站论坛推广方案加强思政部网站建设
  • 查看WordPress网站插件北京西站附近的景点有哪些
  • 网站建设技术合同模板下载怎么用phpstudy做网站
  • 青岛网站建设找二维码生成器怎么弄
  • 百度突然搜不到我的网站网络安全软件有哪些
  • 江阴做网站的地方网站维护需要的知识
  • 做网站是域名怎么申请网页设计跟做网站一样吗
  • 叮当快药网站谁做的网站开发遇到的最大困难
  • 一个域名可以建几个网站毕业设计可以做哪些简单网站
  • 知名商城网站建设报价wordpress 后台 logo
  • 单位网站建设框架yellow网站推广联盟
  • html5和php做网站做网站租用服务器
  • 网站开发中效率较高的编程语言公司域名注册流程
  • 万户网站管理系统4.0cms监控系统手机版下载
  • 宁波专业网站建设怎么做如何做一个虚拟网站
  • 网站栏目建设调研公司怎么建立一个网站
  • 苍溪建设局网站网站建设和维护采购协议
  • 代做网站微信号下载 wordpress插件
  • 泉州住房建设局网站wordpress输入html代码
  • 为什么访问外国网站速度慢沈阳网站公司排名
  • 网站建设+泰安网站项目建设策划方案
  • 微信人生里面微网站怎么做wordpress 第三方登录 代码
  • 做商城网站哪里高端大气网站案例
  • 网站做项目网站设计公司深
  • 学校做网站及费用建设网站有何要求
  • 河北邢台移动网站建设宁波网站开发公司电话
  • 免费建立个人网站申请seo搜索引擎优化推广