完成基础的tcp连接,支持基础的client与其连接 使用fork()来支持并发访问服务器 简单的http访问,支持静态页面访问 支持静态页面访问,需要一定的报错机制,如404页面的建立。 1. socket实现简单Http服务器,完成html的解析; 2. 运行该服务器可以通过浏览器访问服务器目录下的 Html文件、jpg图片、css文件的载入。 完成初步的Http服务器功能。Window系统
时间: 2024-01-24 09:17:33 浏览: 78
要实现基础的TCP连接和支持多个客户端连接,可以使用C语言的socket编程,具体步骤如下:
1. 创建socket
使用socket()函数创建一个socket,该函数返回一个整型值作为socket的文件描述符。在Windows系统中,需要先调用WSAStartup()函数初始化Winsock库。
```c
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
```
2. 绑定端口和IP地址
使用bind()函数将socket绑定到指定的端口和IP地址上。IP地址可以使用INADDR_ANY表示任意IP地址。
```c
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
```
3. 监听连接
使用listen()函数监听连接请求。
```c
listen(sockfd, BACKLOG);
```
4. 接受连接
使用accept()函数接受来自客户端的连接请求,并返回一个新的socket文件描述符。
```c
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
```
5. 创建子进程并处理请求
使用fork()函数创建子进程来处理客户端请求。父进程可以继续监听连接请求,子进程则处理客户端请求。
```c
pid_t pid = fork();
if (pid == 0) {
// 在子进程中处理客户端请求
} else if (pid > 0) {
// 在父进程中继续监听连接请求
}
```
6. 发送和接收数据
使用send()函数发送数据,并使用recv()函数接收数据。
```c
send(client_sockfd, response, strlen(response), 0);
recv(client_sockfd, request, sizeof(request), 0);
```
7. 关闭socket
使用close()函数关闭socket。在Windows系统中,需要先调用WSACleanup()函数释放Winsock库。
```c
close(sockfd);
```
要实现支持静态页面访问的HTTP服务器,可以使用以下步骤:
1. 解析HTTP请求
客户端发送的HTTP请求包括请求行、请求头和请求体。请求行包括请求方法、请求路径和HTTP协议版本。
可以使用strtok()函数解析请求行,获取请求方法和请求路径。
```c
char* method = strtok(request, " ");
char* path = strtok(NULL, " ");
```
2. 处理静态页面请求
如果请求路径是以“/”开头的,说明客户端请求的是静态页面。可以使用fopen()函数打开请求的文件,并将文件内容读取到一个缓冲区中。
```c
if (path[0] == '/') {
char filename[MAX_PATH];
sprintf(filename, "htdocs%s", path);
FILE* fp = fopen(filename, "rb");
if (fp != NULL) {
// 读取文件内容到缓冲区
} else {
// 文件不存在,返回404错误页面
}
}
```
3. 发送HTTP响应
根据请求结果,可以发送不同的HTTP响应给客户端。HTTP响应包括状态行、响应头和响应体。
可以使用sprintf()函数构造HTTP响应头和响应体,并使用send()函数发送HTTP响应给客户端。
```c
sprintf(response, "HTTP/1.1 %d %s\r\n", status, status_msg);
sprintf(response + strlen(response), "Content-Type: %s\r\n", content_type);
sprintf(response + strlen(response), "Content-Length: %d\r\n", content_length);
sprintf(response + strlen(response), "Connection: close\r\n");
sprintf(response + strlen(response), "\r\n");
send(client_sockfd, response, strlen(response), 0);
send(client_sockfd, content, content_length, 0);
```
4. 错误处理
如果请求的文件不存在,可以返回一个404错误页面给客户端。
```c
const char* not_found_msg = "<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";
sprintf(response, "HTTP/1.1 404 Not Found\r\n");
sprintf(response + strlen(response), "Content-Type: text/html\r\n");
sprintf(response + strlen(response), "Content-Length: %d\r\n", strlen(not_found_msg));
sprintf(response + strlen(response), "Connection: close\r\n");
sprintf(response + strlen(response), "\r\n");
send(client_sockfd, response, strlen(response), 0);
send(client_sockfd, not_found_msg, strlen(not_found_msg), 0);
```
这样就可以实现简单的HTTP服务器,支持静态页面访问和错误处理。
阅读全文