Closed gaowanlu closed 3 months ago
主要就是优先优化下stream conn和websocket conn的sock2buf,进函数先判断下上次读出来的能不能写进buf能则没问题,否则返回false,然后再从socket中读,哪怕没写进recvbuff这没问题,预定一个task就行,因为sock2buf后会解包,下次task时recvbuf理应有足够的空间再写入一个包
else if (sock2buf_data_len > 0)
{
try
{
m_recv_buffer.write(sock2buf_inner_buffer, sock2buf_data_len);
}
catch (const std::runtime_error &e)
{
LOG_ERROR("%s", e.what());
return false;
}
sock2buf_data_len = 0;
return true;
} 异常则预定一次task
发送缓冲自带安全机制,有一点是sendbuffer大小必须大于buf2sock内的tempbuffer大小,当mwaitsendbuffer满时发不出去可以由应用app层决定conn的去留
true { bool have_data = false; while (true) { char temp_buffer[1024]; int temp_buffer_len = 0; try { temp_buffer_len = m_wating_send_pack.read(temp_buffer, 1024); } catch (const std::runtime_error &e) { LOG_ERROR(e.what()); } if (temp_buffer_len > 0) { have_data = true; try { int writed_len = m_send_buffer.write(temp_buffer, temp_buffer_len); if (writed_len != temp_buffer_len) { LOG_ERROR("write_len[%d] != temp_buffer_len[%d]", writed_len, temp_buffer_len); } } catch (const std::runtime_error &e) { LOG_ERROR(e.what()); } } else { break; } }应该设计最多将msendbuffer写满,就不要从mwait 里读出来数据了,确保不会读到tempbuf后导致数据丢失,需要为buffer组件搞一个获取其最多还有多少空间可用的方法
因为此时可能有其他地方在向mwait一直写数据导致,这里一直从mwait里读出数据,导致无法写入sendbuf
判断下sendbuf 是否还有大于tempbuf最大长度的剩余空间,如果不能存放下一个tempbuf最大内容,就不要再从mwait读了