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显示接受到数据。

  1. void CUdpSocket::OnReceive(int nErrorCode)   
  2. {  
  3.     // TODO: Add your specialized code here and/or call the base class  
  4.       
  5.     TCHAR recBuf[1024];  
  6.     int len = sizeof(SOCKADDR_IN);  
  7.   
  8.     ZeroMemory(recBuf, sizeof(recBuf));  
  9.   
  10.     int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0);  
  11.   
  12.     if (0 == recBytes)  
  13.     {  
  14.         AfxMessageBox(TEXT("UDP连接已经关闭!"));  
  15.     }  
  16.     else if (SOCKET_ERROR == recBytes)  
  17.     {  
  18.         AfxMessageBox(TEXT("接受数据失败!"));  
  19.     }  
  20.     else  
  21.     {  
  22.         CString strBuf;  
  23.         strBuf.Format(TEXT("收到数据: %s"),  recBuf);  
  24.         AfxMessageBox(strBuf, MB_OK);         
  25.     }  
  26.   
  27.     CSocket::OnReceive(nErrorCode);  
  28. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值