标准c语言实现简单web服务器
时间: 2023-08-17 19:28:25 浏览: 43
实现一个简单的Web服务器,可以使用标准C语言和BSD sockets库。下面是一个简单的示例代码,可以实现基本的GET请求和响应,以及错误处理。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 8080
#define BUFFER_SIZE 4096
void error(char *msg) {
perror(msg);
exit(1);
}
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
char buffer[BUFFER_SIZE];
int bytes_read;
// 创建套接字
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
error("ERROR opening socket");
}
// 绑定服务器地址和端口
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(SERVER_PORT);
if (bind(server_fd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0) {
error("ERROR on binding");
}
// 监听连接请求
if (listen(server_fd, 5) < 0) {
error("ERROR on listening");
}
printf("Server started on port %d\n", SERVER_PORT);
// 接受客户端连接并处理请求
while(1) {
client_len = sizeof(client_addr);
client_fd = accept(server_fd, (struct sockaddr*) &client_addr, &client_len);
if (client_fd < 0) {
error("ERROR on accept");
}
printf("Client connected from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 读取客户端请求
bytes_read = read(client_fd, buffer, sizeof(buffer)-1);
if (bytes_read < 0) {
error("ERROR reading from socket");
}
buffer[bytes_read] = '\0';
// 处理GET请求
if (strncmp(buffer, "GET ", 4) == 0) {
char *path = buffer + 4;
char *end = strchr(path, ' ');
if (end != NULL) {
*end = '\0';
if (access(path, F_OK) == 0) {
FILE *file = fopen(path, "r");
if (file != NULL) {
// 发送响应头
dprintf(client_fd, "HTTP/1.1 200 OK\r\n");
dprintf(client_fd, "Content-Type: text/html\r\n");
dprintf(client_fd, "\r\n");
// 发送响应内容
while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) > 0) {
write(client_fd, buffer, bytes_read);
}
fclose(file);
} else {
dprintf(client_fd, "HTTP/1.1 500 Internal Server Error\r\n");
dprintf(client_fd, "Content-Type: text/plain\r\n");
dprintf(client_fd, "\r\n");
dprintf(client_fd, "500 Internal Server Error\n");
}
} else {
dprintf(client_fd, "HTTP/1.1 404 Not Found\r\n");
dprintf(client_fd, "Content-Type: text/plain\r\n");
dprintf(client_fd, "\r\n");
dprintf(client_fd, "404 Not Found\n");
}
}
} else {
dprintf(client_fd, "HTTP/1.1 400 Bad Request\r\n");
dprintf(client_fd, "Content-Type: text/plain\r\n");
dprintf(client_fd, "\r\n");
dprintf(client_fd, "400 Bad Request\n");
}
close(client_fd);
}
close(server_fd);
return 0;
}
```
该服务器可以通过编译并运行,然后使用Web浏览器访问它。当服务器接收到GET请求时,它会查找请求路径上是否存在文件,并将文件内容作为响应发送回客户端。如果文件不存在或访问文件时发生错误,则会发送适当的错误响应。