当前位置:首页 > 行业动态 > 正文

c做服务器多进程逻辑

多进程服务器逻辑:主进程监听端口,接收客户端连接请求后,创建子进程处理请求。

在C语言中,使用多进程来实现服务器是一种常见的并发处理方式,以下是详细的实现逻辑:

c做服务器多进程逻辑  第1张

1、创建套接字

使用socket() 函数创建一个套接字,用于监听客户端的连接请求。

示例代码:int server_fd = socket(AF_INET, SOCK_STREAM, 0);

c做服务器多进程逻辑  第2张

2、绑定套接字

使用bind() 函数将套接字与服务器的IP地址和端口号绑定在一起。

示例代码:

     struct sockaddr_in address;
     int opt = 1;
     int addrlen = sizeof(address);
     address.sin_family = AF_INET;
     address.sin_addr.s_addr = INADDR_ANY;
     address.sin_port = htons(8080);
     bind(server_fd, (struct sockaddr *)&address, sizeof(address));

3、监听套接字

c做服务器多进程逻辑  第3张

使用listen() 函数使套接字进入被动接受连接的状态。

示例代码:listen(server_fd, 3);

4、接受客户端连接并创建子进程

使用accept() 函数接受客户端的连接请求,并返回一个新的套接字描述符,用于与客户端进行通信。

对于每个接受的客户端连接,使用fork() 函数创建一个子进程来处理该连接。

父进程中关闭与客户端连接的套接字描述符,继续等待其他客户端的连接请求;子进程中关闭监听套接字,然后与客户端进行通信。

示例代码:

     while (1) {
         struct sockaddr_in client_addr;
         int addrlen = sizeof(client_addr);
         int new_socket = accept(server_fd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen);
         if (new_socket < 0) {
             perror("ERROR on accept");
             continue;
         }
         pid_t pid = fork();
         if (pid == 0) { // This is the child process
             close(server_fd); // Child doesn't need the listener
             char buffer[1024] = {0};
             read(new_socket, buffer, 1024);
             printf("%s
", buffer);
             char *message = "Hello from server";
             send(new_socket, message, strlen(message), 0);
             close(new_socket);
             exit(0);
         } else { // This is the parent process
             close(new_socket); // Parent doesn't need this socket
         }
     }

5、子进程处理客户端请求

在子进程中,通过与客户端连接的套接字描述符进行读写操作,以处理客户端的请求并发送响应。

处理完客户端请求后,关闭与客户端连接的套接字描述符,并终止子进程。

6、信号处理

为了确保僵尸进程被及时回收,可以注册一个信号处理函数来处理SIGCHLD 信号。

当子进程终止时,会向父进程发送SIGCHLD 信号,父进程在信号处理函数中调用waitpid() 函数来回收僵尸进程。

示例代码:

     void sigchld_handler(int sig) {
         while (waitpid(-1, NULL, WNOHANG) > 0);
     }

通过以上步骤,可以实现一个简单的多进程服务器,需要注意的是,多进程模型虽然可以提高服务器的并发处理能力,但也会消耗较多的系统资源,在实际应用中需要根据具体需求和系统资源情况进行选择。

0