- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2017-07-15 21:43 编辑
关于 Boost 库 ASIO 发送函数 的一个BUG:
触发模式:发送2G Byte的数据, 接收使用telnet, 发送过程中,安全检查线程 巡检 检测到TCP/IP底层错误
struct tcp_info info;
int length = sizeof(info);
memset( &info,0,sizeof(info) );
getsockopt( int_socket_handle, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&length );
if( info.tcpi_state == 1 ) return false;
return true; // 这里检测到TCP/IP底层 错误
原因:Boost Asio 库发送时 缺乏对于 tcp_ip_send_buffer_free_bytes 的检测, 当TCP/IP的发送缓冲区已经写满了,试图写入数据,有时会导致此错误。
解决办法:
1)发送的大数据先切片为小数据,再发送,宁可多调用几次,
2)在发送 send 数据前检测 底层TCP/IP缓冲区 (默认2.5M大小), 如果空间快满了,则暂停发送
3) 暂停发送后,有一个共用的1秒定时器定期检查这些暂停的连接,当某连接的 底层TCP/IP 发送缓冲区已空后,重启发送任务继续发送。
|
|