如何在传输过程中处理半开套接字?

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

以上是关于如何在传输过程中处理半开套接字?的主要内容,如果未能解决你的问题,请参考以下文章

数据在网络中如何传输的

如何在 C++ 中序列化对象?

如何在 iOS swift 中使用 UDP 套接字流式传输音频?

如何设定ClientSocket的超时时间。

协议栈处理过程

如何使用套接字传输 pdf、mp3 或 mp4 文件?