?? tcpip.h
字號:
// TCP標識 TcpHdr_Stru.HdrLen 代表TCP頭長度,以32bit(4 byte)為單位
#define cTCP_HDR_NOOPT 0x05 // TCP頭無操作選項
#define cTCP_HDR_OPT 0x07 // TCP頭有操作選項,操作選項長度4 word 或8 byte
// TCP標識 TcpHdr_Stru.Flags
#define cTCP_FIN 0x01
#define cTCP_SYN 0x02
#define cTCP_RST 0x04
#define cTCP_PSH 0x08
#define cTCP_ACK 0x10
#define cTCP_URG 0x20
UINT16 WndSize; // 窗口大小,表明接還能容納的TCP數據(最大0xFFFF)
#define cTCP_WS 1460 // 定義本地窗口,必須滿足條件:cTCP_MSS <= cTCP_MSS <= 0xFFFF
UINT16 TcpChkSum;
UINT16 UrgPoint; // 緊急指針
// UINT16 OptData[2];
// 最長TCP報文大小(頭選項之一):字節(最大1460)
#define cTCP_MSS 1460 // 定義本地最大TCP報文長度
}TcpHdr_Stru;
// TCP 本地初始32位序號
extern volatile UINT16 guwISN[2];
// TCP頭的常數指針。
#define cpTcpHdrBuf ((UINT16 *)&guwEthBuf[cEthHdrLen + cIpHdrLen]) // 指向Word的buffer
#define cptTcpHdrBuf ((TcpHdr_Stru *)&guwEthBuf[cEthHdrLen + cIpHdrLen]) // 指向結構
// TCP數據段指針
#define cpTcpData ((UINT16 *)&guwEthBuf[cEthHdrLen + cIpHdrLen + cTcpHdrLen]) // 指向Word的buffer
//---------------------------------------------------------------------------------
// ARP表結構
typedef struct{
UINT16 IpAddr[2];
UINT16 EthAddr[3];
UINT16 Time2; // 刷新時刻,2Hz的計數
// ARP表記錄的最大老化清除時間:20分鐘(4.4BSD-Lite 默認)。
#define cArpMaxAge 20*60
}ArpEntries_Stru;
// 最大ARP表記錄數
#define cArpTabSize 16
// 分配ARP鏈表的內存
extern ArpEntries_Stru gstArpTab[cArpTabSize];
// ARP表記錄的地址
#define cptArpTabStart ((ArpEntries_Stru *)&gstArpTab[0]) // 指向結構,開始地址指針
#define cptArpTabEnd ((ArpEntries_Stru *)&gstArpTab[cArpTabSize]) // 指向結構,結束地址指針
//---------------------------------------------------------------------------------
// TCP事務聯接狀態記錄結構
typedef struct{
UINT16 TcpStateFlags; // TCP狀態和標識
// TCP 事務狀態標識 Conn_Stru->TcpStateFlags
#define cTCP_CLOSED 0x00
#define cTCP_SYN_RCVD 0x01
#define cTCP_SYN_SENT 0x02
#define cTCP_ESTABLISHED 0x03
#define cTCP_FIN_WAIT_1 0x04
#define cTCP_FIN_WAIT_2 0x05
#define cTCP_CLOSING 0x06
#define cTCP_TIME_WAIT 0x07
#define cTCP_CLOSE_WAIT 0x08
#define cTCP_LAST_ACK 0x09
#define cTCP_TS_MASK 0x0f
#define cTCP_OUTSTANDING 0x10
#define cTCP_STOPPED 0x20
UINT16 LocalPort; // 本地端口
UINT16 RemotePort; // 遠端端口
UINT16 RemoteIpAddr[2]; // 遠端IP
UINT16 RcvNum[2]; // 下次接收包的遠端32位Seq序號
UINT16 AckNum[2]; // 下次接收包的遠端32位Ack序號
UINT16 SeqNum[2]; // 本地當前包32位Seq序號
UINT16 MaxSegSize; // 本連接事務使用的最長TCP報文大小,詳見TCP頭結構說明
UINT16 Timer; // 狀態需要等待的時間
UINT16 NumRetran; // 重傳次數
UINT16 PollTime; // 空閑時間計數
// 由于TCP事務輪詢時間為1秒,所以300秒空閑就異常終止當前連接。(WIN2K用900秒)
#define cTCP_MAX_POLL 300
}Conn_Stru;
// TCP最大聯接事務數。
#define cMaxConnetions 16
// 分配TCP最大聯接事務鏈表內存
extern Conn_Stru gstConns[cMaxConnetions];
// TCP最大聯接事務記錄表首地址
#define cptConnsStart ((Conn_Stru *)&gstConns[0]) // 指向結構
// TCP最大聯接事務記錄表結束地址
#define cptConnsEnd ((Conn_Stru *)&gstConns[cMaxConnetions]) // 指向結構
// 用于RTT估計器的重傳指數退避時間,公式: T = cTCP_RTO * 2^n (n表示第幾次重傳)
#define cTCP_RTO 3
// TCP超時關閉聯接的時間,即在TIME_WAIT狀態的聯接保持時間
#define cTCP_TIME_WAIT_2MSL 120 // 120 秒(因為TCP事務1秒輪詢1次)
// TCP最大重傳次數
#define cTCP_MAXRTX 3
// 本地TCP端口范圍
#define cLocalPortStart 4096 // 開始:0x1000
#define cLocalPortEnd 28672 // 結束:0x7000
// TCP最大偵聽端口數。除非作為Web服務器,否則通常為1
#define cMaxListenPorts 8 // 本應用允許偵聽端口
// 當前TCP事務聯接指針
extern Conn_Stru *gptConn;
// 分配TCP偵聽端口號鏈表內存
extern UINT16 guwListenPorts[cMaxListenPorts];
//---------------------------------------------------------------------------------
// 其它定義
// 正在處理包的字節長度(byte)。這個值隨處理正在處理的協議層的不同而改變!
extern volatile UINT16 guwEthLen;
// TCP/IP協議棧和應用程序間通訊的變量
extern volatile UINT16 guwFlags;
// 協議層通過guwFlags與應用層的聯系常數定義
#define cTCP_ACKDATA 0x01 // 上次發的數據已經被確認,通知應用程序可以發新的數據
#define cTCP_NEWDATA 0x02 // 遠端發給本地數據包,協議層需要ACK回應
#define cTCP_REXMIT 0x04 // 通知應用程序重發上次的數據包
#define cTCP_POLL 0x08 // 如果應用程序等待發數據,就給它一個標識POLL
#define cTCP_CLOSE 0x10 // 遠端已經關閉聯接,或應用程序要關閉聯接
#define cTCP_ABORT 0x20 // 遠端要放棄聯接,或應用程序要放棄聯接
#define cTCP_CONNECTED 0x40 // 聯接成功建立
#define cTCP_TIMEDOUT 0x80 // 超過重傳次數,放棄聯接
// cTCP_DATA:msip_Process()的入口參數,表示需要處理已經在guwEthBuf緩沖區的包。
// cTCP_TIMER:msip_Process()的入口參數,表示需要做周期性的TCP事務處理。
#define cTCP_DATA 1
#define cTCP_TIMER 2
//---------------------------------------------------------------------------------
// 以太收發功能
// ether_Send(): 發送以太包宏定義,兼容性定義
#define ether_Send() RTL8019AS_TX(guwEthLen, cpEthHdrBuf)
// ether_Receive(): 接收以太包宏定義,兼容性定義
#define ether_Receive() RTL8019AS_RX(cpEthHdrBuf)
//---------------------------------------------------------------------------------
// ARP 功能過程
// msip_Arp_Timer():ARP表老化掃描,每8秒執行1次(BSD default 10 seconds)
// 超過20分鐘(BSD default)未變化的,將被刪除!
extern void msip_Arp_Time(void);
// msip_Arp_Update():ARP表更新過程。
// uwIpAddr:IP地址
// uwEthAddr:物理地址
// 返回更新的ARP表的地址。如果地址在表外,說明更新失敗。
extern ArpEntries_Stru *msip_Arp_Update(UINT16 *uwIpAddr, UINT16 *uwEthAddr);
// msip_Arp_In():如果檢測到ARP包輸入就執行。
// 如果遠端ARP請求,過程發送ARP回應。
// 如果遠端ARP回應,過程更新ARP表。
extern void msip_Arp_In(void);
// msip_Arp_Out():將待發送的IP包封裝以太頭,并發送封裝好的以太包
// pARPTAB:指向ARP表中遠端IP和物理地址的影射表記錄地址
// 如果pARP是空指針,原IP包將被破壞,并且用ARP請求包替代發送。
extern void msip_Arp_Out(ArpEntries_Stru *pARPTAB);
//---------------------------------------------------------------------------------
// TCP/IP 功能:
// msip_TcpChkSum():TCP/IP校驗和過程。
extern UINT16 msip_TcpChkSum(void);
// msip_Process(): TCP/IP 全處理過程
// uwFlag:處理類型,見cTCP_DATA和cTCP_TIMER
// pConn:TCP事件指針
extern void msip_Process(UINT16 uwFlag);
// 系統接口類:
// msip_Init(): TCP/IP功能初始化,必須在其它TCP/IP處理前調用。包含ARP、被動偵聽端口和TCP事務連接
extern void msip_Init(void);
// msip_Periodic(): TCP/IP事務周期輪詢過程,1秒發生1次
extern void msip_Periodic(void);
// msip_Input(): 如果輸入的是IP包,接執行改過程。
#define msip_Input() msip_Process(cTCP_DATA)
// msip_APPCALL(): 供用戶寫TCP應用代碼的函數名。
#define userapp msip_APPCALL // 指向RS232應用
// 應用程序接口類:(應用層控制協議層狀態變遷)
// msip_Listen(): TCP/IP被動偵聽本地端口是否被占用!用于服務端
// uwPort:本地TCP端口
// 返回0:表示端口被用
// 返回1:表示建立成功
extern UINT16 msip_Listen(UINT16 uwPort);
// msip_Connect(): TCP/IP建立主動聯接遠端,用于客戶端
// uwLocalPort:本地TCP端口
// puwRemoteIpAddr:遠端IP地址
// uwRemotePort:遠端TCP端口
// 返回0:表示建立失敗
// 返回1:表示建立成功
#if TCP_ACTIVE_OPEN == 1
extern UINT16 msip_Connect(UINT16 uwLocalPort, UINT16 *puwRemoteIpAddr, UINT16 uwRemotePort);
#endif
// msip_Send():發送數據到當前的連接,保留的uIP定義,我們不用
#define msip_Send()
// msip_DataLen():當前TCP數據段的長度(Bytes),保留的uIP定義,我們不用
#define msip_DataLen() guwEthLen
// msip_Close(): 主動關閉當前連接,應用層通知協議層正常關閉當前連接(FIN)
#define msip_Close() (guwFlags = cTCP_CLOSE)
// msip_Abort():異常關閉當前連接,應用層通知協議層復位當前連接(RST)
#define msip_Abort() (guwFlags = cTCP_ABORT)
// msip_Stop(): 停止接收含TCP數據段的包,應用層通知協議層將窗口尺寸設置為0,期待遠端暫停發送帶數據的TCP包!
#define msip_Stop() (gptConn->TcpStateFlags |= cTCP_STOPPED)
// msip_Restart(): 重新開始當前的連接,應用層通知協議層重新開放窗口尺寸,以便允許遠端發送帶數據的TCP包!
#define msip_Restart() {guwFlags |= cTCP_NEWDATA; gptConn->TcpStateFlags &= ~cTCP_STOPPED;}
// 測試判斷接口類:(應用層查詢協議層狀態)
// msip_connected():
// 服務或服務都有效,表明當前連接建立成功!狀態只會出現一次!
// 在客戶模式可以傳TCP數據;服務模式最好不發送數據!
#define msip_Connected() (guwFlags & cTCP_CONNECTED)
// msip_Poll():
// 不論是服務或客戶,都表明協議層處于連接空閑狀態!標識由TCP事件輪詢傳回,在這個狀態下可設置
// 空閑計數器記錄空閑次數,達到一定時間就異常終止連接!如果這樣做,就不能在這個狀態發送數據!
// 允許發送數據的條件是:((guwEthLen > 0) || (guwFlags & cTCP_NEWDATA))
#define msip_Poll() (guwFlags & cTCP_POLL)
// msip_NewData():處于ESTABLELISH狀態
//(guwEthLen > 0)協議層收到遠端發出TCP數據包,并期待應用層處理:在這個狀態下,允許只
// 發送無TCP數據的ACK確認(設置:guwEthLen = 0),或者發送帶TCP數據的ACK確認(把要發送的
// TCP數據長度設置給guwEthLen)。
#define msip_NewData() (guwFlags & cTCP_NEWDATA)
// msip_Acked():處于ESTABLELISH狀態
//(guwEthLen = 0)協議層收到遠端發出ACK確認包。在這個狀態下,允許發送帶TCP數據的ACK
// 確認(把要發送的TCP數據長度設置給guwEthLen),或者不響應。
#define msip_Acked() (guwFlags & cTCP_ACKDATA)
// mip_Reset_Acked(): 清除確認后的標志,好象沒有用?!(也許用于重傳)
#define mip_Reset_Acked() (guwFlags &= ~cTCP_ACKDATA)
// msip_Rexmit(): 應用層上次的以發數據需要重傳,標識由TCP事件輪詢傳回!應用層不允許更改guwEthLen的值!!!
#define msip_Rexmit() (guwFlags & cTCP_REXMIT)
// msip_Stopped(): 當前連接已經停止接收含TCP數據段的包,連接是正常的。
#define msip_Stopped() (gptConn->TcpStateFlags & cTCP_STOPPED)
// msip_Aborted(): 當前連接已經異常關閉,協議層發送RST復位包。
#define msip_Aborted() (guwFlags & cTCP_ABORT)
// msip_Closed(): 當前連接已經正常關閉,應用層發送FIN包
#define msip_Closed() (guwFlags & cTCP_CLOSE)
// msip_TimedOut(): 當前連接時間溢出,并且連接因時間溢出異常關閉,協議層發送RST復位包。
#define msip_TimedOut() (guwFlags & cTCP_TIMEDOUT)
// 附加接口類:-------------------------------------------------------------------
// msip_MSS(): 讀 TCP/IP 的MSS,以決定將要發送的數據長度遠端是否能接受。
#define msip_MSS() (gptConn->MaxSegSize)
//--------------------------------------------------------------------------------------
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -