HardBirch

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

时间:07-11-10 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:3 点击: 2,072 次

 


首先介绍一下,开发平台: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;

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

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: 在WINCE上实现UDP通信(100%可行!)

在WINCE上实现UDP通信(100%可行!):目前有3 条留言

  1. 看了大大牛人的个人专访,深深拜服,请受小弟膜拜。。。。

    2011-04-11 09:30 [回复]
  2. 板凳
    cleverlzc:

    好,

    2011-05-30 21:35 [回复]
  3. 沙发
    lulandy2008:

    正是我所需,谢谢共享

    2012-04-26 14:05 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐