c做服务器多进程逻辑
- 行业动态
- 2025-02-13
- 3508
多进程服务器逻辑:主进程监听端口,接收客户端连接请求后,创建子进程处理请求。
在C语言中,使用多进程来实现服务器是一种常见的并发处理方式,以下是详细的实现逻辑:

1、创建套接字:
使用socket()
函数创建一个套接字,用于监听客户端的连接请求。
示例代码:int server_fd = socket(AF_INET, SOCK_STREAM, 0);

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、监听套接字:

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