sogou / workflow

C++ Parallel Computing and Asynchronous Networking Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

框架现在支不支持创建多个tcp tls客户端任务,每个tls客户端使用的证书私钥以及ca证书都不同的通信方式

coderwxl opened this issue · comments

这个问题你之前好像发过issue,当时我们没有解决。

我觉得这个功能还是有必要支持一下的。我跟进一下。

你多个client task是访问不同的协议(http/mysql这些),还是相同的协议呢?

相同的协议,目前用的是tcpsocket+tls,支持这个功能后麻烦给我说下。

大佬,改完了吗

还没有。我尽量今晚出一个可用的版本。你到时候可以先从我的fork拉。

可能又要改设计了,没那么快可以完工。

新的PR:#1530

我测试了下有问题。我开了30个线程,线程里面会定时创建临时tls客户端任务给服务端发请求,只有第一轮请求的15个客户端收到了响应数据,其它的没有收到响应数据(append函数没走进去),接下来所有线程就彻底都收不到服务端的响应了。

另外请问下SSL_CTX*需要我在外面手动释放还是框架会自动释放。

我们期待是在task生命周期之内,用户确保SSL_CTX有效。

正确性问题我们再测一下。

先合并到主项目的ssl_ctx分支了。具体用法,你参考一下WFMySQLConnection里这个:

void set_ssl_ctx(WFMySQLTask *task)

你把你的网络任务强传成WFComplexClientTask<MyRequest, MyResponse>类型,调用这个类的void set_ssl_ctx(SSL_CTX *)接口就可以了。ssl_ctx的生命周期需要覆盖task的生命周期。

我是这样创建的客户端任务:
WFCustomTask *task = WFNetworkTaskFactory<CustomRequest, CustomResponse>::create_client_task(m_isSSL ? TT_TCP_SSL : TT_TCP, (struct sockaddr *)&sockaddr, sizeof(sockaddr), ctx, 0, std::bind(&CTcpClient::process, this, _1));
这样也行吧

没事,我不着急,等你填上坑了我再用

你先试一下啊,现在也是可以用的。就是用这个函数:

static T *create_client_task(enum TransportType type,

我们也需要用户的使用建议才能确定怎么改。

我现在就是调用这个函数创建的任务,但是有我上面说的异常问题
static T *create_client_task(enum TransportType type,
const struct sockaddr *addr,
socklen_t addrlen,
SSL_CTX *ssl_ctx,
int retry_max,
std::function<void (T *)> callback);

我测试了下有问题。我开了30个线程,线程里面会定时创建临时tls客户端任务给服务端发请求,只有第一轮请求的15个客户端收到了响应数据,其它的没有收到响应数据(append函数没走进去),接下来所有线程就彻底都收不到服务端的响应了。

另外请问下SSL_CTX*需要我在外面手动释放还是框架会自动释放。

你是说这个问题吗?

是的。
用上面那个create_client_task创建任务后应该不需要再调用set_ssl_ctx来设置ctx吧

对,struct sockaddr + socklen 创建的,只能在create里设置,后面set_ssl_ctx无效。我看一下你说的问题。

@coderwxl 改了一点小问题,麻烦再试一下。觉得你说的现象有点奇怪,这边看不也会有这种问题。

我知道导致我上面说的异常原因了,是因为你这次改动没有使用连接池,导致每次都是新连接,但是服务端对连接数有限制,应该超过限制就会关闭新连接,从而导致后面就收不到服务端的响应了。

现在的代码还是没有复用连接吗?不应该啊。是不是你自定义协议没有调用set_keep_alive()?连接复用方面,和之前的没有什么区别。

不是我的问题,我只是调用不同的create_client_task函数,其它的没变:
image

你每次的ctx指针变了吗?不同的ctx(指针值),不会复用连接的。

可以了,我测了下没问题。

create_http_task能否也加上对ssl_ctx的支持

http的话,你可以模仿WFMySQLConnection的办法设置一下。可以自己搞个http client来创建任务,把ssl ctx封装进去。

如果加在我们的任务工厂里,那要加一堆函数。

好的,感谢大佬!