以http://localhost:8888/getCheatFlag.do为接口地址,实现http服务端
时间: 2023-08-06 18:04:41 浏览: 237
好的,下面是一个简单实现的示例代码,可以监听8888端口,接收GET请求,并返回一个包含"Hello World!"的HTML页面。
```c++
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
const int SERVER_PORT = 8888;
const int MAX_CONN = 10;
const int BUF_SIZE = 1024;
int main() {
// 创建socket
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定端口
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
if (bind(listen_fd, (sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听客户端请求
if (listen(listen_fd, MAX_CONN) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 处理客户端请求
while (true) {
int conn_fd = accept(listen_fd, NULL, NULL);
if (conn_fd < 0) {
perror("accept");
continue;
}
char buf[BUF_SIZE];
memset(buf, 0, sizeof(buf));
// 接收客户端请求
int n = recv(conn_fd, buf, sizeof(buf), 0);
if (n < 0) {
perror("recv");
close(conn_fd);
continue;
}
// 解析HTTP协议
string request(buf);
// 判断是否为GET请求
if (request.find("GET") == string::npos) {
string response = "HTTP/1.1 405 Method Not Allowed\r\nContent-Type: text/html\r\n\r\n<h1>Method Not Allowed</h1>";
n = send(conn_fd, response.c_str(), response.length(), 0);
if (n < 0) {
perror("send");
close(conn_fd);
continue;
}
}
else {
// 判断请求的具体地址
if (request.find("/getCheatFlag.do") != string::npos) {
string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Cheat Flag: flag{this_is_a_cheat_flag}</h1>";
n = send(conn_fd, response.c_str(), response.length(), 0);
if (n < 0) {
perror("send");
close(conn_fd);
continue;
}
}
else {
string response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n<h1>Not Found</h1>";
n = send(conn_fd, response.c_str(), response.length(), 0);
if (n < 0) {
perror("send");
close(conn_fd);
continue;
}
}
}
// 关闭socket
close(conn_fd);
}
close(listen_fd);
return 0;
}
```
在此示例代码中,我们先创建一个socket并绑定8888端口,然后使用`listen`函数监听客户端请求。接着,我们通过`accept`函数接收客户端请求,并使用`recv`函数接收客户端发送的数据,解析HTTP协议后判断请求的具体地址,然后重新构建HTTP响应报文,使用`send`函数将响应报文发送给客户端。最后,使用`close`函数关闭socket。
阅读全文