跪问一个网络传输中遇到非常郁闷的问题(很久都没能找到原因!!~~)

类别:VC

阿里妈妈帮你实现网络赚钱梦


楼主wilsonhuang(失落天子)2006-12-02 16:19:27 在 VC/MFC / 网络编程 提问

前段时间刚初学MFC网络编程,写一个局域网的多人聊天小程序。  
  可出现了个莫名其妙的问题。用CSocket建立连接。  
  服务器和各个客户端都能正常地连接。当传输数据的时候,问题出现了。(局域网,交换机连的)。  
  当网络中有“双核”(至少目前都是这样的)的机器时,在发送了一定数量的信息后,会出现无法收到和发送数据的现象.单核机之间怎么测都没问题.  
  如果是服务器,整个聊天系统都没反应了(设计的是所有消息发送都要经服务器中转);如果是客户端,那么这个客户端就无法收到信息也无法发送信息了。没采用多线程,没发生阻塞,客户端和服务器端表面上一切正常,按钮都能点。  
  开始还以为是多人聊天原因,改成双机直接用线对连,一个Server对一个Client。只要有“双核”计还是会出现这个问题。  
  一开始是用的先将信息用CArchive对象序列化,然后再用WriteString("******");写Buffer再Flush()发送,另一端用ReadString(**);接收后来以为是传输方法上有问题,改成用Send发送,将消息封装在一个Struct中发出去,另一端用Receive接收。均告失败!!但有一点不同,用Send能多发几个消息,也就是说用CArchive发不了几条消息就没反应了(有时甚至连建立了连接后的第一条消息都发不出去(程序里我发的是用户名)!!!用Send的话不会这么快出现问题,还能多发几条~~~.  
  有一次测试时,用一台单核机和双核机连接,那台双核机死都要作服务器,一当客户机就"罢工".~!!搞笑!!  
  请了个老师来解决,看了半天,郁闷.用etherea抓包,说能抓到数据包,能正常发送,他也不知道问题出在哪!~~在MSDN找了个老外写的用Send发送来聊天的实例,怎么都测不出问题,狂晕~!!  
  用到的机器有HP的机器(Intel双核的台机),Acer单双核笔记本,东芝双核笔记本,联保单核笔记本IBM单核笔记本.  
   
   
  这几天又碰到了这个问题,更郁闷,用路由器连的,用CArchive的方法发送发不了几条(一般是0条,也就是能建立连接但一条都发不出去也收不到).但用Send的方法时,不管是单核还是双核(笔记本),发了几百条消息,一点问题都没有?以前不知道为什么老出问题.  
  不知道到底是不是单双核的问题,但测出来实际确实如此.  
  这个问题困扰了我很久很久了,希望哪位大仙能帮忙解决下啊,本人在这里万分感激啊!!!! 问题点数:50、回复次数:4

1 楼ProgrameMan(我要学汇编)回复于 2006-12-02 16:55:33 得分 50

呵呵   怎么又见到有说双核了,你都说了   老外的程序怎么测都没问题,问题很明显了,好好看看你的程序吧,另外   CArchive   我没用过,没啥说话的权利,但是如果你就这么问估计没人能帮你解决了,除非以前遇到过这个问题并且已经解决了,你最好还是把代码贴出来吧

2 楼wilsonhuang(失落天子)回复于 2006-12-02 18:50:14 得分 0

CArcive方法发送和接收的主要代码(Server和Client端一样):  
  用CArcive发送:  
  ClientSoc为添加的CSocket类  
  void   ClientSoc::SendMsg(CString   temp)//temp为从Edit控件得到的文本  
  {  
                  //AfxMessageBox(temp);  
  m_pArchiveOut->WriteString(_T(temp3 "\r\n"));  
  m_pArchiveOut->Flush();  
  }  
    用CArchive接受:  
  void   ClientSoc::OnReceive(int   nErrorCode)  
  {  
          CSocket::OnReceive(nErrorCode);  
          CString   ss;  
          m_pArchiveIn->ReadString(ss);  
          //AfxMessageBox(ss);  
          mainptr->edit.SetWindowText(ss);//mainoptr为指向主窗体的指针,是建立好连接的时候传                                                                                        
                                                                          //到这个类里面的  
  }  
  我试过,当出现问题后,不管另一端怎么发送,OnReceive没有被调用.  
  不好意思,我第一次发帖,不知道该怎么问,非常感谢你的回帖.  
  如果需要我稍后可以贴上所有代码,只不过有点长.  
  谢谢  
 

3 楼wilsonhuang(失落天子)回复于 2006-12-03 00:18:10 得分 0

这是我写的第一个真正的应用程序,请各位高人帮帮忙吧.  
  消息发送的主要代码如下:  
  //ClientSoc.cpp  
  ...  
  struct   stream  
  {  
              char   message[100];  
  };  
  ...  
  //ClientSocDlg.cpp  
  void   CClientSocketDlg::login()  
  {  
  const   int   LEN   =   sizeof(WORD)     sizeof(stream);  
  char   pBuf[LEN];  
  ASSERT(pBuf   !=   NULL);  
   
  //   填充pBuf  
  *(WORD*)pBuf   =   1;  
   
  stream   *pLogin   =   (stream*)(pBuf     sizeof(WORD));  
  strcpy(pLogin->text,text);//text是用户名CString型的输入的文本  
  c->Send((void*)pBuf,   LEN,   0);  
   
   
  }  
  ...  
  //lientSoc.cpp  
  void   ClientSoc::OnReceive(int   nErrorCode)  
  {  
  //   TODO:   在此添加专用代码和/或调用基类  
          CSocket::OnReceive(nErrorCode);  
  WORD   type;  
  if   (Receive((void*)&type,   sizeof(type),   0)   !=   sizeof(type))   {  
  AfxMessageBox("unable   to   receive   package   type   info.");  
  return;  
  }  
  switch   (type)  
                  {  
                        case   1:  
                            this->receivemessage();  
                            break;  
                        ...  
                    }  
  }  
  ...  
  void   ClientSoc::receivemessage()  
  {  
          stream   info;  
                  if   (Receive((void*)&info,   sizeof(info),   0)   !=   sizeof(info))  
          {  
  TRACE0("unable   to   receive   user   login   infomation.");  
  return;  
          }  
          CString   rr=   info.text;  
                          ptr->edit.SetWindowText(rr);  
  }  
  ...  
  这个程序在单机上测试和在单核机之间测试没测出过问题.实在不懂啊.  
  是不是硬件的原因或是缓存的问题么?  
  谢谢!  
   
 

4 楼ProgrameMan(我要学汇编)回复于 2006-12-03 16:56:45 得分 0

这分受之有愧啊,你是否可以试着在   发送、接收的环节加上信号量来保证以下线程同步的问题呢,估计问题是出在线程同步的方面。

↓有缘文章(随机)
返回[就爱你]首页