socket通信中的同步问题(Maybe是这样说吧)

mzlogin 2010-05-15 09:07:07
问题描述:
  我写的一个网络对战五子棋游戏中的CMySocket类是继承自CSocket,我的程序逻辑中有以下情况:
  甲方与乙方轮流下子,归一方下子时另方不能下子。一方下子后会向另一方发送棋子相关信息,并将本方允许下子标志置为FALSE,而对方读取消息后会将它那方的允许下棋标志置为TRUE。
  甲方下子后,在乙方尚未下子前这段时间内,允许甲方悔棋一次,悔棋后甲方重下,照正常逻辑乙方不准下子。
  
  在我与同学局域网测试的过程中,发现一个问题,就是
  我下了子之后,我点了悔棋按钮,而几乎在同时同学点了下子,而这时棋盘上的状况是我悔棋也悔了,而同学的子也下了。
  
  我对出现这种状况的理解是(假设我点悔棋按钮在对方下子之前)
  我点悔棋之后,本方socket向对方Send数据,也许是由于网络延时消息尚在路上,或者对方已经接收到消息而还没来得及将允许下棋标志置为FALSE。
  
  这个问题应该怎么解决?
...全文
100 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanguomi 2010-05-16
  • 打赏
  • 举报
回复
你同学点了同意悔棋的请求后,应该到等到你悔子后下了一步后,才能继续下子
这些都是通讯协议的事,只能说你开始协议没定好
lijianli9 2010-05-16
  • 打赏
  • 举报
回复
如果对方同意悔棋,你用撤销记录的上次步骤显示出来,然后再由悔棋方开始下棋,就是你要撤销一次,对方也要撤销一次或者不撤销(看对方的有没有在你下棋只有已经走子)
mzlogin 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sanguomi 的回复:]

你同学点了同意悔棋的请求后,应该到等到你悔子后下了一步后,才能继续下子
这些都是通讯协议的事,只能说你开始协议没定好
[/Quote]

我的协议的逻辑就是这样子的,
我悔棋后显然是要我下一步对方才能继续下子。
但是我下子后该对方下子啊,
而同时我这边可以悔棋,
就是说我们都有向对方发送消息的可能,
如果网络延时高或者本地数据来不及处理,
那会两个操作都被执行,
怎么样才能预防这种情况?

如果是如前面几楼所说的使用时间戳,
那在一方接收到消息后如何来控制本方消息的发送?
Eleven 2010-05-16
  • 打赏
  • 举报
回复
ls也说了,这个可能是你的协议定义的还不够完善,基本上是一问一答的方式,在执行动作以前,先得到对方的确认才可以执行该动作,否则无效。。。
wuhuwy 2010-05-15
  • 打赏
  • 举报
回复
满天星的方法不错,学习一下!
mzlogin 2010-05-15
  • 打赏
  • 举报
回复
1楼和4楼说到的方法。。。

我不知道具体应该怎么做啊。

悔棋是本方的动作,是在一个按钮的处理函数里面,
而对方下子在本方是在OnReceive中,
在我点悔棋按钮时,怎么去判断OnReceive中收到的消息的时间戳呢?
cnzdgs 2010-05-15
  • 打赏
  • 举报
回复
每个动作都加一个确认环节,发送下子或悔棋后等待对方确认,确认无误后生效。
解决冲突的方法有两种,一种是每个动作加一个时间戳,时间早的有效;另一种是下子优先于悔棋。
mzlogin 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouzhangkui 的回复:]

"这个问题应该怎么解决?"
前面说了这么多 没有看见你一句问题
[/Quote]

哦不好意思。
那我的问题就是,
按照正常的逻辑,
  我下了子之后,我点了悔棋按钮,而几乎在同时同学点了下子,而这时棋盘上的状况是我悔棋也悔了,而同学的子也下了。

这个是不正常的,我想要它正常起来。
就是这样子了。。。
周药师 2010-05-15
  • 打赏
  • 举报
回复
"这个问题应该怎么解决?"
前面说了这么多 没有看见你一句问题
dirdirdir3 2010-05-15
  • 打赏
  • 举报
回复
简单的话可以考虑加上个时间戳,如果悔棋的时间比下子的时间早的话就承认悔棋有效,否则悔棋无效............

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧