亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcpip.c

?? 轉載單片機實現TCP/IP協議的完整C源程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			(gptConn->TcpStateFlags == cTCP_TIME_WAIT)){
			goto found_unused_connection;
		}
	}

	goto drop;	// 沒有空閑的TCP聯接,進入異常終止遠端處理!

// 有空閑的TCP聯接,回應遠端的SYN請求
found_unused_connection:
	// 設置初始TCP聯接事務狀態
	gptConn->Timer = cTCP_RTO;
	gptConn->NumRetran = 0;
	gptConn->LocalPort = cptTcpHdrBuf->DestPort;
	gptConn->RemotePort = cptTcpHdrBuf->SrcPort;
	gptConn->RemoteIpAddr[0] = cptIpHdrBuf->SrcIpAddr[0];
	gptConn->RemoteIpAddr[1] = cptIpHdrBuf->SrcIpAddr[1];
	gptConn->TcpStateFlags = cTCP_SYN_RCVD|cTCP_OUTSTANDING;
	//-------------------------
	gptConn->SeqNum[0] = guwISN[0];
	gptConn->SeqNum[1] = guwISN[1];
	//-------------------------
	gptConn->AckNum[0] = guwISN[0];
	gptConn->AckNum[1] = guwISN[1];
	if (++gptConn->AckNum[1] == 0){
		++gptConn->AckNum[0];
	}
	//-------------------------
	gptConn->RcvNum[0] = cptTcpHdrBuf->SeqNum[0];
	gptConn->RcvNum[1] = cptTcpHdrBuf->SeqNum[1];
	if (++gptConn->RcvNum[1] == 0){
		++gptConn->RcvNum[0];
	}
	
	// 獲取遠端TCP報文長度。如果遠端比本地小,就以遠端為準。
	i = cptTcpHdrBuf->HdrLen;
	if (i > cTCP_HDR_NOOPT){
		i = (i - cTCP_HDR_NOOPT) << 1;	// Convert 32bit number to 16bit number.
		for (j = 0; j < i; j++){
			if (cpTcpData[j] == 0x0204){
				gptConn->MaxSegSize = cpTcpData[j + 1] > cTCP_MSS ? cTCP_MSS : cpTcpData[j + 1];
				break;
			}
		}
	}

// 發送 SYNACK 包
#if TCP_ACTIVE_OPEN == 1
tcp_send_synack:
	cptTcpHdrBuf->Flags = cTCP_ACK;
tcp_send_syn:
	cptTcpHdrBuf->Flags |= cTCP_SYN;
#else
tcp_send_synack:
	cptTcpHdrBuf->Flags = cTCP_SYN|cTCP_ACK;
#endif

	// 給 SYNACK 包配置TCP頭選項表
	cpTcpData[0] = 0x0204;		// 0x0204 表示最大報文段長度前綴
	cpTcpData[1] = cTCP_MSS;	// 最大報文段長度前綴
	cpTcpData[2] = 0x0101;		// 0x01表示無操作,0x00表示選項表結束
	cpTcpData[3] = 0x0402;		// 0x0402 表示 SACK 被允許
	guwEthLen = 2*cIpHdrLen + (cTCP_HDR_OPT << 2);
	cptTcpHdrBuf->HdrLen = cTCP_HDR_OPT;
	goto tcp_send;

// 找到已經存在的TCP聯接事物
found:
	guwFlags = 0;
	
	// 如果遠端是RST包,就通知本地應用層:當前連接被遠端異常終止!
	if (cptTcpHdrBuf->Flags & cTCP_RST){
		gptConn->TcpStateFlags = cTCP_CLOSED;
		guwFlags = cTCP_ABORT;
		msip_APPCALL();
		goto drop;
	}
	
	// 如果沒有ACK標識,不響應!
	if (!(cptTcpHdrBuf->Flags & cTCP_ACK)){
		goto drop;
	}
  
	// 計算TCP數據段字節長度
	guwEthLen -= ((cptIpHdrBuf->Vhl & 0x0f) << 2) + (cptTcpHdrBuf->HdrLen << 2);


	// 檢驗遠端的ACK序號是否我們期待的.....
	if ((cptTcpHdrBuf->AckNum[0] == gptConn->AckNum[0]) && (cptTcpHdrBuf->AckNum[1] == gptConn->AckNum[1])){

		gptConn->SeqNum[0] = gptConn->AckNum[0];
		gptConn->SeqNum[1] = gptConn->AckNum[1];

		gptConn->TcpStateFlags &= ~cTCP_OUTSTANDING;
		gptConn->Timer = cTCP_RTO;
		gptConn->NumRetran = 0;
		
		guwFlags = cTCP_ACKDATA;
	} else {
		goto drop;
	}

	// 根據不同的聯接狀態決定TCP狀態變遷,并通知應用程序
	switch (gptConn->TcpStateFlags & cTCP_TS_MASK){
	// CLOSED和LISTEN狀態不在這里處理
	// CLOSE_WAIT狀態同樣被忽略:因為一旦本地收到FIN,我們就強制應用層關閉,即從ESTABLISH到LAST_ACK

	case cTCP_SYN_RCVD:
	// 在SYN_RCVD狀態下,我們收到遠端ACK回應
	// 另一方面,如果已經存在cTCP_ACKDATA標識,就進入ESTABLISHED狀態
		gptConn->TcpStateFlags = cTCP_ESTABLISHED;
		guwFlags = cTCP_CONNECTED;
		msip_APPCALL();
		goto appsend;		

#if TCP_ACTIVE_OPEN == 1
	case cTCP_SYN_SENT:
	// 在SYN_SENT狀態,我們收到遠端SYNACK響應,本地發送ACK后就進入ESTABLISHED狀態

	// 獲取遠端TCP報文長度。如果遠端比本地小,就以遠端為準。
		i = cptTcpHdrBuf->HdrLen;
		if (i > cTCP_HDR_NOOPT){
			i = (i - cTCP_HDR_NOOPT) << 1;
			for (j = 0; j < i; j++){
				if (cpTcpData[j] == 0x0204){
					gptConn->MaxSegSize = cpTcpData[j + 1] > cTCP_MSS ? cTCP_MSS : cpTcpData[j + 1];
					break;
				}
			}
		}

		gptConn->RcvNum[0] = cptTcpHdrBuf->SeqNum[0];
		gptConn->RcvNum[1] = cptTcpHdrBuf->SeqNum[1];
		if (++gptConn->RcvNum[1] == 0){
			++gptConn->RcvNum[0];
		}
			
		gptConn->TcpStateFlags = cTCP_ESTABLISHED;
		guwFlags = cTCP_CONNECTED;
		msip_APPCALL();
		goto appsend;

#endif
		
	case cTCP_ESTABLISHED: // 應用狀態標識cTCP_ACKDATA被設置,允許應用層發送TCP數據包
		
		// 如果收到包含FIN標識的包,協議層發送FIN并進入LAST_ACK狀態,并向應用層發cTCP_CLOSE標識
		if  (cptTcpHdrBuf->Flags & cTCP_FIN) {

			i = 1 + guwEthLen;
			if ((gptConn->RcvNum[1] += i) < i){
				++gptConn->RcvNum[0];
			}

			guwFlags = cTCP_CLOSE;
			msip_APPCALL();

			if (++gptConn->AckNum[1] == 0){
				++gptConn->AckNum[0];
			}

			gptConn->TcpStateFlags = cTCP_LAST_ACK|cTCP_OUTSTANDING;

tcp_send_finack:	// 發送FINACK包:由TCP事務查詢重傳跳過來的.....
			cptTcpHdrBuf->Flags = cTCP_FIN|cTCP_ACK;			
			goto tcp_send_nodata;
		}
		

		if (guwEthLen > 0){	// 收到的TCP包有數據段

			if (gptConn->TcpStateFlags & cTCP_STOPPED){
			// 1)如果有cTCP_STOPPED標識,表明應用層沒有buffer處理,我們只能ACK回應。
				// guwFlags = cTCP_ACKDATA; // 已經存在的,這里不需要重設
				goto tcp_send_ack;
			} else {
			// 2)應用層可以處理這個含數據段的TCP包,給應用層發cTCP_NEWDATA標識以替換cTCP_ACKDATA標識
				guwFlags = cTCP_NEWDATA;
				if ((gptConn->RcvNum[1] += guwEthLen) < guwEthLen){
					++gptConn->RcvNum[0];
				}
			}
		}

		// 協議層通知應用層目前的狀態:
		msip_APPCALL();

	
appsend:	// 根據應用層的反饋標識處理回應遠端

		// 如果應用層需要異常終止當前連接,協議層就RSTACK遠端,并清除這個TCP事務!
		if (guwFlags & cTCP_ABORT){
			gptConn->TcpStateFlags = cTCP_CLOSED;
			cptTcpHdrBuf->Flags = cTCP_RST|cTCP_ACK;
			guwEthLen = 0;
			goto tcp_send_nodata;
		}
	
		// 如果應用層需要正常關閉當前連接,協議層就進入等待FIN_WAIT_1狀態,并向遠端發送FINACK
		if (guwFlags & cTCP_CLOSE){

			if (++gptConn->AckNum[1] == 0){
				++gptConn->AckNum[0];
			}

			gptConn->TcpStateFlags = cTCP_FIN_WAIT_1|cTCP_OUTSTANDING;
			gptConn->NumRetran = 0;
			cptTcpHdrBuf->Flags = cTCP_FIN|cTCP_ACK;
			guwEthLen = 0;
			goto tcp_send_nodata;
		}

		// 檢查應用層是否有TCP數據包
		if (guwEthLen > 0){ // 應用層有TCP數據包

			gptConn->TcpStateFlags |= cTCP_OUTSTANDING;
			gptConn->NumRetran = 0;

			if ((gptConn->AckNum[1] += guwEthLen) < guwEthLen){
				++gptConn->AckNum[0];
			}
	
// 重傳處理,當然也要處理正常的ACK回應。
apprexmit:
			// 發送ACK確認,可能包含TCP數據
			guwEthLen += 2*(cIpHdrLen + cTcpHdrLen);
			// 設置PSHACK標識
			cptTcpHdrBuf->Flags = cTCP_ACK | cTCP_PSH;
			// 進入TCP封裝
			goto tcp_send_noopts;
		} else if (guwFlags & cTCP_NEWDATA){ // 應用層沒有有TCP數據包。檢查遠端是否等待本地的ACK回應
			goto tcp_send_ack;
		}
		
		goto drop;  // 遠端是沒有數據的ACK回應,并且應用層也沒有數據要傳。

	case cTCP_LAST_ACK:
		// 如果收到遠端ACK確認本地FIN,協議層關閉連接。
		if (guwFlags & cTCP_ACKDATA){
			gptConn->TcpStateFlags = cTCP_CLOSED;
		}
		goto drop;

	case cTCP_FIN_WAIT_1:
		// 應用層已經關閉,但遠端還沒有。本地協議層等待FIN
		if (guwEthLen > 0){
			if ((gptConn->RcvNum[1] += guwEthLen) < guwEthLen){
				++gptConn->RcvNum[0];
			}
		}

		if (cptTcpHdrBuf->Flags & cTCP_FIN){
			if (guwFlags & cTCP_ACKDATA){
				gptConn->TcpStateFlags = cTCP_TIME_WAIT;
				gptConn->Timer = 0;
			}
			else{
				gptConn->TcpStateFlags = cTCP_CLOSING|cTCP_OUTSTANDING;
			}

			if (++gptConn->RcvNum[1] == 0){
				++gptConn->RcvNum[0];
			}

			goto tcp_send_ack;
		}
		else if (guwFlags & cTCP_ACKDATA){
			gptConn->TcpStateFlags = cTCP_FIN_WAIT_2;
			goto drop;
		}
		
		if (guwEthLen > 0){
			goto tcp_send_ack;
		}

		goto drop;
	
	case cTCP_FIN_WAIT_2:
		if (guwEthLen > 0){
			if ((gptConn->RcvNum[1] += guwEthLen) < guwEthLen){
				++gptConn->RcvNum[0];
			}
		}

		if (cptTcpHdrBuf->Flags & cTCP_FIN){
			gptConn->TcpStateFlags = cTCP_TIME_WAIT;
			gptConn->Timer = 0;

			if (+gptConn->RcvNum[1] == 0){
				++gptConn->RcvNum[0];
			}

			goto tcp_send_ack;
		}
		
		if(guwEthLen > 0){
			goto tcp_send_ack;
		}
		
		goto drop;
		
	case cTCP_TIME_WAIT:
		goto tcp_send_ack;

	case cTCP_CLOSING:
		if (guwFlags & cTCP_ACKDATA){
			gptConn->TcpStateFlags = cTCP_TIME_WAIT;
			gptConn->Timer = 0;
		}
	}
	
	goto drop;
	  
// 封裝 TCP
tcp_send_ack:
	cptTcpHdrBuf->Flags = cTCP_ACK;
	
tcp_send_nodata:
	guwEthLen = 2*(cIpHdrLen + cTcpHdrLen);
	
tcp_send_noopts:
	cptTcpHdrBuf->HdrLen = cTCP_HDR_NOOPT;
	
tcp_send:	// 構造TCP頭
	cptTcpHdrBuf->AckNum[0] = gptConn->RcvNum[0];
	cptTcpHdrBuf->AckNum[1] = gptConn->RcvNum[1];

	cptTcpHdrBuf->SeqNum[0] = gptConn->SeqNum[0];
	cptTcpHdrBuf->SeqNum[1] = gptConn->SeqNum[1];
	
	cptTcpHdrBuf->SrcPort = gptConn->LocalPort;
	cptTcpHdrBuf->DestPort = gptConn->RemotePort;
	
	cptIpHdrBuf->SrcIpAddr[0] = guwIpAddr[0];
	cptIpHdrBuf->SrcIpAddr[1] = guwIpAddr[1];
	
	cptIpHdrBuf->DestIpAddr[0] = gptConn->RemoteIpAddr[0];
	cptIpHdrBuf->DestIpAddr[1] = gptConn->RemoteIpAddr[1];
	
	// 如果應用層要求停止數據,協議層凍結窗口
	if (gptConn->TcpStateFlags & cTCP_STOPPED){
		cptTcpHdrBuf->WndSize = 0;
	}
	else{
		// 通知遠端本地重新開放窗口。由于本地RAM小,所以是靜態窗口
		cptTcpHdrBuf->WndSize = cTCP_WS;
	}

tcp_send_noconn:	// 構造IP頭

	cptIpHdrBuf->Vhl = cIP_VER_HLEN;
	cptIpHdrBuf->Tos = 0;
	cptIpHdrBuf->Len = guwEthLen;
	cptIpHdrBuf->IpId = ++guwIpId;
	cptIpHdrBuf->Flags = cIP_DF;				// Do not Fragment!
	cptIpHdrBuf->Offset = 0;
	cptIpHdrBuf->Ttl = cIP_TTL;
	cptIpHdrBuf->Proto = cIP_PROTO_TCP;

	// Calculate IP checksums.
	cptIpHdrBuf->IpChkSum = 0;
	cptIpHdrBuf->IpChkSum = ~checksum(2*cIpHdrLen, cpIpHdrBuf);

	// Calculate TCP checksums.
	cptTcpHdrBuf->Reserve = 0;
	cptTcpHdrBuf->TcpChkSum = 0;
	cptTcpHdrBuf->TcpChkSum = ~msip_TcpChkSum();

send:		// 發生送IP包
	msip_Arp_Out(pARP);

drop:	// 釋放緩沖區
	guwEthLen = 0;
	return;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩黄色免费电影| 亚洲欧美日韩一区| 欧美日本精品一区二区三区| 成人黄色一级视频| 国产成人精品在线看| 久99久精品视频免费观看| 午夜国产不卡在线观看视频| 亚洲自拍欧美精品| 亚洲电影在线播放| 日韩精品亚洲一区| 精品亚洲免费视频| 粉嫩在线一区二区三区视频| 国产91对白在线观看九色| 国产成人免费av在线| av激情综合网| 欧美中文字幕一区| 欧美一区二区女人| 久久蜜臀精品av| 中文字幕精品一区二区精品绿巨人| 国产欧美精品国产国产专区 | 亚洲精品国产视频| 亚洲精品老司机| 亚洲成人综合视频| 国产精品91一区二区| 9i在线看片成人免费| 欧洲精品一区二区三区在线观看| 欧美另类videos死尸| 欧美国产乱子伦| 亚洲欧美日韩国产手机在线| 亚洲成人手机在线| 成人午夜碰碰视频| 欧美日韩免费观看一区三区| 日韩无一区二区| 亚洲欧洲av一区二区三区久久| 亚洲综合视频在线| 国产精品一区二区男女羞羞无遮挡| 成人激情黄色小说| 精品噜噜噜噜久久久久久久久试看 | 国产伦精品一区二区三区在线观看| 成人性生交大片免费| 欧美日韩一区二区三区四区五区| 精品国产乱码久久久久久夜甘婷婷| 综合av第一页| 国产综合成人久久大片91| 91丨porny丨户外露出| 日韩欧美一二三| 亚洲一卡二卡三卡四卡无卡久久| 国产一区高清在线| 欧美日韩国产片| 国产精品九色蝌蚪自拍| 黄网站免费久久| 欧美精品xxxxbbbb| 亚洲综合偷拍欧美一区色| 国产 欧美在线| 日韩天堂在线观看| 日本va欧美va精品| 在线观看视频一区二区| 亚洲国产高清不卡| 国产高清不卡二三区| 日韩一区二区在线播放| 亚洲成a人片在线观看中文| 本田岬高潮一区二区三区| 久久久久99精品一区| 久久精品国产77777蜜臀| 欧美伦理影视网| 亚洲国产日韩一区二区| 色综合中文字幕国产| 26uuuu精品一区二区| 日韩高清一区二区| 欧美人与z0zoxxxx视频| 亚洲成人综合在线| 欧美视频精品在线观看| 亚洲在线视频一区| 在线观看成人小视频| 亚洲免费在线视频| 色婷婷综合激情| 亚洲一区精品在线| 欧美色偷偷大香| 日本视频中文字幕一区二区三区| 欧美精品亚洲一区二区在线播放| 亚洲va在线va天堂| 欧美一区二区女人| 国产一区二区三区在线观看免费| 26uuu成人网一区二区三区| 国产在线不卡一区| 国产精品高潮久久久久无| 成人av网站免费| 亚洲狼人国产精品| 欧美日韩精品二区第二页| 日韩成人av影视| 欧美精品一区二区在线播放| 国产一区二区三区视频在线播放| 国产女同互慰高潮91漫画| www.欧美精品一二区| 亚洲综合在线免费观看| 欧美顶级少妇做爰| 国产一区日韩二区欧美三区| 国产精品乱码一区二区三区软件| 91丨九色丨蝌蚪丨老版| 天天操天天色综合| 精品日韩一区二区三区免费视频| 国产乱码精品一区二区三区忘忧草| 久久九九久精品国产免费直播| 99国产欧美另类久久久精品| 亚洲最大的成人av| 久久一区二区三区四区| 91丝袜高跟美女视频| 石原莉奈一区二区三区在线观看| 久久综合九色综合97婷婷女人 | 91一区一区三区| 香蕉乱码成人久久天堂爱免费| 精品日韩成人av| 97se亚洲国产综合自在线观| 日本vs亚洲vs韩国一区三区二区| 国产欧美日韩亚州综合 | 精品亚洲国产成人av制服丝袜| 国产精品久久久久久久久搜平片| 欧美三级电影网站| 成熟亚洲日本毛茸茸凸凹| 亚洲va国产va欧美va观看| 日本一区二区三区dvd视频在线| 欧美在线观看视频一区二区三区 | 久久久精品综合| 欧美日本国产一区| 91啪九色porn原创视频在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲日本在线天堂| 国产三级三级三级精品8ⅰ区| 欧美这里有精品| 成人晚上爱看视频| 极品销魂美女一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 国产欧美日本一区视频| 91精品国产欧美日韩| 日本伦理一区二区| 欧美亚洲愉拍一区二区| 亚洲视频精选在线| 久久人人爽人人爽| 日韩午夜激情电影| 欧美日韩aaaaa| 91丨国产丨九色丨pron| 成人美女视频在线观看| 狠狠色狠狠色综合| 蜜臀精品久久久久久蜜臀| 一区二区视频免费在线观看| 欧美国产精品一区二区三区| 91精品国产手机| 337p亚洲精品色噜噜狠狠| 欧美视频你懂的| 欧美日韩一区二区三区高清| 91美女蜜桃在线| 91麻豆精品视频| 91在线云播放| 99免费精品在线观看| 不卡视频一二三| av中文字幕亚洲| 色综合久久88色综合天天免费| 成人午夜免费av| 91免费看片在线观看| 色综合夜色一区| 欧美影视一区在线| 欧美日韩色综合| 日韩一区二区三区观看| 91麻豆精品国产91久久久久| 91精品国产欧美一区二区18| 日韩精品中文字幕一区| 亚洲精品一区二区三区香蕉| 久久久亚洲综合| 亚洲欧洲日产国码二区| 亚洲同性gay激情无套| 亚洲自拍另类综合| 毛片av一区二区| 国产精品18久久久久久vr| 丁香激情综合五月| 欧美日韩国产综合一区二区三区| 欧美性受xxxx| 欧美大片免费久久精品三p | 欧美特级限制片免费在线观看| 欧美日韩国产一级片| 精品精品国产高清a毛片牛牛| 久久亚洲春色中文字幕久久久| 国产精品久久久久久一区二区三区| 亚洲视频中文字幕| 日本系列欧美系列| 成人免费视频app| 欧美日韩免费观看一区二区三区| 精品国产一区二区三区久久久蜜月| 欧美韩国日本不卡| 亚洲最大成人综合| 国产精品99久久久久久久女警| 色综合色狠狠综合色| 欧美成人艳星乳罩| 日韩毛片视频在线看| 久久精品国产亚洲高清剧情介绍| 成人app网站| 精品国产乱子伦一区| 亚洲一级电影视频| 岛国一区二区三区| 日韩精品中文字幕在线一区| 有坂深雪av一区二区精品|