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

TCP/UDP 雙模式聊天傳檔工具:含螢幕擷取、IP 解析與執行緒控制

     編輯:關於VC++

專案功能

  • TCP/UDP 切換聊天與傳檔
  • 即時切換監聽狀態(動態建立/銷毀執行緒)
  • 檔案傳輸(分塊讀寫、進度顯示)
  • 遠端螢幕擷取儲存為圖檔
  • 本機/對方 IP 與電腦名稱解析
  • 自動捲動 ListBox 訊息記錄

核心技術解析

1. TCP 監聽執行緒與優雅關閉

監聽執行緒 _ListenTcpThread 建立 Socket → Listen → Accept 接受連線 → 接收旗標判斷訊息/檔案/螢幕擷取 → 遞迴重啟監聽執行緒。關閉時透過連接 127.0.0.1 發送結束旗標 'D' 觸發執行緒退出:

UINT _ListenTcpThread(LPVOID lparam)
{
    CMyQQDlg* pDlg = (CMyQQDlg*)lparam;
    CSocket sockSrvr, recSo;
    SOCKADDR_IN client; int iAddrSize = sizeof(client);

    sockSrvr.Create(pDlg->m_Port);
    sockSrvr.Listen();
    sockSrvr.Accept(recSo, (SOCKADDR*)&client, &iAddrSize);
    sockSrvr.Close(); // 主監聽 Socket 關閉,交由 recSo 處理

    char flag[2]; recSo.Receive(flag, 2);
    pDlg->m_type = flag[0];
    if (pDlg->m_type == 'D') return 0; // 收到關閉指令

    pDlg->pThreadListen = AfxBeginThread(_ListenTcpThread, pDlg); // 重啟監聽
    pDlg->ReceiveFileMsg(recSo, client); // 處理檔案/訊息
    return 0;
}

// 關閉邏輯
if (m_nSockType == SOCK_TCP && pThreadListen)
{
    DWORD dwStatus;
    GetExitCodeThread(pThreadListen->m_hThread, &dwStatus);
    if (dwStatus == STILL_ACTIVE)
    {
        CSocket sockClient; sockClient.Create();
        sockClient.Connect("127.0.0.1", m_Port);
        sockClient.Send("D", 2); // 發送終止旗標
        sockClient.Close();
    }
}

2. 檔案傳輸核心迴圈

// 發送端
while (true) {
    UINT nRead = myFile.Read(buf, SIZE_FILE);
    if (nRead == 0) break;
    sockClient.Send(buf, nRead);
}

// 接收端
while (true) {
    int nRecv = recSo.Receive(buf, SIZE_FILE);
    if (nRecv == 0) break;
    file.Write(buf, nRecv);
}

3. 聊天訊息接收


else if (m_type == 'M') {
    char buff[100]; CString msg;
    while (recSo.Receive(buff, 100) > 0) msg += buff;
    CString ip = inet_ntoa(client.sin_addr);
    AddMsgList(ip + "<- " + GetNameByIp(ip), msg);
}

4. 螢幕擷取

採用標準 GDI 方案:GetDC(NULL) → CreateCompatibleDC → BitBlt → GetDIBits 存為 BMP。VC 知識庫範例眾多,此處不贅述。

測試環境

VC6 + Windows 2000 測試通過。原始碼含完整 UI 與錯誤處理邏輯。

原始碼下載

本文配套源碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved