栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++异网处理文件尾

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++异网处理文件尾

原文
网络通信的一端主动调用shutdown/send时,对端就会收到一个eof(文件尾)错误,eof并不是真正意义上网络错误,只是表明对端不会再发送数据过来了,对端此时(在没有调用shutdown/recieve的前提下)仍可接收数据.但是,asio把它归为网络错误,则应该怎么处理该eof错误呢?

空 干读()
{
    动 本(从本共享());
    套接字_.异步读些(提升::异网::缓冲(数据_,最大长度),[本,本](提升::系统::错误码 ec,大小型 长度){
    如(!ec){
        干写(长度);
    }异{
        关闭();
    }
    });
}

空 关闭(){
    套接字_.关闭();
}

上面,直接关闭.
如果这时候正在发送异步数据,这样直接关闭可能会导致缓冲区数据丢失,正确做法应是先调用shutdownsend,再close,这样保证先把缓冲区数据发送完,再发送fin给对端,这就是所谓的"优雅关闭".

空 干读()
{//同前略
    ...
}

空 关闭(){
    套接字_.关闭(异网::ip::传控::套接字::都关闭);//加上.
    套接字_.关闭();
}

但未处理文件尾.要如下处理:

空 干读()
{
    动 本(从本共享());
    套接字_.异步读些(提升::异网::缓冲(数据_,最大长度),
        [本,本](提升::系统::错误码 ec,大小型 长度)
        {
          如(!ec)
          {
            干写(长度);
          }异{
            如(ec==异网::错误::文件尾&&长度>0){
                动 回复数据=处理(数据_,长度);
                响应(回复数据);
            }//加上
            关闭();
          }
        });
}

空 关闭(){
    套接字_.关闭(异网::ip::传控::套接字::都关闭);
    套接字_.关闭();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号