Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
###############################################################
#*【项目】CA
#*【描述】
#*【作者】hongchunhua
#*【时间】2020.07.22
###############################################################

cmake_minimum_required(VERSION 2.8)
project(arpc)

set(COM_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}")

#设置依赖的文件路径
set(ARPC_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}")

#开源
set(ARPC_OPENSRC_PATH "${ARPC_ROOT_PATH}/open_src")

set(ARPC_DEMO_PATH "${ARPC_ROOT_PATH}/demo")

include("${COM_ROOT_PATH}/common.cmake")

#设定源码
set(XIO_INCLUDE ${OPENSRC_PATH}/xio/include)
set(SRC_COMMON ${COM_SRC_PATH}/common)
set(SRC_SESSION ${COM_SRC_PATH}/session)
set(ARPC_INCLUDE ${COM_ROOT_PATH}/inc)

set(SOURCE_FILES "")
aux_source_directory(${SRC_COMMON} SOURCE_FILES)
aux_source_directory(${SRC_SESSION} SOURCE_FILES)


#设定头文件路径
include_directories(${ARPC_INCLUDE} ${XIO_INCLUDE} ${SRC_COMMON} ${SRC_SESSION})


#设定链接库的路径(一般使用第三方非系统目录下的库)
set(LINK_LIB_PATH ${DPENDENCY_LIB_PATH})
LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH} ${LINK_LIB_PATH})


#添加依赖项子目录

#动态库
add_library(arpc SHARED ${SOURCE_FILES})
#链接静态库
target_link_libraries(arpc
"-Wl,--whole-archive" #之后的库使用--whole-archive选项
xio
"-Wl,--no-whole-archive") #之后的库不使用--whole-archive选项

INSTALL(TARGETS arpc LIBRARY DESTINATION ${LINK_LIB_PATH})
INSTALL(TARGETS arpc LIBRARY DESTINATION /usr/lib)

#子项目
add_subdirectory("${ARPC_OPENSRC_PATH}/xio/")
add_subdirectory("${ARPC_DEMO_PATH}/client_file_send")
add_subdirectory("${ARPC_DEMO_PATH}/server_file_rev")
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
# build
*【说明】编译工程采用cmake编译

* for linux (ubuntu)
* apt-get install cmake

1. cd code root;
2. mkdir build
3. cd build
4. cmake ../ (default:debug mode)
5. make -j
6. make install

---
# file tree
* demo(demo测试应用)

* open_src (开源代码xio)

* src (arpc 源码)

* inc (arpc 函数头)

#说明
生成库文件libarpc.so
67 changes: 67 additions & 0 deletions common.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
###############################################################
#*【项目】CA
#*【描述】
#*【作者】hongchunhua
#*【时间】2020.07.22
###############################################################

#依赖库
set(DPENDENCY_LIB_PATH "${COM_ROOT_PATH}/lib/")
#开源
set(OPENSRC_PATH "${COM_ROOT_PATH}/open_src")

#APP 应用目录
set(COM_APP_PATH "${COM_ROOT_PATH}/demo")
#源码目录
set(COM_SRC_PATH "${COM_ROOT_PATH}/src")

#设定编译参数
if (DEFINED CLANG)
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
else()
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
set(CMAKE_C_FLAGS_DEBUG "$ENV{CFLAGS} -O0 -Wall -g -ggdb3 -Werror -Wdeclaration-after-statement")
set(CMAKE_C_FLAGS_RELEASE "$ENV{CFLAGS} -O3 -Wall")

if (CMAKE_BUILD_TYPE STREQUAL Release)
message("NOTE: project to build on [Release] version.")
set(CMAKE_BUILD_TYPE "Release")
set(DEBUG_FLAG ${CMAKE_C_FLAGS_RELEASE})
else()
message("WARNING: project to build on [Debug] version.")
set(CMAKE_BUILD_TYPE "Debug")
set(DEBUG_FLAG ${CMAKE_C_FLAGS_DEBUG})
endif()
SET(CA_WARNINGS_SETTING "-Wno-missing-field-initializers -Wno-deprecated -fno-omit-frame-pointer -Wno-unused-parameter -Wno-deprecated-declarations -Wno-unused-function -Wno-unused-variable")
SET(C_CPP_FLAGS_ "${C_CPP_FLAGS_} -DPIC -fPIC ${DEBUG_FLAG} -D_GNU_SOURCE -DUSE_COMMON_LIB ${OS_FLAG} ${CA_WARNINGS_SETTING}")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_CPP_FLAGS_}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_CPP_FLAGS_}")
endif()

#设置输出路径
SET(EXECUTABLE_OUTPUT_PATH ${COM_ROOT_PATH}/${CMAKE_BUILD_TYPE}_build_out/bin) #设置可执行文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${COM_ROOT_PATH}/${CMAKE_BUILD_TYPE}_build_out/lib) #设置库文件的输出目录

message("--cur path: ${CMAKE_CURRENT_SOURCE_DIR}")
message("--project : ${PROJECT_NAME}")
message("--out path: ${COM_ROOT_PATH}/${CMAKE_BUILD_TYPE}_build_out.")
16 changes: 16 additions & 0 deletions demo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
# client demo
*【说明】客户端session实现用例,简单消息通信

# server demo
*【说明】服务端session实现用例,简单消息通信
---

# client_file_send
*【说明】客户端session实现 文件发送
---

# server_file_rev
*【说明】服务端session实现 文件接收
---

32 changes: 32 additions & 0 deletions demo/client_file_send/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cmake_minimum_required(VERSION 2.8)
project(client_file)

include("${COM_ROOT_PATH}/common.cmake")

#设定源码
set(ARPC_INCLUDE ${COM_ROOT_PATH}/inc)
set(SRC_COMMON ${COM_SRC_PATH}/common)
set(SRC_SESSION ${COM_SRC_PATH}/session)

set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/main.c)
aux_source_directory(${SRC_COMMON} SOURCE_FILES)
aux_source_directory(${SRC_SESSION} SOURCE_FILES)


#设定头文件路径
include_directories(${ARPC_INCLUDE} ${SRC_COMMON} ${SRC_SESSION})


#设定链接库的路径(一般使用第三方非系统目录下的库)
set(LINK_LIB_PATH ${DPENDENCY_LIB_PATH})
LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH} ${LINK_LIB_PATH})


#添加依赖项子目录

#生成可执行文件
add_executable(client_file ${SOURCE_FILES})

target_link_libraries(client_file -larpc -lnuma -ldl -lrt -lpthread)
add_dependencies(client_file aprc)

132 changes: 132 additions & 0 deletions demo/client_file_send/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
/*
* Copyright(C) 2020 Ruijie Network. All rights reserved.
*/

/*!
* \file xxx.x
* \brief xxx
*
* 包含..
*
* \copyright 2020 Ruijie Network. All rights reserved.
* \author [email protected]
* \version v1.0.0
* \date 2020.08.05
* \note none
*/
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <mcheck.h>

#include "arpc_api.h"

#define BUF_MAX_SIZE 1024
/*---------------------------------------------------------------------------*/
/* main */
/*---------------------------------------------------------------------------*/
int main(int argc, char *argv[])
{
uint32_t i = 0;
int ret = 0;
uint64_t offset = 0,send_len = 0, file_len =0;

struct arpc_client_session_param param;
struct arpc_msg *requst =NULL;
arpc_session_handle_t session_fd;
struct arpc_msg_param p;
char *file_path = NULL;
FILE *fp = NULL;

if (argc < 4) {
printf("Usage: %s <host> <port> <file path>\
<finite run:optional>\n", argv[0]);
return 0;
}
printf("input:<%s> <%s> <%s> <%s>\n", argv[1], argv[2], argv[3], argv[4]);
file_path = argv[3];
fp = fopen(file_path, "rb");
if(!fp) {
printf("can not open this file[%s],or not exist!\n", file_path);
return 0;
}
fseek(fp, 0, SEEK_END);
file_len = ftell(fp);
rewind(fp);
printf("-----file_size:%lu\n", file_len);
arpc_init();
// 创建session
param.con.type = ARPC_E_TRANS_TCP;
memcpy(param.con.ipv4.ip, argv[1], IPV4_MAX_LEN);
param.con.ipv4.port = atoi(argv[2]);
param.req_data = argv[4];
param.req_data_len = strlen(argv[4]);
session_fd = arpc_client_create_session(&param);
if (!session_fd){
printf("arpc_client_create_session fail\n");
goto end;
}

// 新建消息
requst = arpc_new_msg(NULL);
while(offset < file_len){
send_len = ((file_len - offset) > DATA_DEFAULT_MAX_LEN)? DATA_DEFAULT_MAX_LEN: (file_len - offset);
printf("_____send_len:%lu, left_size:%lu____________\n", send_len, (file_len - offset));
requst->send.head_len = strlen(file_path);
requst->send.head = file_path;
requst->send.total_data = send_len;
requst->send.vec_num = (requst->send.total_data / IOV_DEFAULT_MAX_LEN) + 1;
requst->proc_rsp_cb = NULL;

// 读取文件
requst->send.vec = malloc(requst->send.vec_num * sizeof(struct arpc_iov));
for (i = 0; i < requst->send.vec_num -1; i++) {
fseek(fp, i*IOV_DEFAULT_MAX_LEN + offset, SEEK_SET);
requst->send.vec[i].data = malloc(IOV_DEFAULT_MAX_LEN);
requst->send.vec[i].len = fread(requst->send.vec[i].data, 1, IOV_DEFAULT_MAX_LEN, fp);
if (requst->send.vec[i].len < IOV_DEFAULT_MAX_LEN){
if(feof(fp)){
break;
}
}
}
fseek(fp, i*IOV_DEFAULT_MAX_LEN + offset, SEEK_SET);
offset += send_len;
send_len = send_len % IOV_DEFAULT_MAX_LEN;
requst->send.vec[i].data = malloc(send_len);
requst->send.vec[i].len = fread(requst->send.vec[i].data, 1, send_len, fp);
if (requst->send.vec[i].len < send_len){
printf("fread len fail\n");
}
//ret = arpc_do_request(session_fd, requst, -1);
ret = arpc_send_oneway_msg(session_fd, requst);
//usleep(500*1000);
if (ret != 0){
printf("arpc_do_request fail\n");
}

// 释放资源
for (i = 0; i < requst->send.vec_num; i++) {
if (requst->send.vec[i].data)
free(requst->send.vec[i].data);
}
free(requst->send.vec);
requst->send.vec = NULL;
arpc_msg_reset(requst);
}
arpc_delete_msg(&requst);
arpc_client_destroy_session(session_fd);
printf("file send complete:%s.\n", file_path);
end:
if (fp)
fclose(fp);
fp =NULL;
arpc_finish();
return 0;
}

30 changes: 30 additions & 0 deletions demo/server_file_rev/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 2.8)
project(server_file)

include("${COM_ROOT_PATH}/common.cmake")

#设定源码
set(ARPC_INCLUDE ${COM_ROOT_PATH}/inc)
set(SRC_COMMON ${COM_SRC_PATH}/common)
set(SRC_SESSION ${COM_SRC_PATH}/session)

set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/main.c)
aux_source_directory(${SRC_COMMON} SOURCE_FILES)
aux_source_directory(${SRC_SESSION} SOURCE_FILES)


#设定头文件路径
include_directories(${ARPC_INCLUDE} ${SRC_COMMON} ${SRC_SESSION})


#设定链接库的路径(一般使用第三方非系统目录下的库)
set(LINK_LIB_PATH ${DPENDENCY_LIB_PATH})
LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH} ${LINK_LIB_PATH})


#添加依赖项子目录

#生成可执行文件
add_executable(server_file ${SOURCE_FILES})
target_link_libraries(server_file -larpc -lnuma -ldl -lrt -lpthread)
add_dependencies(server_file arpc)
Loading