• C/C++网络编程9——多进程服务器端实现


    #include <iostream>
    #include <unistd.h>
    #include <cstdlib>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <signal.h>
    #include <string>
    
    using namespace std;
    
    const int BUFFER_SIZE = 1024;
    
    void read_child_proc(int sig)
    {
        int status = 0;
        waitpid(-1, &status, WNOHANG);
    }
    
    int deal_error(string error_msg)
    {
        cout << error_msg << endl;
        return 0;
    }
    
    int main()
    {
        // 创建套接字
        int ser_sock = socket(PF_INET, SOCK_STREAM, 0);
        if (ser_sock == -1) {
            return deal_error("socket() failed");
        }
    
        // 套接字绑定ip及端口号
        sockaddr_in ser_addr;
        ser_addr.sin_family = AF_INET;
        ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        ser_addr.sin_port = htons(9999);
        if (bind(ser_sock, (sockaddr *)&ser_addr, sizeof(ser_addr)) == -1) {
            close(ser_sock);
            return deal_error("bind() failed");
        }
    
        // 开始监听
        if (listen(ser_sock, 5) == -1) {
            close(ser_sock);
            return deal_error("listen() failed");
        }
    
        // 注册信号
        signal(SIGCHLD, read_child_proc);   // 子进程执行结束信号注册,防止僵尸进程产生
        signal(SIGINT, exit);               // CTRL+C信号注册,退出程序
    
        while(1) {
            sockaddr_in clnt_addr;
            socklen_t addr_length = sizeof(clnt_addr);
            int clnt_sock = accept(ser_sock, (sockaddr *)&clnt_addr, &addr_length);
            if (clnt_sock == -1) {
                continue;
            }
    
            cout << "new client connected: " << clnt_sock << endl;
            pid_t pid = fork();
            if (pid < 0) {
                continue;
            } else if (pid == 0) {  // 子进程
                close(ser_sock);
                char message[BUFFER_SIZE];
                int str_len = read(clnt_sock, message, BUFFER_SIZE-1);
                if (str_len > 0) {
                    message[str_len] = '';
                    cout << message << endl;
                }
                close(clnt_sock);
                sleep(60);
                return 0;
            } else {    // 父进程
                close(clnt_sock);
            }
        }
    
        close(ser_sock);
        return 0;
    }
  • 相关阅读:
    1-15-2-RAID1 企业级RAID磁盘阵列的搭建(RAID1、RAID5、RAID10)
    1-15-1 RAID磁盘阵列的原理和搭建
    伪随机数算法(一)
    Swing---WindowConstants
    cmd_ping命令
    开灯问题
    freopen()函数
    Beginning Python Chapter 3 Notes
    Beginning Python Chapter 2 Notes
    String | StringBuffer | StringBuilder 比较
  • 原文地址:https://www.cnblogs.com/418ks/p/11723005.html
Copyright © 2020-2023  润新知