博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用SocketAsyncEventArgs犯的低级错误
阅读量:5834 次
发布时间:2019-06-18

本文共 1838 字,大约阅读时间需要 6 分钟。

   之前在使用SocketAsyncEventArgs进行数据接收的时候,经常发现某部分数据错乱但确没有影响协议分析。在无意中发现原来犯了个低级错误,先看下以下代码:

public void IO_ReceiveComplete(TcpSocketAsyncEventArgs e)        {            TcpChannel channel = e.Channel;            if (e.BytesTransferred > 0 && e.SocketError == System.Net.Sockets.SocketError.Success)            {                               lock (TcpUtils.mLockReceiveDataLength)                {                    TcpUtils.ReceiveDataLength += e.BytesTransferred;                }                             channel.BeginReceive();                ReceiveItem item = new ReceiveItem();                item.SocketAsyncEventArgs = e;                item.Channel = channel;                channel.ReceiveDespatch.Add(item);                            }            else            {                e.Enter();                channel.Dispose();            }        }

以上代码看上去似乎没有什么问题,在接收数据后进行下一次接收然后把当前接收的数据放到队列中处理.不过好像忘了一个事情就是SocketAsyncEventArgs在接收数据的时候有可能存在同步完成,如果真是同步完成那结果是怎样呢。自然就是后面的数据会先添加到队列中,而前面的数据添加在后面,但由于同步完成是不确定性的,所以就出现有时正常,有时数据错乱Embarassed..把代码改成先放队列再进行下一下收接就行了

public void IO_ReceiveComplete(TcpSocketAsyncEventArgs e)        {            TcpChannel channel = e.Channel;            if (e.BytesTransferred > 0 && e.SocketError == System.Net.Sockets.SocketError.Success)            {                               lock (TcpUtils.mLockReceiveDataLength)                {                    TcpUtils.ReceiveDataLength += e.BytesTransferred;                }                                            ReceiveItem item = new ReceiveItem();                item.SocketAsyncEventArgs = e;                item.Channel = channel;                channel.ReceiveDespatch.Add(item);                channel.BeginReceive();                            }            else            {                e.Enter();                channel.Dispose();            }        }

转载地址:http://taucx.baihongyu.com/

你可能感兴趣的文章
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
百度账号注销
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>