⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gap.h

📁 这是一本学习 window编程的很好的参考教材
💻 H
字号:
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <stdio.h>

#include <stdarg.h>
#include <time.h>
#include <Winsock2.h>
#define HAVE_REMOTE
#include <pcap.h>


#define	QUEUE_LEN	150
#define MIN_WINDOW	QUEUE_LEN / 2
#define	HEAD_LEN	16
#ifdef TOFILE
#define	FILE_HEAD	12
#else
#define	FILE_HEAD	0
#endif
#define	FLAG_LEN	4
#define	FRAME_LEN	1500
#define	DATA_LEN	FRAME_LEN - HEAD_LEN - FILE_HEAD
#define	MAX		65536
#define MIN_LEN		46
#define	TIMEOUT		1
#define PASSWORD	0x79b9
#define	SOURCE		0xb7e1






#define	EMPTY		0	/* 状态值,如果为0,表明队列中该列空间可用,这些状态包括:*/
#define	NOSEND		1	/* 1原本为空,2发送队列中已被确认的帧,3接收队列中已被应用层读走的帧 */
#define	SENT		2
#define	ACK		0
#define	NOREAD		3
#define	READ		0

#define	BEGIN		0	/* GLBSTATE */
#define	SENDHELLO	1
#define	RECVHELLO	2
#define	SENDRSP		4
#define RECVRSP		8
#define FINISH		15
#define RUNNING		16
#define	HELLO		2	/* sign in packet */
#define	RSP		8	/* sign in packet */

#define  FILE_HEADER_FLAG 0x0001
#define  FILE_BODY_FLAG 0x0002
#define  FILE_TAILER_FLAG 0x0003
#define  MESSAGE_FLAG 0x0004
#define  FILE_FOLDER_FLAG 0x0005
#define  FILE_INIT_FLAG   0x0006
#define  FILE_END_FLAG   0x0007
struct FILE_HEADER{

	DWORD dwFileHash;
	
	DWORD dwFileLen;
	char szFileName[MAX_PATH];
};
struct FILE_TAILER{
	DWORD dwFileHash;
	
	DWORD dwFileLen;
	DWORD dwEndFlag;

};
struct FILE_BODY{
	DWORD dwFileHash;
	DWORD dwFilePos;
	DWORD dwBlockSize;
	BYTE byData[DATA_LEN-28];
};
struct FILE_FOLDER{
	DWORD dwIP;
	DWORD dwFilePathLen;
	TCHAR szFilePath[MAX_PATH+1];

};
struct FILE_INFO{
	DWORD dwIP;
	TCHAR szComputerName[256];
	TCHAR szDstFilePath[MAX_PATH+1];

};
typedef struct tagPacketInfo
{
	DWORD dwFlag;   //数据块的标志
	DWORD dwLen;    //Union 数据的长度

	DWORD ID;       //会话表示
	
	union
	{
		FILE_HEADER fh;
		FILE_BODY   fb;
		FILE_TAILER ft;
		FILE_FOLDER ff;
		FILE_INFO   fi;
		char szMessage[DATA_LEN-12];
	};
}PacketInfo,*pPacketInfo;



typedef struct
{
	unsigned char	flag[4];	/* 验证 */
	unsigned char	no;		/* 该通道的标记(编号) */
	unsigned char	id[2];		/* 该包的ID号 */
	unsigned char	window;		/* 向对方通报自己窗口的大小 */
	unsigned char	sign;		/* 标志位,比如,请求重发等 */
	unsigned char	ack[2];		/* 反馈信息,为一ID号,表示该ID号之前的包都已收到 */
	unsigned char	length[2];	/* 长度,不包括首部 */
	unsigned char	cflag;
	unsigned char	length2[2];


	
	unsigned char	data[ DATA_LEN ];
}Frame;

typedef struct
{
	unsigned char	state;
	unsigned char	times;
	Frame		frame;
}Queue;

/* global variable */
static Queue output_queue[ QUEUE_LEN ];		/* 发送队列 */
static Queue input_queue[ QUEUE_LEN ];		/* 接收队列 */
static char	input_fifo[ 128 ];
static char	output_fifo[ 128 ];
static char	recv_device[ 128 ];
static char	send_device[ 128 ];

static unsigned char	GLBSTATE = BEGIN;

static Queue	*input_in = input_queue;	/* 从以太接收数据,添加到接收队列的指针 */
static Queue	*input_out = input_queue;	/* 应用层从接收队列读取数据的指针 */
static Queue	*output_in = output_queue;	/* 从应用层接收数据,添加到发送队列的指针 */
static Queue	*output_out = output_queue;	/* 以太发送线程从发送队列读取数据的指针 */
static Queue	*output_acked = output_queue;	/* 指向发送队列中最后一个被确认的包 */

static unsigned short	ack = 0;		/* 即将发送给对方的ack值,表示id号小于等于ack的都已收到 */
static unsigned short	sentack = 0;		/* 已经发送过的ack */
static unsigned short	acked = 0;		/* 自己收到的ack值,表示id号小于等于ack的都已被确认 */
static unsigned short	sentid = 0;		/* 刚刚发送的那一个包的id号 */
static unsigned char	my_window = QUEUE_LEN;	/* 自己的窗口大小 */
static unsigned char	opp_window = QUEUE_LEN;	/* 对方的窗口大小 */
static unsigned char	sentwindow = QUEUE_LEN; 	/* 已经发送过的window */

static unsigned short	counter = 1;		/* id号计数器 */
static unsigned char	waitinginput = 0;	/* 如果输入线程正在等待输入,该值赋1 */
static unsigned char	waitingoutput = 0;	/* 如果输出线程正在等待输出,该值赋1 */
static unsigned char	waitingsend = 0;	/* 如果发送线程正在等信息,该值赋1 */
static unsigned char	hellonum = 0;

static unsigned char	myno = 0;		/* 该通道的编号 */
static unsigned char	oppno = 1;		/* 对方通道的编号 */

int 	inputfd, outputfd;

CRITICAL_SECTION		lock_mywd, lock_oppwd, lock_outputout;   /* 不可对my_window 和 opp_window 同时进行写操作 */
CRITICAL_SECTION		lock_input, lock_output, lock_send;
HANDLE		input_ok, output_ok, send_ok;

HANDLE		input_id, send_id, recv_id, output_id;

static unsigned long int resendpackets = 0;
static unsigned char	iofilename[128];


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -