MFC中利⽤CSocket实现UDP通信
这两天⼀直在MFC下⽤CSocket实现UDP通信,尝试了⽹上不少的资料都没有成功,可能是⾃⼰在什么地⽅出错了。最后参考顺利实现了。⾃⼰也顺便作⼀些总结,希望可以利⼈利⼰。
源代码请到下载。基本界⾯如下:
UDP通信时双⽅地位是对等的,不⽤像TCP那样要在服务器端设置⼀个监听Socket。
第⼀步:调⽤在本机上创建⼀个Socket。
实例中⽤到:m_pSocket->Create(m_localPortNum, SOCK_DGRAM);其中m_localPortNum代表创建的Socket关联到本机上的端⼝号, SOCK_DGRAM代表是UDP通信。
第⼆步:调⽤让新创建的Socket与远程主机的指定端⼝通信。
实例中⽤到:m_pSocket->Bind(m_peerPortNum, m_strPeerIPaddr);其中m_peerPortNum是远程主机中UDP通信的端⼝
号, m_strPeerIPaddr代表远程主机的IP地址。
UDP通信的双⽅通过第⼀步和第⼆步,就知道信息该发送到哪个IP地址和端⼝号了,接下来该实际发送数据了。
第三步:准备好数据调⽤,将数据发送到远程主机上。
实例中⽤到: m_pSocket->SendTo(m_dataToSend, m_dataToSend.GetLength(), m_peerPortNum, m_strPeerIPaddr);其中第⼀个参数指定了要发送的数据,第⼆个参数指定了发送数据的长度,第三个参数指定了远程主机的端⼝号,第四个参数指定了远程主机IP地址。
第四步:数据接收⽅会⾃动启⽤来响应,只需在OnReceive函数中调⽤ReceiveFrom函数来读取数据即可。实例中改写了CUdpSocket类的OnReceive,⽬的就是调⽤AfxMessgeBox显⽰接受到数据。
socket通信为什么要指定端口void CUdpSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
TCHAR recBuf[1024];
int len = sizeof(SOCKADDR_IN);
ZeroMemory(recBuf, sizeof(recBuf));
int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0);
if (0 == recBytes)
{
AfxMessageBox(TEXT("UDP连接已经关闭!"));
}
else if (SOCKET_ERROR == recBytes)
{
AfxMessageBox(TEXT("接受数据失败!"));
}
else
{
CString strBuf;
strBuf.Format(TEXT("收到数据: %s"), recBuf);
AfxMessageBox(strBuf, MB_OK);
}
CSocket::OnReceive(nErrorCode);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论