用标准c语言搭建一个简单服务器能够完成基础的tcp连接,支持基础的client与其连接使用fork()来支持并发访问服务器简单的http访问,支持静态页面访问 支持静态页面访问,需要一定的报错机制,如404页面的建立。 (1)socket实现简单Http服务器,完成html的解析; (2)运行该服务器可以通过浏览器访问服务器目录下的 Html文件、jpg图片、css文件的载入。完成初步的Http服务器功能。并给出所有代码
时间: 2024-03-12 18:49:53 浏览: 77
标准C语言编写的Web服务器完成HTTP 请求
5星 · 资源好评率100%
好的,以下是一个简单的基于标准C语言实现的TCP服务器,支持基础的HTTP连接和静态页面访问:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 8888
#define MAX_CONN 100
void handle_conn(int conn_fd) {
char buf[1024] = {0};
char filename[128] = {0};
char *filetype;
int fd, len;
len = read(conn_fd, buf, sizeof(buf));
if (len <= 0) {
close(conn_fd);
return;
}
if (strstr(buf, "HTTP/") == NULL) {
close(conn_fd);
return;
}
sscanf(buf, "GET /%s HTTP/1.1", filename);
if (strlen(filename) == 0) {
strcpy(filename, "index.html");
}
if (access(filename, F_OK) != 0) {
sprintf(buf, "HTTP/1.1 404 Not Found\r\n\r\n");
write(conn_fd, buf, strlen(buf));
close(conn_fd);
return;
}
if ((fd = open(filename, O_RDONLY)) == -1) {
close(conn_fd);
return;
}
if (strstr(filename, ".html")) {
filetype = "text/html";
} else if (strstr(filename, ".jpg") || strstr(filename, ".jpeg")) {
filetype = "image/jpeg";
} else if (strstr(filename, ".gif")) {
filetype = "image/gif";
} else if (strstr(filename, ".png")) {
filetype = "image/png";
} else if (strstr(filename, ".css")) {
filetype = "text/css";
} else {
filetype = "text/plain";
}
sprintf(buf, "HTTP/1.1 200 OK\r\nContent-Type:%s\r\n\r\n", filetype);
write(conn_fd, buf, strlen(buf));
while ((len = read(fd, buf, sizeof(buf))) > 0) {
write(conn_fd, buf, len);
}
close(fd);
close(conn_fd);
}
int main() {
int listen_fd, conn_fd, pid;
struct sockaddr_in serv_addr, cli_addr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_fd == -1) {
perror("socket");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
if (bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
exit(1);
}
if (listen(listen_fd, MAX_CONN) == -1) {
perror("listen");
exit(1);
}
printf("Server running on port %d\n", PORT);
while (1) {
socklen_t len = sizeof(cli_addr);
conn_fd = accept(listen_fd, (struct sockaddr *)&cli_addr, &len);
if (conn_fd == -1) {
perror("accept");
continue;
}
pid = fork();
if (pid == -1) {
perror("fork");
close(conn_fd);
continue;
} else if (pid == 0) {
close(listen_fd);
handle_conn(conn_fd);
exit(0);
} else {
close(conn_fd);
}
}
return 0;
}
```
请注意,这只是一个基础的实现,仅支持静态页面访问和基础报错机制。如果需要更高级的功能,例如动态页面生成、文件上传、认证等,需要更加完善的实现。同时,这个实现也存在一些安全隐患,例如攻击者可以通过恶意请求来进行拒绝服务攻击。因此在实际生产环境中,需要进行更加细致的安全考虑。
阅读全文