在vs2022的环境下实现标准C语言实现简单Web服务器完成基础的tcp连接,并且支持基础的client与其连接使用fork()来支持并发访问服务器简单的http访问,支持静态页面访问 支持静态页面访问,需要一定的报错机制,如404页面的建立。 (1)socket实现简单Http服务器,完成html的解析; (2)运行该服务器可以通过浏览器访问服务器目录下的 Html文件、jpg图片、css文件的载入。完成初步的Http服务器功能。
时间: 2024-03-05 21:53:43 浏览: 68
c语言多进程tcp服务器示例
这是一个比较复杂的问题,需要一定的时间和代码实现。以下是一个简单的实现思路:
1. 创建一个socket,绑定到指定的端口上,等待客户端连接;
2. 当客户端连接后,使用fork()创建一个新的进程来处理客户端请求;
3. 在新的进程中,读取客户端请求的内容,解析出请求的文件名和请求方法;
4. 根据请求的文件名,打开相应的文件,读取文件内容,并将文件内容发送给客户端;
5. 如果文件不存在或出错,返回相应的错误页面;
6. 关闭socket,结束进程。
以下是一个简单的C语言实现示例代码:
```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>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PORT 8080
#define MAXLINE 1024
void handle_client(int connfd) {
char buf[MAXLINE], method[MAXLINE], path[MAXLINE], protocol[MAXLINE];
char *filetype = NULL, *ptr = NULL;
struct stat sbuf;
int fd, n;
n = read(connfd, buf, MAXLINE);
if (n <= 0)
return;
sscanf(buf, "%s %s %s", method, path, protocol);
if (strcasecmp(method, "GET"))
return;
if (stat(path + 1, &sbuf) < 0) {
sprintf(buf, "HTTP/1.0 404 Not Found\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "Content-Type: text/html\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "<html><body>File not found</body></html>\r\n");
write(connfd, buf, strlen(buf));
return;
}
if (S_ISDIR(sbuf.st_mode)) {
sprintf(buf, "HTTP/1.0 200 OK\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "Content-Type: text/html\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "\r\n");
write(connfd, buf, strlen(buf));
sprintf(buf, "<html><head><title>Directory Listing</title></head><body><h1>Directory Listing</h1><hr><ul>");
write(connfd, buf, strlen(buf));
fd = open("index.html", O_RDONLY);
if (fd >= 0) {
n = read(fd, buf, MAXLINE);
write(connfd, buf, n);
close(fd);
}
sprintf(buf, "</ul><hr></body></html>\r\n");
write(connfd, buf, strlen(buf));
return;
}
if (S_ISREG(sbuf.st_mode)) {
fd = open(path + 1, O_RDONLY);
if (fd < 0)
return;
sprintf(buf, "HTTP/1.0 200 OK\r\n");
write(connfd, buf, strlen(buf));
filetype = strrchr(path, '.');
if (filetype) {
if (strcmp(filetype, ".html") == 0)
sprintf(buf, "Content-Type: text/html\r\n");
else if (strcmp(filetype, ".jpg") == 0)
sprintf(buf, "Content-Type: image/jpeg\r\n");
else if (strcmp(filetype, ".gif") == 0)
sprintf(buf, "Content-Type: image/gif\r\n");
else if (strcmp(filetype, ".css") == 0)
sprintf(buf, "Content-Type: text/css\r\n");
else
sprintf(buf, "Content-Type: application/octet-stream\r\n");
}
else {
sprintf(buf, "Content-Type: application/octet-stream\r\n");
}
write(connfd, buf, strlen(buf));
sprintf(buf, "\r\n");
write(connfd, buf, strlen(buf));
while ((n = read(fd, buf, MAXLINE)) > 0)
write(connfd, buf, n);
close(fd);
return;
}
}
int main() {
int listenfd, connfd;
socklen_t clilen;
struct sockaddr_in servaddr, cliaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
perror("socket error");
exit(-1);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind error");
exit(-1);
}
if (listen(listenfd, 5) < 0) {
perror("listen error");
exit(-1);
}
while (1) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
if (connfd < 0) {
perror("accept error");
exit(-1);
}
if (fork() == 0) {
close(listenfd);
handle_client(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
return 0;
}
```
这是一个简单的Web服务器,可以处理静态页面的请求,支持并发访问,具有一定的报错机制。在使用时,需要将html、jpg、gif和css文件放在服务器目录下,然后运行该程序即可。
阅读全文