c,#include,#include,#include,#include,#include,,#define PORT 8080,#define BUFFER_SIZE 1024,,int main() {, int server_fd, new_socket;, struct sockaddr_in address;, int addrlen = sizeof(address);, char buffer[BUFFER_SIZE] = {0};, const char *hello = "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 12,Hello world!";,, if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {, perror("socket failed");, exit(EXIT_FAILURE);, },, address.sin_family = AF_INET;, address.sin_addr.s_addr = INADDR_ANY;, address.sin_port = htons(PORT);,, if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))< 0) {, perror("bind failed");, close(server_fd);, exit(EXIT_FAILURE);, },, if (listen(server_fd, 3)< 0) {, perror("listen failed");, close(server_fd);, exit(EXIT_FAILURE);, },, printf("Server listening on port %d\n", PORT);,, while (1) {, if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))< 0) {, perror("accept failed");, close(server_fd);, exit(EXIT_FAILURE);, },, read(new_socket, buffer, BUFFER_SIZE);, printf("Received request:\n%s\n", buffer);, send(new_socket, hello, strlen(hello), 0);, printf("Hello message sent\n");, close(new_socket);, },, return 0;,},
``,,这个示例代码创建了一个监听在8080端口的简单HTTP服务器,当接收到请求时,返回一个固定的"Hello world!"响应。编写一个简单的HTTP服务器可以帮助你理解网络编程的基本概念,下面是一个使用C语言编写的简单HTTP服务器示例。
引入必要的头文件
我们需要引入一些必要的头文件,这些文件提供了网络编程和字符串处理等功能。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h>
定义服务器端口和缓冲区大小
我们定义服务器监听的端口号以及用于存储请求和响应的缓冲区大小。
#define PORT 8080 #define BUFFER_SIZE 1024
主函数
在主函数中,我们创建套接字、绑定地址并开始监听客户端连接。
int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; const char *hello = "HTTP/1.1 200 OK\r Content-Type: text/plain\r Content-Length: 12\r \r Hello World"; // 创建套接字文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置套接字选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); close(server_fd); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定套接字到地址 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); close(server_fd); exit(EXIT_FAILURE); } // 开始监听连接 if (listen(server_fd, 3) < 0) { perror("listen"); close(server_fd); exit(EXIT_FAILURE); } printf("Server is listening on port %d... ", PORT); while (1) { // 接受客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); close(server_fd); exit(EXIT_FAILURE); } // 读取客户端请求 read(new_socket, buffer, BUFFER_SIZE); printf("Received request: %s ", buffer); // 发送响应给客户端 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent "); // 关闭客户端连接 close(new_socket); } return 0; }
编译和运行
保存上述代码到一个文件中,例如http_server.c
,然后使用以下命令进行编译和运行:
gcc -o http_server http_server.c ./http_server
服务器将在端口8080上监听客户端请求,并在浏览器中访问http://localhost:8080
时显示“Hello World”。
相关问题与解答
问题1:如何修改服务器响应的内容?
答:可以通过修改变量hello
的值来更改服务器响应的内容,将hello
改为`"HTTP/1.1 200 OK\r
Content-Type: text/html\r
Content-Length: 27\r
\r
<html><body>Hello World</body></html>"`,即可返回一个HTML页面。
问题2:如何处理多个客户端连接?
答:当前示例中的服务器是单线程的,只能处理一个客户端连接,为了处理多个客户端连接,可以使用多线程或异步I/O技术,可以使用fork()
或pthread_create()
在每次接受新连接时创建一个新线程来处理该连接。
小伙伴们,上文介绍了“c编写http服务器”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。