完成基础的tcp连接,支持基础的client与其连接使用fork()来支持并发访问服务器简单的http访问,支持静态页面访问 支持静态页面访问,需要一定的报错机制,如404页面的建立。 (1)socket实现简单Http服务器,完成html的解析; (2)运行该服务器可以通过浏览器访问服务器目录下的 Html文件、jpg图片、css文件的载入。完成初步的Http服务器功能。C语言
时间: 2024-02-03 14:14:01 浏览: 69
tcp_server_v1.rar_linux TCP并发_linux tcp server
5星 · 资源好评率100%
好的,实现简单的Http服务器可以分为以下几个步骤:
1. 创建TCP socket并绑定到指定端口
2. 接受客户端连接请求
3. 读取HTTP请求并解析出请求的资源路径
4. 根据资源路径读取对应的文件内容,并构造HTTP响应报文
5. 发送HTTP响应报文给客户端
6. 关闭连接
下面是一个简单的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#define SERVER_PORT 8080
#define MAX_LINE 2048
void handle_request(int client_fd);
int main(int argc, char *argv[]) {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
pid_t pid;
// 创建TCP socket并绑定到指定端口
server_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 监听端口
listen(server_fd, 5);
while (1) {
// 接受客户端连接请求
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
printf("Error accepting connection: %s\n", strerror(errno));
continue;
}
// 创建子进程处理连接
pid = fork();
if (pid == 0) { // 子进程
close(server_fd);
handle_request(client_fd);
exit(0);
} else if (pid > 0) { // 父进程
close(client_fd);
} else { // 出错
printf("Error creating child process: %s\n", strerror(errno));
close(client_fd);
}
}
return 0;
}
void handle_request(int client_fd) {
char buf[MAX_LINE];
char method[MAX_LINE], path[MAX_LINE], protocol[MAX_LINE];
struct stat file_info;
int file_fd, len;
// 读取HTTP请求
memset(buf, 0, MAX_LINE);
len = read(client_fd, buf, MAX_LINE);
if (len < 0) {
printf("Error reading request: %s\n", strerror(errno));
return;
}
// 解析HTTP请求
sscanf(buf, "%s %s %s", method, path, protocol);
// 处理GET请求
if (strcasecmp(method, "GET") == 0) {
// 根据资源路径读取文件内容
if (stat(path + 1, &file_info) < 0) {
// 文件不存在,返回404错误
sprintf(buf, "HTTP/1.1 404 Not Found\r\n\r\n");
write(client_fd, buf, strlen(buf));
return;
}
file_fd = open(path + 1, O_RDONLY);
if (file_fd < 0) {
printf("Error opening file: %s\n", strerror(errno));
return;
}
// 构造HTTP响应报文
sprintf(buf, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n", (int)file_info.st_size);
write(client_fd, buf, strlen(buf));
while ((len = read(file_fd, buf, MAX_LINE)) > 0) {
write(client_fd, buf, len);
}
close(file_fd);
} else {
// 不支持的方法,返回405错误
sprintf(buf, "HTTP/1.1 405 Method Not Allowed\r\n\r\n");
write(client_fd, buf, strlen(buf));
}
}
```
这个简单的Http服务器实现了基本的静态页面访问功能,可以通过浏览器访问服务器目录下的HTML文件、JPG图片、CSS文件的载入。如果请求的文件不存在,会返回404错误;如果使用了不支持的HTTP方法,会返回405错误。当客户端连接断开时,该子进程就会退出,父进程会继续监听新的连接。
阅读全文