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

📄 tcp.h

📁 51单片机实现网页显示功能
💻 H
字号:
/*
 * Copyright (c) 2003 Electric Application Laboratory of NAN KAI University
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 *
 * Author: Li Zhanglin <http://www.zlmcu.com>
 *
 */

/* tcp */

#define TCP_SEQ_COMPARE(seq1,seq2)	(SDWORD)(seq1 - seq2)	/* the compare will be less than 0, so set it as singed */
#define TCP_HEAD_LEN(pTCPHead)		(((pTCPHead->TCPHeadLen & 0xf0)>>4)*4)
#define TCP_DEFAULT_PORT			1001
#define TCP_CONNECTION_MAX_NUM		30 //////
#define TCP_QUEUE_MAX_NUM			100
#define TCP_HEAD_MIN_LEN			20
#define TCP_RETRAN_MAX_TIME			6
#define TCP_RETRAN_TIME_OUT			20
#define TCP_DELAY_ACK_TIME_OUT		1
#define TCP_LASTACK_TIME_OUT		40

#define ALL_HEAD_SIZE	(TCP_HEAD_MIN_LEN + IP_HEAD_MIN_LEN + NETIF_HEAD_MAX_LEN)
/* tcp flag */
#define TCP_URG 0x20
#define TCP_ACK 0x10
#define TCP_PSH 0x08
#define TCP_RST 0x04
#define TCP_SYN 0x02
#define TCP_FIN 0x01

/* tcp state */
#define TCP_STATE_CLOSED	0
#define TCP_STATE_LASTACK	1
#define	TCP_STATE_TIMEWAIT	2
#define TCP_STATE_LISTEN	3
#define TCP_STATE_SYNRECVD	4
#define TCP_STATE_SYNSENT	5
#define TCP_STATE_ESTABLISHED	6
#define TCP_STATE_CLOSEWAIT	7
#define TCP_STATE_FINWAIT1	8
#define TCP_STATE_CLOSING	9
#define TCP_STATE_FINWAIT2	10


/* tcp header */
struct STCPHead
{
	WORD PortScr;	/* 16 bits */
	WORD PortDest;
	DWORD Seq;
	DWORD AckSeq;
	BYTE TCPHeadLen;	/* 8 bits, use high 4 bits */
	BYTE flag;			/* reserve 2 bits, urg, ack, psh, rst, syn, fin */
	WORD WndSize;		/* 16 bits */
	WORD CheckSum;		/* 16 bits */
	WORD UrgentPoint;	/* 16 bits */
}; 

/* tcb (transmit control block). used to keep tcp state 
information */
typedef struct STCB
{
	struct STCB DT_XDATA *pNext;   /* Next Node */

	BYTE	TCPState;

	/* conection idetifies */
	WORD	PortScr;
	WORD	PortDest;
	IP_ADDR	IPScr;
	IP_ADDR IPDest;

	DWORD	SeqMine;
	DWORD	SeqHis;		/* the sequence want to receive from
						also is AckSeq in out going packet */

	WORD	WndMine;
	WORD	WndHis;
	
	/* queues */
	struct SPacketQueue DT_XDATA *QUnacked;		/* unacked packet queue */
	struct SPacketQueue DT_XDATA *QUnSend;		/* packet need to be send */
	struct SPacketQueue DT_XDATA *QExceedSeq;	/* receive packet whoes 
										seq exceed the SeqHis */

	WORD	RetranTimer;			/* if it hit 0, indicate the 
									first unit in QUnacked is time 
									out */
	BYTE	RetranTimes;			/* retransmit time of a same 
									packet, if it exceed a sreshold
									. the connection go to colse */
	BOOL	bNeedAck;				/* we need send ack to him */
	WORD	DelayAckTimer;			/* if bNeedAck == TRUE, we delaye
									for DELAY_ACK_TIME_OUT to send ack
									*/
	WORD	LastAckTimer;			/* when in TCP_STATE_LASTACK a timer
									is started. when it out, transfer to 
									TCP_CLOSED state */
	/* call back functions */
	void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL;
	void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL;
	void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL;				/* when a opened connection closed */
}socket;

/* tcp queue */
struct SPacketQueue
{
	struct SPacketQueue DT_XDATA *pNext;
	struct SPacketQueue DT_XDATA *pPre;
	DWORD	Seq;				/* sequence of this packet */
	struct SMemHead DT_XDATA *MemHead;	/* packet store in MemHead' playload */
};

struct STCB DT_XDATA *TCPGetTCB() REENTRANT_SIG;
void TCPInsertTCB(struct STCB DT_XDATA *pTCB) REENTRANT_SIG;
void TCPAbort(struct STCB DT_XDATA *pTCB) REENTRANT_SIG;
struct SPacketQueue DT_XDATA * TCPGetQ() REENTRANT_SIG;
BOOL TCPInsertQ(struct SPacketQueue DT_XDATA * DT_XDATA *ppQ,struct SMemHead DT_XDATA *MemHead,
				DWORD Seq) REENTRANT_SIG;
struct SPacketQueue DT_XDATA * TCPOutQ(struct SPacketQueue DT_XDATA * DT_XDATA *ppQ) REENTRANT_SIG;

void TCPInit() REENTRANT_MUL;
WORD TCPCheckSum(struct SIPHead DT_XDATA * pIPHead,WORD TCPSize) REENTRANT_SIG;
void TCPTimer() REENTRANT_MUL;
void TCPRelease(struct STCB DT_XDATA *pTCB) REENTRANT_SIG;
BOOL TCPSendSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead,BYTE TCPFlag) REENTRANT_SIG;
BOOL TCPSendSegJudgeWnd(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL;
BOOL TCPSendUnsendQ(struct STCB DT_XDATA *pTCB) REENTRANT_MUL;
void TCPRecvSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG;
void TCPInput(struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG;

BOOL TCPSendEx(struct STCB DT_XDATA * pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL;
BOOL TCPSend(struct STCB DT_XDATA * pTCB,void DT_XDATA *buf,WORD DataSize) REENTRANT_MUL;
BOOL TCPConnect(struct STCB DT_XDATA * pTCB, DWORD DestIP, WORD DestPort,						
						void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL,
						void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL) REENTRANT_SIG;
void TCPClose(struct STCB DT_XDATA *pTCB) REENTRANT_MUL;
BOOL TCPListen(struct STCB DT_XDATA *pTCB,WORD ScrPort,void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL) REENTRANT_MUL;
struct STCB DT_XDATA * TCPSocket(IP_ADDR ScrIP) REENTRANT_SIG;
struct SMemHead DT_XDATA *TCPAllocate(WORD size) REENTRANT_SIG;














⌨️ 快捷键说明

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