程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 一個TCP和UPD聊天、傳收文件程序

一個TCP和UPD聊天、傳收文件程序

編輯:關於VC++

摘要:

本文通過例子,介紹了如何在局域網中進行聊天、互發文件以及抓取對方屏幕保存為文件。程序還包括了取得本機和對方的IP、計算機名稱。滾動ListBox控件等功能本人初次發表文章只是想起拋磚引玉之功效,其中錯誤在所難免,請各位看客別拿瓜皮丟我,謝謝。

運行界面如下:

一、 啟動終止監聽線程(只介紹TCP)

由於此程序可以即時切換狀態,因此需要結束仍處於接受狀態的線程。

//TCP監聽線程UINT _ListenTcpThread(LPVOID lparam)
{
  CMyQQDlg *pDlg=(CMyQQDlg *)lparam;
  CSocket sockSrvr;
  pDlg->m_Potr=PORT+pDlg->m_server;//保存當前使用端口,用於關閉
  int createSucceed=sockSrvr.Create(pDlg->m_Potr);
  int listenSucceed=sockSrvr.Listen();  //開始監聽
  CSocket recSo;
  SOCKADDR_IN client;
  int iAddrSize=sizeof(client);
  int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize);  //接受連接並取得對方IP
  sockSrvr.Close();
  char flag[FLAG]={0}; //接受標示,用於判斷接受到的是信息,文件等
  if(recSo.Receive(flag,FLAG)!=2)
  {
    return -1;
  }
  pDlg->m_type=flag[0];
  if(pDlg->m_type==''D'') return 0;//終止此線程
  pThreadLisen=::AfxBeginThread(_ListenTcpThread,pDlg);
  pDlg->ReceiveFileMsg(recSo,client);
  return 0;
}
關閉if(m_nSockType==SOCK_TCP)
{
  DWORD  dwStatus;
  if (pThreadLisen != NULL)
  {
    if(::GetExitCodeThread(pThreadLisen->m_hThread, &dwStatus)==0)
    {
      int errror=GetLastError();
      return;
    }
    if (dwStatus == STILL_ACTIVE)
    {
      CSocket sockClient;
      sockClient.Create();
      CString ip,strError;
      ip="127.0.0.1";
      int conn=sockClient.Connect(ip, m_Potr);
      if(conn==0)  
      {
        AfxMessageBox("關閉錯誤!"+GetError(GetLastError()));
        sockClient.ShutDown(2);
        sockClient.Close();
        return;
      }
      sockClient.Send("D",FLAG); //結束
    }
}

二.發送、接受文件。比較簡單,參看源程序。 發送

for(;;)
{
  num=myFile.Read(m_buf, SIZEFILE);
  if(num==0) break;//讀文件完畢
  end=sockClient.Send(m_buf, num);
}
接受for(;;)
{
  n=recSo.Receive(buf,SIZEFILE);  //接受
  if(n==0)  break;  //0表示結束
  f.Write(buf,n);
}

三、聊天請參看源程序

else if(m_type==''M'')  //信息
{
  char buff[100]={0};
  CString msg;
  int ret=0;
  for(;;)
  {
    ret=recSo.Receive(buff,100);
    if(ret==0)
      break;
    msg+=buff;
  }
  CString strOut,strIn;
  m_You_IP.GetWindowText(strIn);
  GetNamebyAddress(strIn,strOut);
  CString youName;
  youName.Format(inet_ntoa(client.sin_addr));
  CString str=youName+"<-"+strOut;
  AddMsgList(str,msg);
}

四、抓屏,VC知識庫上例子很多,不詳細介紹了。在VC6+Win2000上測試過。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved