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

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

?? tcpip.c

?? 以凌陽單片機SPCE061A為核心的TCPIP協議實現(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一区二区三区免费野_久草精品视频
美美哒免费高清在线观看视频一区二区 | 日韩欧美国产三级电影视频| 亚洲国产另类精品专区| 欧美色综合影院| 亚洲五码中文字幕| 欧美老人xxxx18| 日本不卡的三区四区五区| 91精品国产色综合久久不卡蜜臀| 日韩福利电影在线| 欧美大白屁股肥臀xxxxxx| 国产在线看一区| 国产精品国产三级国产普通话三级 | 欧美日韩久久一区二区| 日韩国产成人精品| 久久久国际精品| 99re热视频这里只精品| 亚洲bt欧美bt精品| 亚洲精品一区二区三区99| 成人国产亚洲欧美成人综合网| 最新不卡av在线| 欧美日韩一区三区四区| 韩国毛片一区二区三区| 最新国产精品久久精品| 正在播放一区二区| 国产成人超碰人人澡人人澡| 一区二区成人在线| 日韩欧美国产综合| 99re成人在线| 美女一区二区视频| 亚洲少妇30p| 精品久久久久久无| 色www精品视频在线观看| 麻豆精品一区二区| 自拍偷自拍亚洲精品播放| 欧美一区二区在线看| 成人性生交大合| www.66久久| 免费人成精品欧美精品| 亚洲色图视频网| 欧美成人一区二区三区在线观看| 99re这里只有精品视频首页| 久久黄色级2电影| 亚洲激情在线激情| 国产日韩欧美一区二区三区综合| 欧美日韩国产色站一区二区三区| 国产老肥熟一区二区三区| 五月激情综合婷婷| 亚洲视频一区在线| 国产亚洲一区二区在线观看| 欧美精品少妇一区二区三区| 97久久超碰国产精品电影| 久久精品国产成人一区二区三区| 亚洲一区二区三区国产| 中文字幕一区二区三区蜜月| 久久久久久久综合日本| 91精品国产91久久久久久一区二区| 91在线你懂得| 国产成人鲁色资源国产91色综| 秋霞午夜av一区二区三区| 亚洲一区二区av电影| 中文字幕制服丝袜成人av| 精品国产制服丝袜高跟| 欧美一区三区四区| 欧美午夜精品久久久久久超碰 | 午夜精品一区二区三区电影天堂| 国产精品久久午夜| 久久久精品免费观看| 日韩美女视频在线| 欧美一级高清片在线观看| 欧美探花视频资源| 在线亚洲免费视频| 欧美亚洲愉拍一区二区| 色综合久久综合网97色综合| youjizz国产精品| 国产精品夜夜嗨| 国产经典欧美精品| 高清在线不卡av| 粉嫩av一区二区三区在线播放| 国产真实精品久久二三区| 欧美做爰猛烈大尺度电影无法无天| 成人av资源在线| 99精品视频在线播放观看| 成人a级免费电影| aaa欧美日韩| 91免费看视频| 欧美在线看片a免费观看| 91成人在线观看喷潮| 91黄色小视频| 欧美久久一区二区| 欧美成人aa大片| 久久一夜天堂av一区二区三区| 久久综合色鬼综合色| 久久久高清一区二区三区| 国产欧美久久久精品影院| 国产精品黄色在线观看| 亚洲狼人国产精品| 五月天久久比比资源色| 日欧美一区二区| 久久超碰97中文字幕| 国产一区二区福利视频| 不卡的看片网站| 色国产精品一区在线观看| 欧美调教femdomvk| 日韩欧美国产精品一区| 欧美高清在线视频| 一区二区三区国产| 奇米影视7777精品一区二区| 国产一区二区在线观看免费| 丁香亚洲综合激情啪啪综合| 色视频欧美一区二区三区| 日韩亚洲欧美中文三级| 国产精品免费免费| 亚洲大片精品永久免费| 精品亚洲国产成人av制服丝袜| 波多野结衣在线aⅴ中文字幕不卡| 91精彩视频在线观看| 日韩一区二区在线观看视频播放| 久久精品在线免费观看| 一区二区三区中文免费| 韩国在线一区二区| 在线观看国产一区二区| 亚洲精品一区二区三区福利| 中文字幕在线一区免费| 麻豆91在线播放免费| 91亚洲国产成人精品一区二区三| 日韩欧美视频在线| 一区二区三区四区乱视频| 久久er99热精品一区二区| 色老头久久综合| 久久久91精品国产一区二区三区| 亚洲综合一区二区| 国产suv一区二区三区88区| 337p亚洲精品色噜噜| 亚洲欧洲国产日本综合| 激情综合五月天| 欧美日韩一区二区电影| 中文字幕中文在线不卡住| 激情综合亚洲精品| 这里只有精品视频在线观看| 亚洲精品中文在线影院| 国产成人av在线影院| 日韩欧美激情在线| 午夜视频一区在线观看| 91免费观看视频在线| 国产欧美一区二区精品婷婷| 日韩精品1区2区3区| 欧美性大战久久久久久久蜜臀 | 国产精品色一区二区三区| 美国十次了思思久久精品导航| 一本到三区不卡视频| 国产精品国产三级国产有无不卡| 国产麻豆视频精品| 日韩一区二区三区四区| 午夜精品久久久久久久久| 91福利国产成人精品照片| 中文字幕在线播放不卡一区| 国产在线精品一区二区 | 久久久国产一区二区三区四区小说| 午夜精品福利一区二区蜜股av| 日本高清不卡aⅴ免费网站| 国产精品久久久久一区二区三区| 精品系列免费在线观看| 精品国产乱码久久久久久老虎| 天堂一区二区在线免费观看| 欧美日韩不卡一区二区| 亚洲成a人片在线观看中文| 欧美综合一区二区| 亚洲一区二区高清| 欧美日本免费一区二区三区| 亚洲国产成人高清精品| 在线不卡一区二区| 秋霞成人午夜伦在线观看| 6080yy午夜一二三区久久| 日本一不卡视频| 日韩欧美国产综合一区| 久久国产尿小便嘘嘘尿| 久久久久久久久久久电影| 国产一区二区精品在线观看| 欧美精彩视频一区二区三区| 岛国一区二区三区| 亚洲视频小说图片| 欧美亚洲禁片免费| 免费观看在线色综合| 精品国内二区三区| 国产91精品露脸国语对白| 国产精品你懂的在线欣赏| 91蜜桃在线免费视频| 亚洲国产一区二区视频| 91精品免费在线| 国产在线播精品第三| 国产精品福利一区二区| 欧美日韩在线免费视频| 久久99蜜桃精品| 国产精品丝袜一区| 色综合亚洲欧洲| 青青草91视频| 国产精品伦理一区二区| 欧美日本在线视频| 国产精品亚洲视频| 亚洲自拍欧美精品|