My E-mail 用志趣吸引人;用感情留住人;用技術武裝人;用創新發展人;一切以人為本!

Leo LU

evc与pc服务器网络连接

服务器端的程序是Server(VC6.0),客户端的程序是Client(eVC3.0)。  
    该程序只是简单的模拟了PC和PDA之间传递信息的过程,运行情况是:服务器端启动,设置地址和端口号,客户端启动,连接服务器,发送文字消息到服务器,服务器收到后,将这些文字消息在回传给客户端。  
    现在的问题是,客户端发送文字消息给服务器,没有问题,可是服务器收到后,却不能将消息回传,即客户端显示不出回传的消息。  
  请大家帮忙看看,是什么问题。  
  谢谢!  
    程序简单说明如下:  
  在server端(多文档),在菜单中有一个设置服务器地址和端口的选项,该程序片断如下:  
  void   CMainFrame::OnNetworkPortsetting()  
  {  
  CSetPortDlg   dlg;  
  if(dlg.DoModal()==IDOK)  
  {  
  m_pListenSocket=new   CListenSocket(this);  
  if(m_pListenSocket->Create(dlg.m_nPort))  
  {  
  if(!m_pListenSocket->Listen(5))  
  {  
  MessageBox("Socket   Listening   Failare","Error   Message",MB_OK);  
  delete   m_pListenSocket;  
  }  
  }  
  else  
  {  
  MessageBox("Create   Socket   Error!","Error   Message",MB_OK);  
  delete   m_pListenSocket;  
  }  
  }  
  }  
  Server中还有两个类,一个是CListenSocket类,负责监听客户端的响应,还有一个CAcceptSocket类,负责接收客户端的响应,同时回传信息给客户端。  
  在CListenSocket类中,有一个OnAccept函数,该函数负责接收客户的响应,程序片断如下:  
  void   CListenSocket::OnAccept(int   nErrorCode)  
  {  
  CAcceptSocket   *pSocket=new   CAcceptSocket(m_pMainFrame);  
  if(Accept(*pSocket))  
  {  
  m_pMainFrame->m_pAcceptList.AddTail(pSocket);  
  }  
  else  
  delete   pSocket;  
  CSocket::OnAccept(nErrorCode);  
  }  
  在CAcceptSocket类中,有一个OnReceive函数,该函数负责接收客户传过来的文字信息,并将该信息回传给客户,程序片断如下:  
  void   CAcceptSocket::OnReceive(int   nErrorCode)  
  {  
  char   pMsg[10000],tempMsg[1000];  
  int   ByteCount;  
  int   EndFlag=0;  
  char   AnswerMsg[10100];  
  strcpy(pMsg,"");  
  do    
  {  
  strcpy(tempMsg,"");  
  ByteCount=Receive(tempMsg,1000);  
  if(ByteCount>1000||ByteCount<=0)  
  {  
  AfxMessageBox("Receive   date   error",MB_OK);  
  return;  
  }  
  else   if(ByteCount<1000&&ByteCount>0)  
  {  
  EndFlag=1;  
  }  
  tempMsg[ByteCount]=0;  
  strcpy(pMsg,tempMsg);  
  }while(EndFlag==0);  
  AfxMessageBox(pMsg,MB_OK);  
  sprintf(AnswerMsg,"I   receive   your   message\n\"%s\"\nThank   you!",pMsg);  
  Send(AnswerMsg,strlen(AnswerMsg),0);  
          CSocket::OnReceive(nErrorCode);  
  在客户端,在MainFrame中,有三个菜单选项,分别是建立连接,关闭连接和发送消息,程序片断如下:  
  void   CMainFrame::OnNetLink()    
  {  
  if(m_pSocket)  
  {  
            CString   str="Connecting   is   success!";  
  CString   str1="Error   Message!";  
  MessageBox(str,   str1);  
                  return;  
  }  
  CLinkDlg   m_LinkDlg;  
  if(m_LinkDlg.DoModal()==IDOK)  
  {  
  m_strServeName=m_LinkDlg.m_strAddress;  
  m_nPort=m_LinkDlg.m_nPortNumber;  
  m_pSocket=new   CClientSocket(this);  
  if(!(m_pSocket=ConnectServe()))  
  {  
  delete   m_pSocket;  
  return;  
  }  
  }  
   
  }  
  void   CMainFrame::OnNetSend()    
  {  
  if(!m_pSocket)  
  {  
  CString   str="This   is   not   connecting!";  
  CString   str1="Error   Message!";  
  MessageBox(str,   str1);  
  return;  
  }  
  CMessageDlg   m_MessageDlg;  
  if(m_MessageDlg.DoModal()==IDOK)  
  {  
  TCHAR   buf[129];   //发送缓冲区  
                  ZeroMemory(buf,sizeof(buf));   //缓冲区清零  
                  CString   tmpstr(m_MessageDlg.m_strMessage);   //复制要发送的字符串  
                  int   multibytelen=WideCharToMultiByte(   //计算从Unicode转换到Ansi后需要的字节数  
                  CP_ACP,   //根据ANSI   code   page转换  
                  WC_COMPOSITECHECK   |   WC_DEFAULTCHAR,   //转换出错用缺省字符代替  
                  tmpstr.GetBuffer(m_MessageDlg.m_strMessage.GetLength()),   //要转换的字符串地址  
                                  m_MessageDlg.m_strMessage.GetLength(),   //要转换的个数  
                                  0,   //转换后字符串放置的地址  
                                  0,   //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节  
                                  0,   //缺省的字符:"\0"  
                                  0   //缺省的设置  
                    );  
                  WideCharToMultiByte(   //转换Unicode到Ansi  
                                  CP_ACP,  
                                  WC_COMPOSITECHECK   |   WC_DEFAULTCHAR,  
                                  tmpstr.GetBuffer(m_MessageDlg.m_strMessage.GetLength()),  
                                  m_MessageDlg.m_strMessage.GetLength(),  
                                  (char   *)buf,   //转换到缓冲区中  
                                  128,   //最多128个字节  
                                  0,  
                                  0  
                      );  
                  m_pSocket->Send(buf,multibytelen+1);   //发送转换后的缓冲区  
   
  }  
  }  
   
  void   CMainFrame::OnNetUnlink()    
  {  
  if(m_pSocket)  
  {  
  delete   m_pSocket;  
  m_pSocket=NULL;  
  }  
  else  
  {  
  CString   str="Connecting   is   failare!";  
  CString   str1="Error   Message!";  
  MessageBox(str,   str1);  
  }  
   
  }  
  CClientSocket*   CMainFrame::ConnectServe()  
  {  
  CClientSocket   *pTempSocket=new   CClientSocket(this);  
  if(!(pTempSocket->Create()))  
  {  
  delete   pTempSocket;  
  CString   str="Socket   Error!";  
  CString   str1="Error   Message!";  
  MessageBox(str,   str1);  
  return   NULL;  
  }  
  if(!pTempSocket->Connect(m_strServeName,m_nPort))  
  {  
  delete   pTempSocket;  
  CString   str="Connecting   Error!";  
  CString   str1="Error   Message!";  
  MessageBox(str,   str1);  
  return   NULL;  
  }  
  return   pTempSocket;  
  }  
  还有一个ClientSocket类,其中有一个OnReceive函数,程序片断如下:  
  void   CClientSocket::OnReceive(int   nErrorCode)  
  {  
  TCHAR   p[129];   //接受缓冲区  
  ZeroMemory(p,sizeof(p));   //接收缓冲区清零  
    int   ByteCount=Receive(p,128);//接收128个字节  
  int   widecharlen=MultiByteToWideChar(   //计算从Ansi转换到Unicode后需要的字节数  
  CP_ACP,  
  MB_COMPOSITE,  
  (char*)p,   //要转换的Ansi字符串  
  -1,   //自动计算长度  
  0,  
  0  
                  );  
   
  CString   tmpstr;  
    tmpstr.GetBuffer(widecharlen);   //为转换后保存Unicode字符串分配内存  
  MultiByteToWideChar(   //从Ansi转换到Unicode字符  
  CP_ACP,  
  MB_COMPOSITE,  
  (char*)p,  
  -1,  
  tmpstr.GetBuffer(widecharlen),   //转换到tmpstr  
  widecharlen   //最多转换widecharlen个Unicode字符  
                  );  
  AfxMessageBox(tmpstr,   MB_OK);  
  CSocket::OnReceive(nErrorCode);  
  }  

posted on 2007-09-17 16:34  Leo LU  阅读(378)  评论(0)    收藏  举报

导航