📄 tcp.h
字号:
/* 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 10
#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 */
__packed 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 *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 *QUnacked; /* unacked packet queue */
struct SPacketQueue *QUnSend; /* packet need to be send */
struct SPacketQueue *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 ( * accept)(struct STCB *pNewTCB) ;
void ( * recv)(void * buf,WORD size) ;
void ( * close)(struct STCB * pSocket) ; /* when a opened connection closed */
}socket;
/* tcp queue */
struct SPacketQueue
{
struct SPacketQueue *pNext;
struct SPacketQueue *pPre;
DWORD Seq; /* sequence of this packet */
struct SMemHead *MemHead; /* packet store in MemHead' playload */
};
struct STCB *TCPGetTCB() ;
void TCPInsertTCB(struct STCB *pTCB) ;
void TCPAbort(struct STCB *pTCB) ;
struct SPacketQueue * TCPGetQ() ;
BOOL TCPInsertQ(struct SPacketQueue * *ppQ,struct SMemHead *MemHead,
DWORD Seq) ;
struct SPacketQueue * TCPOutQ(struct SPacketQueue * *ppQ) ;
void TCPInit() ;
WORD TCPCheckSum(struct SIPHead * pIPHead,WORD TCPSize) ;
void TCPTimer() ;
void TCPRelease(struct STCB *pTCB) ;
BOOL TCPSendSeg(struct STCB *pTCB,struct SMemHead *MemHead,BYTE TCPFlag) ;
BOOL TCPSendSegJudgeWnd(struct STCB *pTCB,struct SMemHead *MemHead) ;
BOOL TCPSendUnsendQ(struct STCB *pTCB) ;
void TCPRecvSeg(struct STCB *pTCB,struct SMemHead *MemHead) ;
void TCPInput(struct SMemHead *MemHead) ;
BOOL TCPSendEx(struct STCB * pTCB,struct SMemHead *MemHead) ;
BOOL TCPSend(struct STCB * pTCB,void *buf,WORD DataSize) ;
BOOL TCPConnect(struct STCB * pTCB, DWORD DestIP, WORD DestPort,
void ( * recv)(void * buf,WORD size) ,
void ( * close)(struct STCB * pSocket) ) ;
void TCPClose(struct STCB *pTCB) ;
BOOL TCPListen(struct STCB *pTCB,WORD ScrPort,void ( * accept)(struct STCB *pNewTCB) ) ;
struct STCB * TCPSocket(IP_ADDR ScrIP) ;
struct SMemHead *TCPAllocate(WORD size) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -