acl-dev / acl

C/C++ server and network library, including coroutine,redis client,http/https/websocket,mqtt, mysql/postgresql/sqlite client with C/C++ for Linux, Android, iOS, MacOS, Windows, etc..
https://acl-dev.cn
GNU Lesser General Public License v3.0
2.88k stars 936 forks source link

ssl好难搞啊 #259

Closed alongL closed 2 years ago

alongL commented 2 years ago

已经看了文章 https://blog.csdn.net/zsxxsz/article/details/103945543 但还是没看懂。

1.windows下如何生成mbedtls 的dll,这个好像mbedtls还没有解决 https://github.com/ARMmbed/mbedtls/issues/470 如果使用mbedtls的静态库,如何与acl集成?

2.不知道为什么没有用openssl,感觉openssl的支持更好,文档更丰富,目前已经发布openssl-3.0了,是否有可能改成openssl? 文档里面好像提到有libtls看了一下,也不太像很简单的接口。

3.感觉整个项目的代码有一点点混乱,包罗万象,又支持各个平台,关键库本身还分成了lib_acl lib_fiber lib_fiber_cpp lib_protocal等等,让人眼花缭乱。 是否在将来会统一成一个库,libacl.a,都在一个库里实现多好。

zhengshuxin commented 2 years ago
  1. mbedtls 在 windows 下生成 dll 的问题我解决了,放在:https://github.com/acl-dev/third_party/tree/master/mbedtls-2.7.12/visualc/VC2019 ,所以在使用 acl + mbedtls dll 时,建议使用该版本中的 mbedtls;
  2. 最早用过 openssl,但感觉使用起来太笨重了,而且如果支持移动端包也太大,所以使用了更轻量的 mbedtls,将来有时间会集成一下 openssl;另外在 acl 中的 lib_tls 目前暂时处于停滞状态;
  3. 之所以分成这么多库是有历史原因的,在 acl 早期只有 lib_acl,后来因为增加了 http 协议才有了 lib_protocol,这两个都是纯 C 写的,到后来为了提升开发效率,才有了 C++ 开发的 lib_acl_cpp;至于纯 C 的 lib_fiber,它不依赖于 acl 中的任何其它库,是一个独立的网络协程库,主要是为了方便 hook lib_acl 中的 IO 过程(在Unix下连接程序时,需要把 lib_fiber.a 库放在最后一个便可以 hook 前面库所用的 IO API),lib_fiber_cpp 库依赖于 lib_acl, lib_protocol, lib_acl_cpp, lib_fiber,主要是为了提升开发协程应用的效率(在协程方式下使用 acl 中的库,且可以使用 C++)。各个库之间的关系可以参考文章:https://blog.csdn.net/zsxxsz/article/details/88388462?spm=1001.2014.3001.5501 在UNIX平台下,是把 lib_acl, lib_protocol, lib_acl_cpp 三个库编译成一个库,运行 make 便可以生成这三个库的统一库:libacl_all.a
alongL commented 2 years ago

感谢郑总的热心答复! 能否把 编译mbedtls为so的命令加到博客里面,不了解mbedtls的人上手会快一点。 默认cmake 只生成.a的静态库。

mkdir build
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=TRUE  .. 

个人希望如果可以的话,将acl简化一下,把网络库的核心独立出来,做成开箱即用的东西,保留http, 其余的aliyun, snmp等等功能都放到samples里面。

alongL commented 2 years ago

因为项目中已经有CMakeLists.txt了,基本上已经不需要xcode,visualstudio的工程文件了。 我试着删了一下工程文件、samples、doc,瞬间感觉项目变得干净异常。 推荐作者把这些清理一下~~ image

项目中集成了mbedtls的头文件 ,似乎也不是必要的,并且可能是有害的,比如导致无法与新版本mbedtls兼容,所以建议也进行些许修改。

zhengshuxin commented 2 years ago

之所以费这么大劲针对各个平台都提供了平台上主流的工程文件,主要是为了方便使用者集成到自己的项目中,毕竟并不是所有人都需要做跨平台开发的,虽然cmake提供了跨平台方式,但在各平台上,还是使用平台原生的开发工具更方便,另外,cmake 无法代替IDE的功能,虽然其也可以生成对应平台上的工程文件,但与原生的相比还是差太多了。 在 acl 项目中之所以直接集成了所依赖库的头文件,主要是为了给不需要第三方库的用户提供了一种方便,这样 acl 采用动态加载方式(费不少劲)基本做到这一点了,比如,有人不需要 mbedtls 但需要 mysql 功能,他就可以很方便地使用 acl + mysql 功能而不必关心 mbedtls 的存在,当然这种动态加载的弊端就是不能跟踪第三方库的最新版,在 https://github.com/acl-dev/third_party 提供了 acl 所依赖库的源码,方便使用者进行集成。