C语言JSON-RPC
{
"result": "Hello!"
}
vonzhou@de15:~$ echo "{\"method\":\"exit\"}" | nc localhost 1234
{
"result": "Bye!"
}
the port users will be connecting to
ctx, cJSON * params, cJSON *id) {
ctx, cJSON * params, cJSON *id) {
{
NULL );
NULL );
(* jrpc_function )(jrpc_context *context, cJSON *params, cJSON*
id);
//方法名
//方法地址
//额外信息
* loop; //eventloop类型
//
* procedures ;
*server, int port_number);
*server,
*loop);
*server);
*server);
*server);
*server);
*procedure);
*server,
*server, char *name);
*sa) {
{
sa)->sin_addr );
sa)->sin6_addr);
* conn, char *response) {
= conn-> fd;
1)
Response:\n%s\n" , response);
response, strlen (response));
1);
* conn, int code, char *
message,
= 0;
code);
message);
error_root);
id);
str_result = cJSON_Print(result_root);
* conn, cJSON * result,
= 0;
result);
id);
str_result = cJSON_Print(result_root);
*server,
* conn, char *name, cJSON *params, cJSON *id)
{
= 0;
0;
NULL;
= server-> procedure_count ;
{
name)) {
server-> procedures [i].data ;
params, id);
not found." ), id);
ctx.error_code , ctx.error_message ,
id);
returned, id);
*server,
* conn, cJSON *root) {
!= NULL && method-> type == cJSON_String ) {
== NULL|| params->type == cJSON_Array
{
== NULL|| id->type == cJSON_String
{
it on the reply and deleting the response Object will also delete ID
!= NULL)
? cJSON_CreateString(
Invoked: %s\n" , method->valuestring);
conn, method->valuestring,
JSON sent is not a valid Request object."), NULL);
*loop, ev_io *w) {
*) w)->fd );
*) w)->buffer );
*) w));
*loop, ev_io *w, int revents)
{
*conn;
*server = ( struct jrpc_server *) w->data;
= 0;
event watcher
*) w;
= conn-> fd;
(conn-> buffer_size - 1)) {
new_buffer = realloc(conn-> buffer,
conn->buffer_size *= 2);
== NULL) {
error" );
w);
new_buffer;
conn-> pos, 0, conn->buffer_size -
conn->pos );
be NULL terminated
= conn-> buffer_size - conn->pos -
1;
= read (fd, conn->buffer +
conn-> pos, max_read_size))
w);
{
connection
closed connection.\n" );
w);
= NULL;
bytes_read;
= cJSON_Parse_Stream(conn->buffer , &end_ptr)) != NULL)
{
1) {
str_result = cJSON_Print(root);
JSON Received:\n%s\n" , str_result);
{
it
end_ptr, strlen (end_ptr) + 2);
conn-> pos, 0,
conn->pos - 1);
If
so, just wait for more.
buffer's end
!= (conn->buffer + conn-> pos))
{
{
JSON Received:\n---\n%s\n---\n",
Invalid JSON was received by the server."),
w);
*loop, ev_io *w, int revents)
{
*connection_watcher;
their_addr; // connector's address information
accept(w-> fd, ( struct sockaddr
*) &their_addr,
-1) {
*) w->data)-> debug_level)
{
*) &their_addr), s, sizeof s);
got connection from %s\n" , s);
connection_cb,
w->data ;
1500;
0, 1500);
0;
has no pointer to struct jrpc_server
*) w->data)-> debug_level;
*server, int port_number) {
port_number, loop);
*server,
*loop) {
0, sizeof (struct jrpc_server));
loop;
port_number;
debug_level_env = getenv ("JRPC_DEBUG" );
== NULL)
0;
NULL, 10);
Debug level %d\n" , server->debug_level );
*server) {
hints, *servinfo, *p;
sockaddr;
= 1;
server->port_number );
0, sizeof hints);
use my IP
= getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
%s\n" , gai_strerror(rv));
= servinfo; p != NULL; p = p-> ai_next) {
= socket(p->ai_family , p->ai_socktype ,
p->ai_protocol ))
socket" );
&yes, sizeof (int ))
p->ai_addr , p->ai_addrlen )
== -1) {
bind" );
( struct sockaddr *) &sockaddr, &len)
== -1) {
ntohs( sockaddr.sin_port );
== NULL) {
failed to bind\n" );
structure
5) == -1) {
waiting for connections...\n" );
accept_cb, sockfd, EV_READ);
server;
&server-> listen_watcher );
ev_loop
ev_unloop
EVUNLOOP_ALL
ev_run
ev_break
*server){
0);
*server) {
*server){
= 0; i < server-> procedure_count ; i++){
);
*procedure){
NULL;
NULL;
*server,
data) {
= server-> procedure_count ++;
* ptr = realloc (server->procedures ,
* server->procedure_count );
ptr;
== NULL)
function_pointer;
data;
*server, char *name) {
= 0;
= 0; i < server->procedure_count ; i++){
= server->procedures [i];
server->procedures [i].name )){
);
* ptr = realloc (server->procedures ,
* server->procedure_count );
ptr;
NULL;
: procedure '%s' not found\n", name);
C语言JSON-RPC的更多相关文章
- Go语言_RPC_Go语言的RPC
一 标准库的RPC RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议.简单的说就是要像调用本地函数 ...
- 測试JSON RPC远程调用(JSONclient)
#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSonclient Auth ...
- go语言json技巧
go语言json技巧 本文总结了在项目中遇到的那些关于go语言JSON数据与结构体之间相互转换的问题及解决办法. 基本的序列化 首先我们来看一下Go语言中json.Marshal()(系列化)与jso ...
- C语言JSON序列化/反序列化
最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...
- archlinux中c语言的rpc编程
参考:http://www.cs.rutgers.edu/~pxk/rutgers/notes/rpc/ 启动rpc服务端会出现 unable to register 这个错误,据说是要启用 port ...
- Java c# 跨语言Json反序列化首字母大小写问题
C#标准是首字母大写,Java规范是首字母小写,在序列化成Json之后,反序列化会出现反序列化失败的问题.. 从C#反序列化成JavaBean的时候通过如下注解可以直接解决该问题 @JsonNamin ...
- Go语言JSON数据相互转换
目录 结构体转json map转json int转json slice转json json反序列化为结构体 json反序列化为map 结构体转json 结构体转json示例: package main ...
- go语言json转map
package util import ( "encoding/json" "fmt" ) // json转map函数,通用 func JSONToMap(st ...
- Go语言json编码驼峰转下划线、下划线转驼峰
目录 一.需求 二.实现 三.使用 JsonSnakeCase统一转下划线json JsonSnakeCase统一转驼峰json 一.需求 golang默认的结构体json转码出来,都是大写驼峰的,并 ...
- Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)
Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...
随机推荐
- Azure VM Public IP设置
Azure虚拟机的Public IP是用于客户端直连云中的虚拟机,可以认为是一个外网IP,一般我们为虚拟机设置终结点,例如HTTP的80端口,如果使用Public IP可以不使用Azure Porta ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- bzoj 2109 & 2535 空中管制 解读
[] [分析]小猪真的是一个很好的问题.我认为这是一个问题洪水.建立拓扑后(便! ).直接把最外层设定序号为1,第二层为2.bfs下去就可以. . . 结果发现:飞行序号不能同样.. . 于是開始想. ...
- 启示—地点IT高管20在职场心脏经(读书笔记6)
启示--一个IT高管20在职场心脏经 第七章 关于销售 用"最"来形容公司的销售.能够用上若干的词汇: 最牛,最累,最精,最傻,最有钱,最贱,最能吹.最能装... 1.1 销售 ...
- 在 Windows Server 2008 R2 上安装 IIS 7.5
原文 在 Windows Server 2008 R2 上安装 IIS 7.5 默认情况下,Windows Server(R) 2008 R2 上不安装 IIS 7.5.可以使用服务器管理器中的“添加 ...
- (大数据工程师学习路径)第二步 Vim编辑器----高级功能入门
一.多文件编辑 1.使用vim编辑多个文件 编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件.另一种就是进入vim后再编辑其他的文件. 同时创建两个新文件并编辑 $ vim 1.tx ...
- 从JAR包中如何读取数据文件
还不是很懂.....待总结......
- Java中间MD5加密算法完整版
携带Java软件开发过程.,因此Java中提供了自带的MessageDigest实现对文本的加密算法,以下是一个对文本进行加密的MD5加密工具类代码演示样例: package net.yuerwan. ...
- 模仿QQ截图片
原文:模仿QQ截图片 两个picturebox,一个放图片 完整代码如下 using System; using System.Collections.Generic; using System.Co ...
- error:stray'\243'in program
error:stray'\243'in program 问题: C原因在编译时出现例如以下错误 error:stray'\243'in program 错误原因: 非 - 标准ascII字 ...