目录

  • 0 概述
    • 0.0 参考
    • 0.1 HTTP 服务
    • 0.2 JSON RPC HTTP错误码
    • 0.3 目录结构
  • 1 使用
    • 1.1 接口访问示例
    • 1.2 方法注册
    • 1.3 修改监听端口
  • 4 源码获取

0 概述

0.0 参考

GitHub - hmng/jsonrpc-c: JSON-RPC in C (server only for now)

GitHub - cesanta/mongoose: Embedded Web Server

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

0.1 HTTP 服务

HTTP-JRPC-C 内置了HTTP服务用于提供JRPC API服务和静态文件服务。纯C语言编写。在最开始我是使用的hmng/jsonrpc-c 但是由于该服务只能提供TCP连接,不太适用于我的应用场景,因此结合mongoos库对其进行了重构。

0.2 JSON RPC HTTP错误码

错误码 sys-error 描述
000 正常
101 未找到指定的方法
102 格式错误
103 请求方法错误

0.3 目录结构

一级 二级 三级 四级 文件说明
build 编译输出目录
bin 编译输出目录,也是运行目录
lib
web JRPC-HTTP会默认穷举该目录下的文件作为服务器静态文件
index.html 静态服务器默认界面,可在运行JRPC-HTTP后尝试访问http://xxx.xxx.xxx.xxx:8000
JRPC-HTTP 编译后得到的可执行文件,在Ubuntu 16下使用GCC编译。
CommLib
inc
cJSON.h cJSON.h头文件
comm.h 常用函数,如delay_ms延时函数
src
cJSON.c cJSON.h源文件
comm.c 常用函数,如delay_ms延时函数
JRPC
inc
jsonrpc-c.h jsonrpc头文件
mongoose.h mongoose头文件
src
jsonrpc-c.c jsonrpc源文件
mongoose.c mongoose源文件

1 使用

1.1 接口访问示例

方法原型 main.c:30

cJSON * add(jrpc_context * ctx, cJSON * params, cJSON *id) {cJSON * a = cJSON_GetArrayItem(params,0);cJSON * b = cJSON_GetArrayItem(params,1);return cJSON_CreateNumber(a->valueint + b->valueint);
}

POST方法,路径:http://xxx.xxx.xxx.xxx:8000

使用POSTMAN测试如下:

1.2 方法注册

在main()中创建了一个HTTP线程,线程的一开始会对JRPC进行初始化。在初始化完成后可以在任何时候调用jrpc_register_procedure()注册方法。

//线程句柄
pthread_t HTTP_main_thread_tid;//RPC 方法
cJSON * say_hello(jrpc_context * ctx, cJSON * params, cJSON *id) {return cJSON_CreateString("Hello!");
}cJSON * add(jrpc_context * ctx, cJSON * params, cJSON *id) {cJSON * a = cJSON_GetArrayItem(params,0);cJSON * b = cJSON_GetArrayItem(params,1);return cJSON_CreateNumber(a->valueint + b->valueint);
}extern struct jrpc_server my_server;
void main(int argc, char *argv[])
{int ret;//获取运行路径ProgramRootPath = malloc(strlen(argv[0]));memset(ProgramRootPath,0x00,strlen(argv[0]));memcpy(ProgramRootPath,argv[0],strlen(argv[0])-17);    printf("PATH : %s",ProgramRootPath);//创建HTTP线程ret = pthread_create(&HTTP_main_thread_tid,NULL,HTTP_MainThread,NULL);jrpc_register_procedure(&my_server, say_hello, "sayHello", NULL );jrpc_register_procedure(&my_server, add, "add", NULL );while (1){delay_ms(2000);}}

1.3 修改监听端口

程序默认监听的端口号为8000,可在/JRPC/src/jsonrpc-c.c中修改为你所需要的端口。

void *HTTP_MainThread(void *arg)
{struct mg_mgr mgr;mg_mgr_init(&mgr);printf("Server listen on port 8000\r\n");//监听地址与端口设置mg_http_listen(&mgr, "0.0.0.0:8000", fn, NULL);     // Create listening connectionwhile (1){mg_mgr_poll(&mgr, 100);                        // Block forever}
}

4 源码获取

gitee获取源码

C语言编写的简单HTTP json RPC相关推荐

  1. c语言游戏总出bug,C语言 编写的简单移动游戏出现bug?_编程_游戏设计_C语言_天涯问答_天涯社区...

    C语言 编写的简单移动游戏出现bug? 第一次按上下左右没什么问题,之后就会卡住..不知道出了什么错 源码如下:(用vc++的win32 console程序编写) #include #include ...

  2. c语言编写一个简单的答题系统

    利用c语言编写一个简单的答题系统. 思路是先设计好题目和答案,再输入自己的答案,利用输入的答案与正确答案对比,从而得出你回答的对错. (一)捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案. ...

  3. C语言编写一个简单的扫雷

    C语言编写一个简单的扫雷 # include <stdio.h> # include <stdlib.h> # include <math.h> # include ...

  4. 用GO语言编写一个简单的区块链

    区块链的大致概念. 按照个人理解来说,区块,就是保存一个一个数据的模块,然后区块链,是每个区块相连的链表那种,同时区块链实现之所以公平,是采用加密,且不可倒置等的机制,也就是,数据只要成功加载到区块链 ...

  5. 用 C 语言编写一个简单的垃圾回收器

    人们似乎认为编写垃圾回收机制是很难的,是一种只有少数智者和Hans Boehm(et al)才能理解的高深魔法.我认为编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc样例难 ...

  6. python语言的记事本在哪_用python语言编写一个简单记事本

    看了一点python的基础教程,忍不住手就痒了,找来一个题目练一下喽. 题目:编写一个功能简单的记事本. 编写记事本就要用到GUI的功能,最常用的当然是wxpython,那么我们就用这个来写一个记事本 ...

  7. 用C语言编写一个“简单”的程序答题系统

    上个星期我们老师给我们布置一道他认为很简单的题,其实就想考考我们,要我们写一个简单的答题系统.开始一看只有一道题我直呼:"仰天大笑出门去,我辈岂是蓬蒿人" 以为老师放我一马,结果点 ...

  8. 梯形图调用c语言编写程序,简单使用C语言写梯形图精简V2.0.pdf

    简单使用C语言写梯形图精简V2.0 C语言实现梯形图写法 1: AND 2: LDI 3: ANDB 4: ANDP 5: ORB 6: C1 7: T0 8: MPS1 9: LDF 10-1: M ...

  9. C语言编写的简单计算器程序

    这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理. 在该计算器程序,能进行加减乘除.sin.co ...

最新文章

  1. SQLite简易入门
  2. Linux下对网络进行配置nmcli、nmtui
  3. 创建型模式二:工厂方法模式
  4. 解决:如何在Android Studio中找出自己项目文件的所在位置
  5. python特征工程插件_python特征工程
  6. centos7限制普通用户访问单一目录下的单一文件
  7. C# DataTable的Distinct解决方案及表的复制
  8. 好气!等一年,这个iCloud 账户漏洞竟只值$1.8万?!说好的$35万呢???
  9. oracle聚合函数rank()的用法和一些体会
  10. bzoj 1057: 棋盘制作(悬线法)
  11. 3.9上午(周彤彤)
  12. “产品助理最重要的工作是 Android 版本的设计与测试”
  13. 开发问题小便签(1)
  14. PHP之Seay工具的安装与使用
  15. manjaro设置字体_Manjaro安装配置美化字体模糊发虚解决记录
  16. 常见消息中间件大 PK
  17. 手动以及使用torch.nn实现前馈神经网络实验
  18. 两电脑间传输文件|免费PC到PC文件传输软件
  19. 日本行,一些随笔和照片
  20. Fiddler简单的使用教程

热门文章

  1. 乐檬k5note android6.0,乐檬K5 NOTE有全网通版本吗? 乐檬K5 NOTE全网通版什么时候上市...
  2. php禁止直接访问源码,php禁止直接从浏览器输入地址访问.PHP文件-PHP源码
  3. Java面试系列之并发编程专题-Java线程池灵魂拷问
  4. 验证码接收平台的运行原理
  5. excel打不开_Excel文件损坏打不开?用这个方法就能轻松修复!
  6. 沈阳航空航天大学计算机考研真题文件模板
  7. Metrics监控工具介绍与使用
  8. BO,PO,VO,DTO的区别
  9. 旅游指南之十五----拉萨餐饮
  10. CSS_02_背景_文本_字体_链接_列表_表格