這兩天一直在找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); }