fork()
函数生成子进程,父进程继续监听新的连接。
在C语言中,使用多进程来实现服务器是一种常见且有效的并发处理方式,下面将详细阐述其逻辑实现过程:
1、创建套接字:
使用socket()
函数创建一个套接字,指定通信域(如AF_INET
表示IPv4网络)、套接字类型(如SOCK_STREAM
表示流式套接字,适用于TCP连接)以及协议(通常为0,表示根据套接字类型自动选择默认协议)。
2、绑定地址:
调用bind()
函数将套接字与本地地址和端口号绑定在一起,需要定义一个sockaddr_in
结构体来存储服务器的IP地址和端口号信息,并将其转换为网络字节序后传递给bind()
函数。
3、监听连接:
使用listen()
函数使套接字进入被动打开状态,开始监听来自客户端的连接请求,需要指定监听套接字的最大挂起连接数,即允许排队等待的最大客户端连接数。
4、接受连接并创建子进程:
调用accept()
函数接受客户端的连接请求,该函数会阻塞等待,直到有客户端连接到服务器,当有客户端连接时,accept()
函数返回一个新的套接字描述符,用于与该客户端进行通信。
对于每一个接受的客户端连接,使用fork()
函数创建一个新的子进程,在子进程中,关闭父进程所使用的监听套接字,然后通过新创建的套接字与客户端进行数据读写操作;而在父进程中,关闭与客户端通信的套接字,继续等待其他客户端的连接请求。
5、子进程与客户端通信:
在子进程中,通过调用read()
或recv()
函数从套接字中读取客户端发送的数据,并进行相应的处理,处理完成后,可以使用write()
或send()
函数将响应数据发送回客户端。
6、资源清理:
当子进程与客户端的通信结束后,关闭与客户端通信的套接字,并退出子进程,父进程则继续等待其他客户端的连接请求,重复上述步骤。
以下是一个简单的示例代码,展示了如何使用C语言实现一个基于多进程的服务器:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <signal.h> void handle_client(int client_sock) { char buffer[1024]; ssize_t n; // 接收客户端发送的数据 while ((n = recv(client_sock, buffer, sizeof(buffer), 0)) > 0) { buffer[n] = '