是否需要多个OpenSSL Bio对象才能允许并行请求?

时间:2019-03-31 19:12:29

标签: c++ openssl

我正在使用 OpenSSL的BIO API发送HTTPS请求。我需要通过无阻塞套接字同时通过 HTTP / 1.1 同时(不是串行)发送2个以上的请求到同一目标

我有正在处理的请求,但它们是通过串行方式发送/处理的,而不是同时进行的。

例如,当前,使用一个生物对象并同时向模拟API发送多个请求时,该API在发送响应之前具有5秒钟的内置延迟,我收到了5秒,10秒,15秒,20秒等之后响应。指​​示请求将按顺序处理。 (服务器可以在5秒钟的延迟时间内处理并响应来自不同客户端的多个请求,并确认这与客户端代码有关。)

问题:

  • 每个要同时发送的请求是否需要使用一个Bio对象 //// resolve refresh status var my_status = $('input[name="status"]:checked').val(); var socket = io.connect('http://localhost:5000',{ query: 'user_id='+user_id+'&first_name='+first_name+'&mylist='+mylist.join(',')+'&status='+my_status }); // array for emit var array_emit = ['is_online','iam_online','iam_offline','new_status']; // function for all emit status connection $.each(array_emit,function (key,value) { socket.on(value,function (data) { statusUser(data.user_id,data.status); if (data.status === 'online') { $('.status_string_'+data.user_id).text('active now'); }else if(data.status === 'offline') { $('.status_string_'+data.user_id).text('Inactive'); }else if(data.status === 'bys') { $('.status_string_'+data.user_id).text('Busy'); }else { $('.status_string_'+data.user_id).text('DND'); } }); }); // send my friends i online socket.on('connect',function (data) { $('.user-chat').each(function () { var uid = $(this).data('id'); socket.emit('check_online',{ user_id:'user_'+uid }); }); }); ?还是有其他方法可以使用Bio来同时发送和处理请求?

1 个答案:

答案 0 :(得分:0)

BIO对象与SSL对象具有相同的线程安全性。即单个SSL上下文不是线程安全的。您可以同时运行多个SSL上下文,但不能在同一SSL上下文中运行。

因此,如果确实需要同时运行多个HTTPS请求,则需要具有多个套接字(每个同时请求一个)。每个套接字都有自己的SSL上下文和自己的BIO上下文。

我的简单实现是每个线程一个套接字。更好(甚至可能更复杂)的是每个CPU一个套接字,您可以在其中使用某种方式来序列化对SSL上下文的访问,以使它们不重叠(例如,每个ssl流的boost asio链)