在WINCE上实现UDP通信(100%可行!)

本文来自:http://blog.csdn.net/hellogv/


首先介绍一下,开发平台:WINCE 4.2(WINCE 5.0也适用,因为使用了静态编译MFC动态链接库);开发工具:VS2005。

以下的代码,来自中国水利水电出版社(www.waterpub.com.cn)的《EVC高级编程及其应用开发》这本书,若想实现WINCE的UDP通信,请先到水利水电出版社下载原本的UDP编程代码。当然,你懒得修改的话,可以直接到http://download.csdn.net/source/282307下载我已经弄好的实例代码。

接下来开始修改代码:

1.修改UDP_CE.CPP的SendData函数为:



bool CUDP_CE::SendData(const char *buf, int len)

{

 int nBytes = 0;

 int nErrorCode;

 nBytes = sendto(m_UDPSocket,buf,len,0,(sockaddr*)&m_RemoteAddr,sizeof(m_RemoteAddr));  

 if (nBytes==SOCKET_ERROR ) 

 {  

  nErrorCode = WSAGetLastError(); 

  m_OnUdpError(m_pOwnerWnd,nErrorCode); 

  return false; 

 }

 return true;

}



当然,不要忘记修改UDP_CE.h的SendData函数声明为:bool SendData(const char *buf, int len);



2.修改UDP_CE.CPP的RecvThread函数为:



...............



  if (ret > 0)

  {

   if (FD_ISSET(pSocket->m_UDPSocket,&fdRead))

   {

    

                tmpAddr.sin_family=AF_INET;            

                tmpAddr.sin_port = htons(pSocket->m_RemoteAddr.sin_port);

    tmpAddr.sin_addr.s_addr =INADDR_ANY;

                tmpRecvLen = sizeof(tmpAddr);

    

    

    recvBuf = new char[1024];

    recvedBuf = new char[1024];

    ZeroMemory(recvBuf,1024);

    ZeroMemory(recvedBuf,1024);

    recvLen = recvfrom(pSocket->m_UDPSocket,recvBuf, 1024,0,(SOCKADDR*)&tmpAddr,&tmpRecvLen);

    if (recvLen == SOCKET_ERROR)

    {

     iErrorCode = WSAGetLastError();

     pSocket->m_OnUdpError(pSocket->m_pOwnerWnd,iErrorCode);

     break;

    }

    else if (recvLen == 0)

    {

     iErrorCode = WSAGetLastError();

     pSocket->m_OnUdpError(pSocket->m_pOwnerWnd,iErrorCode); 

     break;

    }

    

    else

    {

     //此处添加解析程序,将接收到的数据解析后,

                    pSocket->m_OnUdpRecv(pSocket->m_pOwnerWnd,recvBuf,recvedBufLen,(SOCKADDR*)&tmpAddr);

     delete []recvBuf;

     recvBuf = NULL;

     delete []recvedBuf;

     recvedBuf = NULL;

    }

    

   }



3.修改UDPDlg.cpp.CPP的OnUdpCERecv函数为:



 CUDPDlg * pDlg;

 pDlg = (CUDPDlg*)pWnd;

 CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT_RECVSTR);

 ASSERT(pRecvStrEdit != NULL);

 CString strRecv (buf);

 pRecvStrEdit->SetWindowText(strRecv);



4.删除UDP_CE.H,不是必须,但可以节省多余的代码

typedef struct CUDPData

{

 char  FrameHead[4]; //帧头

 DWORD DataPackageLen;  //帧长度

 char * Buf;     //缓冲区数据

    char FrameTail[4];   //帧尾

}UDPData;

还可以删除窗体上发送、接收数字的编辑框等,因为实际应用中用不上。

你可能感兴趣的:(编程,socket,mfc,出版,WinCE)