MFC中利用CSocket实现UDP通信

     这两天一直在找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);
}
原文地址:https://www.cnblogs.com/java20130722/p/3207156.html