专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

服务器端的收发线程函数

作者:佚名   来源:本站原创   点击数:  更新时间:2013年12月17日   【字体:


练习写套接字通信程序时候写的一段代码,本来想写个聊天室但写来写去进度卡在界面上接节下来都是通信部分的代码
因为只是试验用所以都是用C写的,等界面部分完工后会用类来封装一下
因为本人E文很烂所以变量和函数的命名是具有中国特色的,求理解.不过我注释的很详细了
谨以此文纪念我那坑爹的编程自学生涯......................
 
#include "shujubao.h"
#include "stdlib.h"
//定义线程共享全局变量用来协调线程进度
int M=0;    //指挥发送线程工作,为1则把fasjgd中的数据发送出去
struct SJGD fasjgd;  //数据发送完后把M置0
/////////////////////////////////////////////////////////////////////////////////////////
//接收线程函数
DWORD WINAPI JieXC (LPVOID jie)
{
 ////////////////////////////////////////
 SOCKET callsock=INVALID_SOCKET;
 callsock=(SOCKET)jie;
 char data[SZBAO];  //接收缓冲区
 struct SJGD sjgd; //标准数据包存放管道
    sjgd.sjcd=SZBAO;
 struct SJB sjb; //封包结构体
 HANDLE File;  //文本句柄
 DWORD szfile;
 /////////////////////////////////////////////////
    while (1)
 {
  recv(callsock,data,SZBAO,0); //接收一个标准数据包错误数据包丢弃不处理
        char_byte(data,&sjgd,1,SZBAO); //对缓冲区进行强制类型转换不转换的话解包会出错
  ZeroMemory(data,SZBAO);  //清零接收缓冲区
        if(Jiebao(&sjgd,&sjb))  //如果是标准数据包的话就进行功能判断和处理
  {
          switch(sjb.data.msg_stoc.cmd)
    {
              case CMD_GUANGJI:
              //关机功能
              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包顺序标号为1的包的附加数据为文件名创建文件
              //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);
     //进入文件接收循环
     while(sjb.tou.sxid!=0)
     {
                recv(callsock,data,SZBAO,0); //接收一个标准数据包错误数据包丢弃不处理
                char_byte(data,&sjgd,1,SZBAO); //对缓冲区进行强制类型转换不转换的话解包会出错
                if(Jiebao(&sjgd,&sjb))
    {
                 WriteFile(File,(char*)sjb.data.msg_stoc.shuju,sjb.data.msg_stoc.sjbcd,&szfile,NULL);
    }
     }
     CloseHandle(File);
     ////////////////////////////////////////////////////////////////
     char sz[]="文件已经接收成功!";
     MoveMemory(fasjgd.sjgd,sz,sizeof(sz));
     fasjgd.sjcd=sizeof(sz);
              Fengbao(1,CMD_QQ,1,&fasjgd,&sjb);    //给控制端发一个文件接收成功消息数据包
     Fabao(&sjb,&fasjgd);
     M=1;
     /////////////////////////////////////////////////////////////////
     break;
     //////////////////////////////////////////////////////////////////////////////////////////////
    }
  }
 }
 /////////////////////////////////////////////////
 return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//发送线程函数
//工作流程是功能函数把各种数据包风包好后发送到fasjgd并把M置1,发送线程开始发包成功后把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;
}
///////////////////////////////////////////////////////////////////////////////////////////
 

关闭窗口

相关文章