说明
- 在项目中采用goahead作为Http服务器,为远程客户端提供访问接口和资源(网页,图片等),往往需要自定义很多接口和处理。
- 自定义接口,简单点可以使用CGI协议(大部分公司采用的),但是由于CGI程序的性能问题以及CGI程序与主程序进程通信的不便,我们需要其它方式,例如:内存CGI,嵌入到主进程等。
- 如何将goahead导入项目? 与主程序配合工作有多种方式,如下:
goahead扩展性
- 设计初,goahead就充分考虑了扩展性和可嵌入性,内存CGI等机制就体现了这一点,查看编译脚本可发现核心源码最终编译成了一个库(libgo.so),主程序goahead也是链接的该库实现的。
扩展
- 我们采用内存CGI机制实现自定义接口并链接libgo.so库将goahead嵌入到自己的程序。
- goahead是C语言编写的,使用C++使用其接口也不会报错。
单独的程序
- 将goahead源码编译成单独的程序,与主程序通过进程通信机制协调工作,是一种比较简便的方式。
- 在goahead源码上进行扩展,有两种方法:
- 链接libgo,自己实现主程序
- goahead源码中test目录下的test.c是一个示例,但是默认未编译,需要仿照编译脚本中其它编译代码在编译脚本中加上如下代码:
TARGETS += $(BUILD)/bin/test
#
# test.o
# 47
DEPS_47 += $(BUILD)/inc/goahead.h
DEPS_47 += $(BUILD)/inc/js.h
$(BUILD)/obj/test.o: \
test/test.c $(DEPS_47)
@echo ' [Compile] $(BUILD)/obj/test.o'
$(CC) -c -o $(BUILD)/obj/test.o $(CFLAGS) $(DFLAGS) -D_FILE_OFFSET_BITS=64 -D_FILE_OFFSET_BITS=64 -DMBEDTLS_USER_CONFIG_FILE=\"embedtls.h\" -DME_COM_OPENSSL_PATH=$(ME_COM_OPENSSL_PATH) $(IFLAGS) "-I$(ME_COM_OPENSSL_PATH)/include" test/test.c
#
# test
# 48
DEPS_48 += $(BUILD)/bin/libgo.so
DEPS_48 += $(BUILD)/.install-certs-modified
DEPS_48 += $(BUILD)/obj/test.o
ifeq ($(ME_COM_MBEDTLS),1)
LIBS_48 += -lmbedtls
endif
ifeq ($(ME_COM_MBEDTLS),1)
LIBS_48 += -lgoahead-mbedtls
endif
ifeq ($(ME_COM_MBEDTLS),1)
LIBS_48 += -lmbedtls
endif
ifeq ($(ME_COM_OPENSSL),1)
LIBS_48 += -lgoahead-openssl
endif
ifeq ($(ME_COM_OPENSSL),1)
ifeq ($(ME_COM_SSL),1)
LIBS_48 += -lssl
LIBPATHS_48 += -L"$(ME_COM_OPENSSL_PATH)"
endif
endif
ifeq ($(ME_COM_OPENSSL),1)
LIBS_48 += -lcrypto
LIBPATHS_48 += -L"$(ME_COM_OPENSSL_PATH)"
endif
LIBS_48 += -lgo
ifeq ($(ME_COM_OPENSSL),1)
LIBS_48 += -lgoahead-openssl
endif
ifeq ($(ME_COM_MBEDTLS),1)
LIBS_48 += -lgoahead-mbedtls
endif
$(BUILD)/bin/test: $(DEPS_48)
@echo ' [Link] $(BUILD)/bin/test'
$(CXX) -std=c++11 -o $(BUILD)/bin/test $(LDFLAGS) $(LIBPATHS) "$(BUILD)/obj/test.o" $(LIBPATHS_48) $(LIBS_48) $(LIBS_48) $(LIBS) $(LIBS)
- 仿照test.c中的代码以及编译命令即可轻松实现独立的自定义服务器程序。
- 直接修改goahead.c
- 默认编译的主程序goahead,实际上也是链接libgo,其源码文件为goahead.c,查看其实现可以发现和上面的test.c差别不大,因此可以直接修改goahead.c 来自定义程序。
嵌入到主程序
- 考虑到进程通信的麻烦,以及单独进程代码不能复用,性能低点,想对goahead源码做较大调整,我们也可以将goahead嵌入到主程序中。
- 实现:在主程序中,模仿示例代码(test.c), 链接和调用libgo中接口。
- 代码;熟系test.c代码后,我们可以将goahead的初始化代码和处理循环放到单独的线程中。
- 编译;goahead编译的目标文件libgo.so和头文件都在build目录下,使用时记得链接和引入,几乎不会出什么问题。