圖書管理系統:客戶端 → 服務端 (業務邏輯) → 資料庫伺服器。服務端查詢後將記錄集序列化為 XML,包裝成 SOAP 訊息經 Socket 回傳客戶端解析顯示。
// 1. 取得記錄集總筆數
int maxRows = 0;
while(!pRs->EndOfFile) { maxRows++; pRs->MoveNext(); }
pRs->MoveFirst();
int nFields = pRs->Fields->GetCount();
// 2. 使用 CMarkup 建立 XML
CMarkup xml;
xml.SetDoc(_T(""));
xml.AddElem(_T("RESULT"));
for(int i=0; iFields->GetItem(k)->GetName();
_bstr_t val = pRs->Fields->GetItem(k)->GetValue();
xml.AddChildElem((LPCTSTR)name, (LPCTSTR)val);
}
xml.OutOfElem(); pRs->MoveNext();
}
xml.Save(_T("Temp.xml"));
// 3. 讀檔並 Socket 發送
CFile file; file.Open(_T("Temp.xml"), CFile::modeRead|CFile::typeBinary);
BYTE buf[64*1024]; memset(buf,0,sizeof(buf));
file.ReadHuge(buf, file.GetLength());
send(m_clientSock[i], (char*)buf, file.GetLength()+1, 0);
file.Close();
// 1. 接收資料存檔
CFile file;
file.Open(_T("Temp.xml"), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
file.WriteHuge(recvBuf, strlen(recvBuf));
file.Flush(); file.Close();
// 2. 載入並解析
CMarkup xml;
if(!xml.Load(_T("Temp.xml"))) { AfxMessageBox(_T("XML 載入失敗")); return; }
xml.ResetMainPos();
int item = 0;
while(xml.FindChildElem(_T("BOOK"))) {
xml.IntoElem();
m_listCtrl.InsertItem(item, _T(""), 0);
CString idx; idx.Format(_T("%d"), item+1);
m_listCtrl.SetItemText(item, 0, idx);
int sub = 0;
while(xml.FindChildElem()) {
xml.IntoElem();
CString val = xml.GetData();
m_listCtrl.SetItemText(item, sub+1, val);
xml.OutOfElem();
sub++;
}
item++;
xml.OutOfElem(); // 回到 RESULT
}
<RESULT> 根節點,實際專案可補全標準 SOAP 結構WSAAsyncSelect/IOCP) 提升併發