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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM