用fork()来支持并发访问服务器简单的http访问
时间: 2023-12-17 10:04:18 浏览: 66
使用fork()函数可以实现简单的并发访问服务器,实现方式如下:
1. 服务器在一个循环中等待客户端请求。
2. 当有一个请求到来时,使用fork()函数创建一个新的进程来处理该请求。
3. 子进程处理该请求,父进程继续等待其他请求。
4. 子进程处理完请求后结束进程,释放资源。
下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define MAX_CONN 10
void handle_request(int client_socket) {
char buffer[1024] = {0};
read(client_socket, buffer, 1024);
printf("Received message: %s\n", buffer);
char *response = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n<html><body><h1>Hello, World!</h1></body></html>";
write(client_socket, response, strlen(response));
close(client_socket);
}
int main() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int addrlen = sizeof(server_address);
// 创建套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定地址和端口
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听端口
if (listen(server_socket, MAX_CONN) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
while (1) {
// 等待客户端连接
client_socket = accept(server_socket, (struct sockaddr *)&client_address, (socklen_t*)&addrlen);
if (client_socket < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 创建子进程处理请求
pid_t pid = fork();
if (pid == 0) {
// 子进程处理请求
handle_request(client_socket);
exit(EXIT_SUCCESS);
} else if (pid < 0) {
perror("fork failed");
exit(EXIT_FAILURE);
}
// 父进程继续监听
}
return 0;
}
```
在该示例中,我们创建了一个简单的HTTP服务器,它可以监听来自客户端的请求并返回“Hello, World!”的响应。使用fork()函数可以实现多个客户端同时访问服务器。
阅读全文