请问我的程序关于网络的在同一种情况下,有时运行正常,有时运行不正常。这里面是不是有网络方面的原因? ☆~豺狼~☆ 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:47if(SOCKET_ERROR!=recv(m_connection,(char*&info,sizeof(info),0)) 旺 19:19:29当游戏结束的时候要发送好多消息,和这个有没有关系啊? ☆~豺狼~☆ 19:20:29if(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:35SetDlgItemText(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

评论