WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。Windows CE作业系统是Windows家族中的成员,专门设计给掌上型电脑(HPCs)所使用的电脑环境。这样的作业系统可使完整的可携式技术与现有的Windows桌面技术整合工作。 Windows CE 被设计成针对小型设备(它是典型的拥有有限内存的无磁盘系统)的通用操作系统,Windows CE 可以通过设计一层位于内核和硬件之间代码来用设定硬件平台,这即是众所周知的硬件抽象层(HAL)(在以前解释时,这被称为 OEMC (原始设备制造)适应层,即 OAL; 内核压缩层,即 KAL. 以免与微软的 Windows NT 操作系统 HAL 混淆) .
首先介绍一下,开发平台:WINCE 4.2 (WINCE 5.0也适用,因为使用了静态编译MFC动态链接库);开发工具:VS2005.
接下来开始修改代码:
view plaincopy to clipboardprint?
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;
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;还可以删除窗体上发送、接收数字的编辑框等,因为实际应用中用不上。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。