MFC中利用CSocket實現UDP通訊
阿新 • • 發佈:2019-02-08
原始碼請到此處下載。 基本介面如下:
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);
UDP通訊的雙方通過第一步和第二步,就知道資訊該傳送到哪個IP地址和埠號了,接下來該實際傳送資料了。
第三步:準備好資料呼叫SendTo函式,將資料傳送到遠端主機上。
例項中用到: m_pSocket->SendTo(m_dataToSend, m_dataToSend.GetLength(), m_peerPortNum, m_strPeerIPaddr);其中第一個引數指定了要傳送的資料,第二個引數指定了傳送資料的長度,第三個引數指定了遠端主機的埠號,
第四步:資料接收方會自動啟用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); }