http://blog.csdn.net/zhang_hui_cs/article/details/7550706
这两天一直在找MFC下用CSocket实现UDP通信,尝试了网上不少的资料都没有成功,可能是自己在什么地方出错了。最后参考http://www.cnblogs.com/nuaa/archive/2011/12/22/2298495.html顺利实现了。自己也顺便作一些总结,希望可以利人利己。
源代码请到此处下载。 基本界面如下:
UDP通信时双方地位是对等的,不用像TCP那样要在服务器端设置一个监听Socket。
第一步:调用Create函数在本机上创建一个Socket。
实例中用到:m_pSocket->Create(m_localPortNum, SOCK_DGRAM);其中m_localPortNum代表创建的Socket关联到本机上的端口号, SOCK_DGRAM代表是UDP通信。
第二步:调用Bind函数让新创建的Socket与远程主机的指定端口通信。
实例中用到:m_pSocket->Bind(m_peerPortNum, m_strPeerIPaddr);其中m_peerPortNum是远程主机中UDP通信的端口号, m_strPeerIPaddr代表远程主机的IP地址。
UDP通信的双方通过第一步和第二步,就知道信息该发送到哪个IP地址和端口号了,接下来该实际发送数据了。
第三步:准备好数据调用SendTo函数,将数据发送到远程主机上。
实例中用到: m_pSocket->SendTo(m_dataToSend, m_dataToSend.GetLength(), m_peerPortNum, m_strPeerIPaddr);其中第一个参数指定了要发送的数据,第二个参数指定了发送数据的长度,第三个参数指定了远程主机的端口号,第四个参数指定了远程主机IP地址。
第四步:数据接收方会自动启用OnReceive函数来响应,只需在OnReceive函数中调用ReceiveFrom函数来读取数据即可。实例中改写了CUdpSocket类的OnReceive,目的就是调用AfxMessgeBox显示接受到数据。
- 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);
- }