正文

我的一次技术讨教,感触很深2007-04-05 20:53:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/12567/24625.html

分享到:

请问我的程序关于网络的在同一种情况下,有时运行正常,有时运行不正常。这里面是不是有网络方面的原因?
☆~豺狼~☆ 19:03:37
不一定
旺 19:04:07
我的表现为消息收到了一部分
旺 19:04:14
在不正常的时候
☆~豺狼~☆ 19:05:31
怎么个不正常法?
旺 19:05:44
等消息传过来的时候,我让对话框做出一些反应,可是只是做了一部分反应
旺 19:06:14
 这个是不正常的
旺 19:06:28
 这个是正常的
旺 19:07:11
就是想让它们结束的时候从上面的画面变成下面的画面
旺 19:07:36
双方都能够知道谁赢谁输
旺 19:07:50
可是画面有时转不过来

 
☆~豺狼~☆ 19:07:55
接收到消息就结束?
 
旺 19:08:03
异步选择的
旺 19:08:36
有时能转换过来
☆~豺狼~☆ 19:08:56
检查一下是不是消息还没到就处理了
因为你是异步操作
旺 19:09:35
应该是到了,屏幕上显示出了谁赢谁输,这里也是消息的一部分
旺 19:09:49
是不是我发的消息过多了?
☆~豺狼~☆ 19:10:17
跟消息多少应该没关系
你的问题应该是在消息相应上
旺 19:11:09
哦,我设了断点,它执行到那里的语句了,而且在单步调试的时候是正常的
旺 19:11:31
可是我在直接运行的时候又不正常了
旺 19:12:13
这个是不是消息响应设的不合理造成的?
旺 19:13:02
我只传了个消息的类型,等对方接到这种类型就会作出某些操作
☆~豺狼~☆ 19:13:09
你的响应是对消息进行分析还是接收到消息就马上响应?
旺 19:13:50
对消息里面设了编号,等到编号3的时候去执行
旺 19:13:57
用的case 
旺 19:14:10
只传了个编号
旺 19:15:06
应该是接收到消息对消息的编号进行判断然后再去响应
☆~豺狼~☆ 19:15:15
是不是你的异步没处理好?
有些消息没接收完就已经先响应了
☆~豺狼~☆ 19:16:00
加上waitforsingleobject试试
旺 19:16:10
这种情况应该如何解决啊?我感觉我只做了一部分响应
旺 19:16:14
的操作

 
旺 19:16:31
进行线程同步吗?
☆~豺狼~☆ 19:16:41
你有没有对接收函数的返回值进行分析?
旺 19:17:10
接收消息响应函数吗?
旺 19:17:45
我把那些操作写在消息响应函数了,这样可以吗?
☆~豺狼~☆ 19:17:56
就是WSArecv
不知道你是不是用这个,就是你用来接收信息的函数
旺 19:18:12
我用的recv
旺 19:18:36
那个我判断了
旺 19:18:47
if(SOCKET_ERROR!=recv(m_connection,(char*&info,sizeof(info),0))
旺 19:19:29
当游戏结束的时候要发送好多消息,和这个有没有关系啊?
☆~豺狼~☆ 19:20:29
if(SOCKET_ERROR!=recv(m_connection,(char*&info,sizeof(info),0))
然后呢?函数体
旺 19:20:57
然后是进行switch判断了
旺 19:21:13
各种消息编号执行不同的操作
旺 19:21:33
这些都放在了消息响应函数中
旺 19:21:51
 switch(info.type)
☆~豺狼~☆ 19:22:51
如果是用recv,按理不会有接收不完整的情况出现啊
旺 19:23:00
是不是这个时候它同时接收到了很多消息,然后判断的时候出了差错
☆~豺狼~☆ 19:23:26
不会的,每个消息都有一次判断
不会出错
旺 19:23:56
它接收的消息我感觉没有出现不完整,只是在消息编号的某中操作下,没有完成全部操作
旺 19:24:04
只是完成了一部分
旺 19:24:34
消息响应函数没有执行完就结束了

☆~豺狼~☆ 19:25:22
没见过执行一半退出的
你的代码是怎么设计的
旺 19:25:37
我感觉我的代码没有问题
旺 19:25:41
是啊
旺 19:25:47
我有点纳闷
☆~豺狼~☆ 19:26:04
同样是编号3
有些执行完有些没执行完是不可能啊
除非是有些根本没执行,只要有执行就不可能执行一半
旺 19:26:14
 case 3://表示为游戏结束信息.
      if(game_info.m_win==1)
       m_WhiteOver=true;
      if(game_info.m_win==2)
       m_BlackOver=true;
      SetDlgItemText(IDC_TEXT1,m_username);
      SetDlgItemText(IDC_TEXT2,playerinfo[1].name);
      GetDlgItem(IDC_START)->EnableWindow(true);
      GetDlgItem(IDR_REGERT)->EnableWindow(false);
      GetDlgItem(IDC_LOST)->EnableWindow(false);
                      InvalidateRect(&m_rect,false);
                  m_Myturn=2;
      m_bStart=false;
      m_bReady=false;
      break;
旺 19:26:32
这个是我的编号3的代码
旺 19:27:28
但是它通知了对方游戏的输赢
旺 19:27:33
 InvalidateRect(&m_rect,false);
旺 19:28:02
这个函数进行了重绘,判断出了谁赢谁输
旺 19:28:35
SetDlgItemText(IDC_TEXT1,m_username);
      SetDlgItemText(IDC_TEXT2,playerinfo[1].name);
      GetDlgItem(IDC_START)->EnableWindow(true);
      GetDlgItem(IDR_REGERT)->EnableWindow(false);
      GetDlgItem(IDC_LOST)->EnableWindow(false); 这些都没有表现出来
☆~豺狼~☆ 19:29:43
在上面那些没表情出来的时候你确定下面这些代码都执行了?
if(game_info.m_win==1)
       m_WhiteOver=true;
      if(game_info.m_win==2)
       m_BlackOver=true;
 
旺 19:30:18
这个是在一方认输的时候再去执行
旺 19:30:52
当不认输的时候game_info.m_win我设置成了0
☆~豺狼~☆ 19:30:58
函数体执行不执行不管
问题是if有没有执行到
旺 19:31:06
传过来的
旺 19:31:33
我去看看,上面的到没怎么注意
☆~豺狼~☆ 19:32:02
你调试一下当出现异常的时候断点有没有经过两个if
旺 19:32:45
调试的时候暂时还没有出现不正常的情况,一调试程序反而正常了
旺 19:34:56
没有执行到

 
旺 19:35:07
可能是程序有问题了
☆~豺狼~☆ 19:35:25
两个if也没执行到吗?
旺 19:35:28
出现了异常
旺 19:35:30
是的
☆~豺狼~☆ 19:35:42
那你看看编号是不是确定是3
旺 19:35:48
但是我的屏幕上出现了重绘
☆~豺狼~☆ 19:36:30
出现异常的时候还有没有进去case3:里面?
旺 19:36:42
没有进去
旺 19:36:55
这边一点反应都没有
☆~豺狼~☆ 19:37:23
那info.type是不是3?
旺 19:37:43
我去看看
旺 19:41:09
不是3
☆~豺狼~☆ 19:41:37
那是不是你想要的数据?
旺 19:41:48
传过了两个值,第一个是2表示棋子的,第二个是
-1229130317
☆~豺狼~☆ 19:42:03
第二个是
-1229130317

如果正常的话应该是3是不是?
旺 19:42:07
是的
旺 19:42:20
应该第一个2,第二个3
☆~豺狼~☆ 19:42:25
那就应该不是接收端的问题了
你去检查检查发送端
旺 19:42:40
它同时传了两个这样的数据
☆~豺狼~☆ 19:43:01
同时传了两个?
你的意思是按你的设计应该只传一个?

 

 
旺 19:43:16
应该传两个 
旺 19:43:26
正确的是第一个2,第二个3 
旺 19:43:37
现在第二个值没了
☆~豺狼~☆ 19:43:47
变成天文数字了?
旺 19:44:08
呵呵,不知什么怎么回事
旺 19:44:19
变成了-1229130317 
旺 19:44:40
是不是你说的那个线程问题啊
旺 19:44:51
要搞成线程同步的形式
☆~豺狼~☆ 19:46:05
不是
如果是异步出错接收数据会不完整
旺 19:46:28

☆~豺狼~☆ 19:46:32
你检查发送端看有没问题吧
旺 19:46:51
我去看看
☆~豺狼~☆ 19:47:11
忘了问你了
你接收第二个数也就是那个正常是3的变量有没初始化?
旺 19:47:27
没有
☆~豺狼~☆ 19:47:31
。。。。。。
旺 19:47:49
 //将输赢信息发给对方
    info.cmd=1;
    info.type=3;
    info.m_win=0;
旺 19:48:03
我直接赋值的
旺 19:48:14
这样有什么不妥吗?
☆~豺狼~☆ 19:48:22
那很明显
第二个数根本就是没接收到
 
旺 19:48:48
哦,那问题肯定在发送端可

 

 
☆~豺狼~☆ 19:48:50
你把接收第二个数的变量初始化为0
出现异常之后看看是不是还是0
旺 19:48:50

旺 19:49:08
好的,我去试试
☆~豺狼~☆ 19:49:36
如果还是0证明接收端根本没接收端第二个数
因为你发送端发送的是结构体不会没发送到的
旺 19:50:10
那它为什么没接收呢?
旺 19:50:27
发送了一定会接收吗?
旺 19:50:45
应该只能是没发送这种情况吧
☆~豺狼~☆ 19:50:46
发送的肯定会发送成功
接收的不见得会接收成功
 
旺 19:51:08
哦,你的意思是丢失数据了
旺 19:51:23
有这种可能
☆~豺狼~☆ 19:51:27
不是
旺 19:51:32
那是?
旺 19:51:43
没有听懂
☆~豺狼~☆ 19:51:44
丢失的几率是E分之一
旺 19:51:54
哦,呵呵
☆~豺狼~☆ 19:51:57
是你的接收端问题
没接收到
☆~豺狼~☆ 19:52:08
好好检查你接收端的代码
旺 19:52:16
但是我第一个已经接收到了
旺 19:52:29
会不会两个同时发过来
旺 19:52:33
一起接收

 
旺 19:52:50
如果那样的话,那问题很严重了 
旺 19:53:15
两个发送我都写在一起了
☆~豺狼~☆ 19:53:16
你接收完第一个之后没有释放临界区?
旺 19:53:27
没有用多线程的知识
旺 19:53:40
这里面是不是必须用多线程
旺 19:54:05
释放临界区是?
旺 19:54:43
我感觉两个一起发过来的可能性比较大
旺 19:55:22
我编号2里面也有重绘函数
旺 19:56:11
你的意思是释放临界区是指?
旺 20:00:40
还在吗?
☆~豺狼~☆ 20:15:13
不好意思
刚刚有事出去了
☆~豺狼~☆ 20:15:33
你试下在发送的两个消息中间把线程挂起
旺 20:15:34
呵呵,没事
☆~豺狼~☆ 20:15:42
比如Sleep(1000)
旺 20:15:47
利用线程同步吗?
旺 20:16:16
要是万一两个一起发过来呢?
☆~豺狼~☆ 20:16:22
你说你发送端同时发送了两个消息
接收端又是异步操作
但是为什么接收函数还是用recv?
旺 20:17:04
那要用哪个函数啊?要用这个WSArecv吗?
☆~豺狼~☆ 20:17:46
如果是异步通讯应该是WSArecv的啊
旺 20:18:35
这两个有什么区别啊?

 

 
☆~豺狼~☆ 20:18:37
你说你发送端连续发送两个消息
是怎么个连续法?
直接两个send?
旺 20:18:44
是的
☆~豺狼~☆ 20:18:50
。。。。。。你好像还没理解同步和异步。。
旺 20:18:52
一前一后
☆~豺狼~☆ 20:19:20
你试下两个send中间加个Sleep(1000)
如果不会出错就知道问题所在了
旺 20:19:37

旺 20:20:10
这样是不是接收端已经在缓冲区中取了第一个结构体了
☆~豺狼~☆ 20:21:25
你的问题应该是第一个信息还没处理完第二个信息就来了
所以程序把数据包丢弃
旺 20:22:48
哦,是这样啊。那你能说说那个同步和异步的区别吗?我在书上只看到了异步选择函数实现了非堵塞方式
☆~豺狼~☆ 20:24:09
很多初学者的确经常把异步与同步、阻塞与非阻塞搞混了
不过你不像初学啊
怎么会犯这种错误
旺 20:24:35
呵呵,我也是初学的
☆~豺狼~☆ 20:24:40
 
Nasa earth 20:24:54
你就说说吧
☆~豺狼~☆ 20:24:57
建议找本系统的书好好学一下
旺 20:25:08
什么书名啊?
旺 20:25:28
我在图书馆里面借了本VC网络的书
旺 20:25:59
不过我感觉里面有些地方没说清楚
☆~豺狼~☆ 20:26:19
确定你自己C/C++已经入门
然后去看深入详解VC吧
我觉得那是最好的一本基础教材
旺 20:26:56
哦,我记下了。谢谢你啊
☆~豺狼~☆ 20:27:08
 客气

 
旺 20:27:50
讨论了这么多,我感觉澄清了好多模糊的地方。 
旺 20:28:35
这样可以了
旺 20:29:03
 

 

阅读(1774) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册