首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

UDP 網路通訊範例:結構體封包傳送與 MFC 文檔/視圖架構接收繪圖

     編輯:關於VC++

架構概覽

兩個獨立程式:發送端 透過 UDP 發送結構體資料(圓心座標、半徑、顏色)→ 接收端 解析資料並在視圖類別中繪製圓形。

發送端核心代碼

struct CircleData {
    int x, y, r, color; // 固定長度,不可含 CString 等變長型別
};

void CFasonDlg::OnSend() {
    UpdateData(TRUE);
    CircleData data;
    data.x = m_x; data.y = m_y; data.r = m_r;
    // 顏色下拉選單對應
    CString str; m_Cob.GetLBText(m_Cob.GetCurSel(), str);
    if (str == L"Red") data.color = 1;
    else if (str == L"Green") data.color = 2;
    else if (str == L"Blue") data.color = 3;

    CAsyncSocket sock;
    sock.Create(2330, SOCK_DGRAM);
    sock.SendTo(&data, sizeof(data), 3550, L"127.0.0.1");
    sock.Close();
    UpdateData(FALSE);
}

接收端:非同步 Socket 回調

// CDASocket 繼承自 CAsyncSocket
void CDASocket::OnReceive(int nErrorCode) {
    char buf[256];
    int ret = Receive(buf, 256);
    if (ret != SOCKET_ERROR)
        m_pDoc->ProcessData(buf); // 轉交文檔處理
    CAsyncSocket::OnReceive(nErrorCode);
}

文檔處理資料並通知視圖更新

void CJieshouDoc::ProcessData(char* pBuf) {
    CircleData* pData = (CircleData*)pBuf;
    m_circle = *pData; // 複製到文檔成員
    UpdateAllViews(nullptr); // 觸發視圖重繪
}

視圖繪製

void CJieshouView::OnDraw(CDC* pDC) {
    CJieshouDoc* pDoc = GetDocument();
    CBrush brush;
    switch (pDoc->m_circle.color) {
        case 1: brush.CreateSolidBrush(RGB(255,0,0)); break;
        case 2: brush.CreateSolidBrush(RGB(0,255,0)); break;
        case 3: brush.CreateSolidBrush(RGB(0,0,255)); break;
    }
    CBrush* pOld = pDC->SelectObject(&brush);
    pDC->Ellipse(pDoc->m_circle.x - pDoc->m_circle.r,
                 pDoc->m_circle.y - pDoc->m_circle.r,
                 pDoc->m_circle.x + pDoc->m_circle.r,
                 pDoc->m_circle.y + pDoc->m_circle.r);
    pDC->SelectObject(pOld);
}

設計重點

  • 結構體封包:單次 SendTo 傳輸完整資料,避免封包碎片
  • 文檔/視圖分離:資料處理在 Document,繪圖在 View,符合 MFC 架構
  • UDP 無連線:適合即時性要求高、可容忍丟包的簡單場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved