1. 程式人生 > >MFC中利用CSocket實現UDP通訊

MFC中利用CSocket實現UDP通訊

     原始碼請到此處下載。 基本介面如下:

                   

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