0
点赞
收藏
分享

微信扫一扫

c++异网处理文件尾


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

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

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

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

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

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

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

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

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


举报

相关推荐

0 条评论