📄 gap.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 + -