网络同步带来的bug
说一下之前遇到的bug,首先贴点代码
public class TcpSession : ITcpSession
{
private Socket _appSession;
private AutoResetEvent _signal = new System.Threading.AutoResetEvent(false);
…………
}
这个类里维护了一个sokect连接,和一个AutoResetEvent 对象,作用待会儿再说,首先一个连接产生(工作者线程,即真正使用连接的线程)以后,会加入到连接列表中,连接列表由一个"单独监听线程"维护,这个线程始终存在,每一次工作者线程发送完数据就会就会通过_signal 调用_signal.WaitOne(timeOut); (timeOut是int型的超时时间),将自己挂起,直到超时或监听线程监听到数据后通过所维护的列表调用_signal.set()将工作者线程唤醒。
但是这里存在一个隐含的bug,导致这个bug的关键就在于 这个timeOut,首先我们要执行两次数据发送,第一次发送完将自己挂起,等待被唤醒,但是由于网络慢,数据一直没来,导致超时。程序继续往后运行,工作者线程又发了一条数据将自己挂起,等待被唤醒,此时第一次发送数据的返回数据到了,监听线程就要执行唤醒操作,但是在等待的是第二次发送数据请求,也就导致了数据错误。
想了很多办法,都不是特别好使,最后用的是在发送数据是加上一个值这个值有工作者线程来确定,每次发送时更新此数据,接收到数据后进行比对看是不是这次请求的数据。
技术强的大牛们如果有什么好建议可以提一提啊。
网络同步带来的bug的更多相关文章
- ue4网络同步概念笔记
网络同步主要的概念是 复制. 不是以前的S,C逻辑分离. 是S复制到C通过 Switch Has Authority 将S与C的逻辑在程序内分离. 所属权:每个连接到S的C都有自己的 控制权.从 ...
- Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术
http://mp.weixin.qq.com/s/0v0EU79Q6rFafrh8ptlmhw 在Unite 2017 Shanghai案例分享专场,来自蓝港互动<闹闹天宫>项目组的主程 ...
- MOBA游戏的网络同步技术
转自:http://www.gameres.com/750888.html 在5月13日Unite 2017 案例分享专场上,蓝港互动<闹闹天宫>项目组的主程序陈实分享了MOBA游戏的网络 ...
- 是uibutton跟tableviewcell同步使用一个bug
这个问题是uibutton跟tableviewcell同步使用一个bug,不关delay一点毛事,证据就是点击事件没问题,so,搜到一个方法解决了这个问题.uibutton分类symbian2+ios ...
- 百度云+ KeePass 网络同步你的密码
百度云+ KeePass 网络同步你的密码 百度云一个目前不限流量不限格式能直链的网盘,速度在我这里很快,难得了!KeePass(小众介绍过 KeePass.) 是一个免费开源的密码管理类软件, ...
- UE4 内容示例网络同步Learn
一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...
- UE4网络同步属性笔记
GameMode只有服务端有,适合写游戏逻辑.PlayerController每个客户端拥有一个,并拥有主控权.GameState在服务端同步到全端. CLIENT生成的Actor对其有Authori ...
- Unity - Photon PUN 本地与网络同步的逻辑分离 (二)
上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...
- CentOS7 时间设置与网络同步
1.查看时区 [root@localhost /]# date -R Thu, Jul :: + +0800表示东八区,这边就不用再设置 时区中的CST表示中国标准时间. 时区相关共享文件在/usr/ ...
随机推荐
- ajax-向服务器发送请求
ajax-向服务器发送请求 1.将请求发送到服务器,使用XMLHttpRequest对象的 open() 和 send() 方法. xmlhttp. open(method,url,async ...
- mybatis实战教程(mybatis in action)之六:与Spring MVC 的集成
前面几篇文章已经讲到了mybatis与spring 的集成.但这个时候,所有的工程还不是web工程,虽然我一直是创建的web 工程.今天将直接用mybatis与Spring mvc 的方式集成起来,源 ...
- python 类变量和实例变量
super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类. 实例的属性存储在实例的__dict__中,类属性和方法存储在类的__dict__中.查找属性时,先检 ...
- CentOS下安装Redis及Redis的PHP扩展
1.安装Redis 1.1 如果没有安装wget,安装wget yum install wget 1.2 在http://redis.io/download页面查看redis版本,并下载安装 wget ...
- linux默认编辑器 sublime
开发人员把Vi improved简称Vim Vim编辑器再内存缓冲区中处理数据. 如果再启动Vim时未指定文件名,或者这个文件不存在,Vim会新开一段缓冲区域来编辑. 如果你再命令行下指定了一个已有文 ...
- windows apache24 php Call to undefined function curl_init
check dll files in dir: Apache24/bin libssh2.dll, ssleay32.dll, libeay32.dll http://nz.php.net/manua ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- .net 生成 静态页面
.net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...
- Ubuntu 14.04下Django+MySQL安装部署全过程
一.简要步骤.(Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便一些有需要的童鞋,大神勿喷~ 二.Python的安装 由于博主使用的环境是 ...
- zookeeper分布式部署-mac先测试
由于平台马上要引入zookeeper+dubbo,为了解决zookeeper单个实例运行的风险,需要做个集群. 1,先说配置:zoo.cfg十分简单,分两种情况: 一种是在一台机器采用不同的端口配置多 ...