标准C语言实现简单Web服务器
时间: 2023-11-02 22:04:56 浏览: 44
实现简单Web服务器的关键是要理解HTTP协议和Socket编程。下面是一个简单的示例代码,实现了一个基于C语言的Web服务器,可以处理HTTP GET请求并返回指定文件。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#define PORT 8888
#define MAXLINE 1024
int main()
{
int serv_sock, clnt_sock;
struct sockaddr_in serv_addr, clnt_addr;
socklen_t clnt_addr_len;
char buf[MAXLINE];
int file_fd, file_size, n;
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
if (serv_sock < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
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(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(serv_sock, 5) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
while (1) {
clnt_addr_len = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_len);
if (clnt_sock < 0) {
perror("accept");
continue;
}
memset(buf, 0, MAXLINE);
n = recv(clnt_sock, buf, MAXLINE, 0);
if (n < 0) {
perror("recv");
close(clnt_sock);
continue;
}
char *path = strtok(buf, " ");
path = strtok(NULL, " ");
file_fd = open(path + 1, O_RDONLY);
if (file_fd < 0) {
perror("open");
close(clnt_sock);
continue;
}
file_size = lseek(file_fd, 0, SEEK_END);
lseek(file_fd, 0, SEEK_SET);
snprintf(buf, MAXLINE, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n", file_size);
send(clnt_sock, buf, strlen(buf), 0);
while ((n = read(file_fd, buf, MAXLINE)) > 0) {
send(clnt_sock, buf, n, 0);
}
close(file_fd);
close(clnt_sock);
}
close(serv_sock);
return 0;
}
```
这个示例代码使用了Socket编程的基本操作,包括创建Socket、绑定端口、监听端口、接受连接、接收数据、发送数据等。它能够处理HTTP GET请求,打开并返回指定的文件。但是这个代码还有很多不足之处,比如没有处理错误、没有处理并发连接等,需要根据实际需要进行完善。