為實現異地對人工氣候室溫度的實時監控,採用 Client/Server 架構:現場工控機(Server)連接傳感器,通過局域網/廣域網將溫度數據發送給遠程客戶端(Client),客戶端繪製實時曲線。要求低成本、高效率、實時性好。
listen 狀態。connect 連接 Server IP:Port。accept 返回新 Socket,雙方確認連接成功。WavePlay) 繪製實時波形,延遲極低。// 啟動監聽
void CServerView::OnStart() {
m_Start.EnableWindow(FALSE);
try {
// 數據傳輸 UDP Socket
g_sListen.Create(6802, SOCK_DGRAM, NULL);
g_sListen.Bind(6802, m_IP);
g_sListen.Listen(); // UDP 實為綁定後直接收發
// 聊天室 TCP 監聽
g_pChatListen = new CChatListenSocket(this);
g_pChatListen->Create(9999, SOCK_STREAM);
g_pChatListen->Listen();
SetDlgItemText(IDC_RESPONSE, _T("開始對客戶端服務!"));
} catch (CException* e) {
e->ReportError(); e->Delete();
}
}
void CClientView::OnDataReceive() {
char szRecv[20];
CString strIP = m_IP; // Server IP
UINT uPort = 6802;
int nRecv = m_sockRecv.ReceiveFrom(szRecv, 10, strIP, uPort, 0);
if (nRecv <= 0) return;
szRecv[nRecv] = '\0';
// 顯示原始數據
m_listBox.AddString(szRecv);
m_listBox.SetCurSel(m_listBox.GetCount()-1);
// 計算相對時間(秒)
SYSTEMTIME st; GetLocalTime(&st);
CTime now(st), start(m_StartTime);
double seconds = (now - start).GetTotalSeconds();
// 繪製曲線點 (ActiveX 控件)
m_WavePlay.SetPoint2(seconds, atoi(szRecv));
}
項目已在韶關醫療器械廠生物培養項目投入使用,區域局域網內穩定運行。測試顯示:數據傳輸滯後 < 200ms,曲線平滑,長時間運行無內存洩漏。
Winsock 為基礎網絡編程提供了靈活的 Socket 接口。本項目通過「UDP 數據流 + TCP 控制流」混合模式,結合輕量級 ActiveX 繪圖,以極低成本實現了工業級遠程實時監控。未來可遷移至 IOCP/過載完成端口 模式支撐更大規模併發,或引入 TLS 加密提升安全性。