linux C语言 使用curl实现一个http服务器
时间: 2024-12-17 16:34:08 浏览: 18
在Linux环境下使用C语言通过libcurl库创建一个简单的HTTP服务器并不复杂。libcurl是一个强大的工具库,常用于进行URL传输。以下是使用它创建一个基本的命令行HTTP服务器的一个示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
// HTTP响应头
static const char* http_response = "HTTP/1.1 200 OK\n"
"Content-Type: text/html; charset=UTF-8\n"
"\n"
"<h1>Hello, World!</h1>";
void simple_server(int port) {
CURL *curl;
struct addrinfo hints, *res;
// 初始化地址信息结构
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
// 解析端口并初始化服务器
if (getaddrinfo(NULL, std::to_string(port).c_str(), &hints, &res) != 0) {
fprintf(stderr, "Failed to get address info: %s\n", gai_strerror(geterrno()));
return;
}
curl_global_init(CURL_GLOBAL_DEFAULT);
// 创建一个新的cURL会话
curl = curl_easy_init();
if (!curl) {
fprintf(stderr, "Failed to initialize cURL: %s\n", curl_easy_strerror(curl_easy_getinfo(curl, CURLINFO_LASTERROR)));
return;
}
curl_easy_setopt(curl, CURLOPT_PORT, port);
curl_easy_setopt(curl, CURLOPT_LISTEN, -1); // 监听连接
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); // 不需要接收数据
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); // 不读取数据
// 设置回调函数发送静态响应
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *userp) {
int written = strlen(http_response) + size * nmemb;
memcpy(ptr, http_response, written);
return written;
}
curl_easy_setopt(curl, CURLOPT_WRITEDATA, userp);
// 开始监听并处理请求
if (curl_easy_perform(curl)) {
fprintf(stderr, "Error performing server: %s\n", curl_easy_strerror(curl_easy_getinfo(curl, CURLINFO_LASTERROR)));
} else {
printf("Server listening on port %d...\n", port);
}
// 清理资源
curl_easy_cleanup(curl);
freeaddrinfo(res);
curl_global_cleanup();
}
int main(int argc, char** argv) {
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
return 1;
}
simple_server atoi(argv[1]);
return 0;
}
```
这个程序创建了一个简单的HTTP服务器,监听指定的端口,对于每个连接都会返回一个固定的Hello, World! 页面。
运行时,可以像这样使用:
```sh
./your_program_name 8080
```
然后在浏览器中访问`http://localhost:8080`,你会看到页面内容。
阅读全文