如何在传输过程中处理半开套接字?
Posted
技术标签:
【中文标题】如何在传输过程中处理半开套接字?【英文标题】:how to handle half open socket in middle of transfer? 【发布时间】:2018-02-26 09:27:29 【问题描述】:/*Basic Things has been done.*/
/*Like setting connection and receiving */
namespace bar = boost::asio::error;
void doWrite(char* buffer, size_t size_)
boost::asio::async_write_some(socket, boost::asio::buffer(buffer ,size), boost::bind(&Handler, this, bar::error, bar::bytes_transferred));
/*handler*/
void handler(/*parameters*/)
当我的服务器持续传输数据时。有时客户端会崩溃/*故意*/。
errorCode.message()
给出boost::asio::error::bad_descriptor
的错误并且整个程序崩溃。
我已经从 boost 聊天服务器示例中复制了该程序。
如果服务器正在传输假设 1024 字节,而在写入 1024 字节的过程中客户端关闭。整个程序崩溃。
更多技术措辞:
【问题讨论】:
“整个程序崩溃” 好吧,实际发生了什么?您的调试器会针对这种情况报告什么诊断信息?并展示您的minimal reproducible example。 错误描述符错误不是由半开套接字引起的。它通常是由关闭套接字然后继续使用它引起的。 【参考方案1】:确保执行所有操作,要么捕获 system_error
,要么接收(并检查)error_code
。
正如你所说,你已经收到了boost::asio::error::bad_descriptor
代码,所以我希望程序终止结果是因为对抛出的同一个套接字的后续操作。
查找采用boost::system::error_code&
参数的重载(例如http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/basic_stream_socket/close.html)。
【讨论】:
我在同一个套接字上进行数据传输的后期操作,即使我收到了bad_file_descriptor
。以上是关于如何在传输过程中处理半开套接字?的主要内容,如果未能解决你的问题,请参考以下文章