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);
}
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值