ubuntu http 服务器响应

news/2024/7/2 23:03:34

代码:

h文件

#include <iostream>
#include <curl/curl.h>

#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <string.h>

#include <event.h>
#include <event2/http.h>
#include <event2/http_struct.h>
#include <event2/http_compat.h>
#include <event2/util.h>

#include <jsoncpp/json/json.h>

#define ETH_NAME "eth0"
#define MYHTTPD_SIGNATURE   "MoCarHttpd v0.1"

using namespace std;

class RouteTasks{
public:
    RouteTasks();

    void init();

private:
    static void routeTasks(struct evhttp_request *req, void *arg);

    string getIp();

    int m_port;
    int m_timeout;
};

cpp文件

#include "platfromcommunication.h"

RouteTasks::RouteTasks()
{
    m_port = 7777;
    m_timeout = 120;
}

void RouteTasks::init()
{
    //初始化event API
    event_init();

    //创建一个http server
    struct evhttp *httpd;

    httpd = evhttp_start(getIp().c_str(), m_port);

    evhttp_set_timeout(httpd, m_timeout);

    //也可以为特定的URI指定callback
    evhttp_set_cb(httpd, "/wayLine/start", &RouteTasks::routeTasks, NULL);

    //循环处理events
    event_dispatch();

    evhttp_free(httpd);
}

void RouteTasks::routeTasks(evhttp_request *req, void *arg)
{
    char request_data[4096] = {0};

    //获取POST方法的数据
    size_t post_size = EVBUFFER_LENGTH(req->input_buffer);
    char *post_data = (char *) EVBUFFER_DATA(req->input_buffer);
    memcpy(request_data, post_data, post_size);
    printf("got startRouteTasks connection post_data = [%s], len =%ld\n", post_data, post_size);

    //解析获得的数据
    string task_code;
    string stream;

    Json::Value jvalue;
    Json::Reader jreader;
    jreader.parse(request_data, jvalue);
    task_code = jvalue["task_code"].asString();
    stream = jvalue["stream"].asString();
    cout<<"task_code: "<<task_code<<" stream: "<<stream<<"\n-------------------------"<<endl;

    //给前段回复一个响应结果
    Json::Value root;
    Json::FastWriter fastWriter;
    root["code"] = Json::Value("0");
    root["msg"] = Json::Value("成功");
    cout<<"return post"<<fastWriter.write(root)<<endl;

    /* 输出到客户端 */

    //HTTP header
    evhttp_add_header(req->output_headers, "Server", MYHTTPD_SIGNATURE);
    evhttp_add_header(req->output_headers, "Content-Type", "application/json; charset=UTF-8");
    evhttp_add_header(req->output_headers, "Connection", "close");

    //输出的内容
    struct evbuffer *buf;
    buf = evbuffer_new();
    evbuffer_add_printf(buf, "%s", fastWriter.write(root).c_str());

    //将封装好的evbuffer 发送给客户端
    evhttp_send_reply(req, HTTP_OK, "OK", buf);

    evbuffer_free(buf);

}

string RouteTasks::getIp()
{
    struct sockaddr_in sin;
    struct ifreq ifr;

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd == -1) {
        perror("socket error");
        return "";
    }

    strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);

    if(ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {
        memcpy(&sin, &ifr.ifr_addr, sizeof (ifr.ifr_addr));
        cout<<ETH_NAME<<" ip : "<<inet_ntoa(sin.sin_addr)<<endl;
        return inet_ntoa(sin.sin_addr);
    }

    return "";
}

 main文件

#include <iostream>
#include <signal.h>
#include <jsoncpp/json/json.h>
#include <event.h>
#include <unistd.h>

#include "...h"

using namespace std;

//当向进程发出SIGTERM/SIGHUP/SIGINT/SIGQUIT的时候,终止event的事件侦听循环
void signal_handler(int sig) {
    switch (sig) {
        case SIGTERM:
        case SIGHUP:
        case SIGQUIT:
        case SIGINT:
            event_loopbreak();  //终止侦听event_dispatch()的事件侦听循环,执行之后的代码
            break;
    }
}

int main()
{
    cout << "Hello World!" << endl;

    signal(SIGHUP, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);
    signal(SIGQUIT, signal_handler);


    RouteTasks rt;

    rt.init();

    while (1) {
        sleep(1);
    }

    return 0;
}

http post与get请求:c++ curl post和get请求返回数据解析_c++解析curl返回的json_小鱼仙官的博客-CSDN博客


http://lihuaxi.xjx100.cn/news/1572926.html

相关文章

Mybatis连接DB2数据库时,FETCH FIRST {n} ROWS ONLY不能参数化解决

Mybatis连接DB2数据为时 ......WHERE ROW_NUM_HAHA > #{start,jdbcTypeNUMERIC} FETCH FIRST #{pageSize,jbdcTypeNUMERIC} ROWS ONLY...... 如果像上面这样写是不行的。查过资料后&#xff0c;才发现FETCH FIRST后面的值是不能参数化的&#xff0c;只能写死。而Mybatis中…

在简历上写期望薪资,有错吗?

最近流行这么一个问题&#xff0c;在简历上应不应该写期望薪资&#xff1f;针对这个问题&#xff0c;胖圆来给大家分析一下~ 首先在简历上写明自己的期望薪资并没有错。但要考虑到你的工作市场和行业的期望薪资范围。期望薪资是一个重要的因素&#xff0c;因为它可以反映你的经…

Windows10通过VirtualBox部署Centos7虚拟机

前提准备 安装好VirtualBox准备好centos7镜像 创建网卡 打开VirtualBox&#xff0c;点击工具&#xff0c;选择网络。 在 Host-Only Networks 页面点击 创建&#xff0c;等待创建完成后&#xff0c;下方的 Adapter 选择 自动配置网卡&#xff0c;如下图&#xff1a; DHCP服务…

MySQL索引是什么

1、索引是什么 1、MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构 索引的本质&#xff1a;数据结构。 索引的目的在于提高查询效率&#xff0c;可以类比字典或者一本书的目录&#xff0c;如果要查“mysql”这个单词…

SpringBoot集成easypoi实现execl导出

<!--easypoi依赖&#xff0c;excel导入导出--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>通过Exce注解设置标头名字和单…

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…

基础练习 查找整数

问题描述 给出一个包含n个整数的数列&#xff0c;问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数&#xff0c;为给定的数列&#xff0c;数列中的每个数都不大于10000。 第三行包含一个整数a&#xff0c;为待查找的数。 输…

python LeetCode 刷题记录 100

题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(se…