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

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

?? tcp.c

?? 網絡單片機 讓嵌入式系統上網,基于keil C. 文件名:microweb-keil-0.1
?? C
字號:
// ***************************************************************************// An 8051 Based Web Server// tcp.c: TCP protocol processing// By Mason Kidd 3/14/02// ***************************************************************************#include "packets.h"#include "ip.h"#include "tcp.h"#include "http.h"static struct tcp_TCB tcp_table[TCP_MAX_CONN];void tcp_init(void){	int i;	       for (i = 0; i < TCP_MAX_CONN; i++)       {       	tcp_table[i].local_port = 0;       	tcp_table[i].remote_port = 0;       	tcp_table[i].remote_addr[0] = 0;       	tcp_table[i].remote_addr[1] = 0;       	tcp_table[i].remote_addr[2] = 0;       	tcp_table[i].remote_addr[3] = 0;       	tcp_table[i].state = LISTEN;       	tcp_table[i].local_seq = 0;       	tcp_table[i].remote_seq = 0;       	       }}unsigned char tcp_get_TCB(unsigned char remote_addr[4], unsigned int remote_port, unsigned int local_port){	int i = 0;	unsigned char free_TCB = TCP_MAX_CONN;    	for (i = 0; i < TCP_MAX_CONN; i++)	{		if (tcp_table[i].remote_addr[0] == remote_addr[0] &&			tcp_table[i].remote_addr[0] == remote_addr[1] &&			tcp_table[i].remote_addr[0] == remote_addr[2] &&			tcp_table[i].remote_addr[0] == remote_addr[3] &&			tcp_table[i].remote_port == remote_port &&			tcp_table[i].local_port == local_port)			return i;		else if (tcp_table[i].state == LISTEN)			free_TCB = i;	}		if (free_TCB != TCP_MAX_CONN)	{		tcp_table[free_TCB].local_port = local_port;		tcp_table[free_TCB].remote_port = remote_port;		tcp_table[free_TCB].remote_addr[0] = remote_addr[0];		tcp_table[free_TCB].remote_addr[1] = remote_addr[1];		tcp_table[free_TCB].remote_addr[2] = remote_addr[2];		tcp_table[free_TCB].remote_addr[3] = remote_addr[3];		return free_TCB;	}		return 0;}void delete_TCB(unsigned char num_TCB){       	tcp_table[num_TCB].local_port = 0;       	tcp_table[num_TCB].remote_port = 0;       	tcp_table[num_TCB].remote_addr[0] = 0;       	tcp_table[num_TCB].remote_addr[1] = 0;       	tcp_table[num_TCB].remote_addr[2] = 0;       	tcp_table[num_TCB].remote_addr[3] = 0;       	tcp_table[num_TCB].state = LISTEN;       	tcp_table[num_TCB].local_seq = 0;       	tcp_table[num_TCB].remote_seq = 0;}void rx_tcp_packet(unsigned char *rx_buffer){	struct eth_hdr *rx_eth_hdr = (struct eth_hdr *)rx_buffer;	struct ip_hdr *rx_ip_hdr = (struct ip_hdr *)(rx_buffer + sizeof(struct eth_hdr));	struct tcp_hdr *rx_tcp_hdr = (struct tcp_hdr *)(rx_buffer + sizeof(struct eth_hdr) + sizeof(struct ip_hdr));	unsigned int *tcp_data = (unsigned int *)(rx_buffer + sizeof(struct eth_hdr) + sizeof(struct ip_hdr) + sizeof(struct tcp_hdr));	unsigned int *chksum_hdr = (unsigned int *)rx_ip_hdr->srcIP;	unsigned int tcp_len = rx_ip_hdr->totlen - sizeof(rx_ip_hdr);	unsigned int chksum = tcp_len + IP_TCP;	unsigned char current_TCB = 0;	bit process_data = 0;	int i;		for (i = 0; i < 8; i++)		chksum += *chksum_hdr;	chksum_hdr = (unsigned int *)rx_tcp_hdr;	// if the packet length is odd, pad it	if (tcp_len % 2)		*((unsigned char *)chksum_hdr + tcp_len) = 0;	tcp_len = (tcp_len + 1) >> 1;	for (i = 0; i < tcp_len; i++, chksum_hdr++)		if (i != 8)			chksum += *chksum_hdr;	chksum = ~chksum;	if (chksum == rx_tcp_hdr->checksum)	{		current_TCB = tcp_get_TCB(rx_ip_hdr->srcIP, rx_tcp_hdr->src_port, rx_tcp_hdr->dst_port);		if (current_TCB != 0) 		{			switch (tcp_table[current_TCB].state)			{				case LISTEN:					if (rx_tcp_hdr->cntrl_bits & TCP_CNTRL_SYN)					{						// received SYN, send SYN and ACK, enter SYN_RECVD	   					tcp_table[current_TCB].state = SYN_RECVD;						tcp_table[current_TCB].local_seq = TCP_START_SEQ;						tcp_table[current_TCB].remote_seq = rx_tcp_hdr->seq;						tx_tcp_packet(current_TCB, TCP_CNTRL_ACK | TCP_CNTRL_SYN, 0, 0);					}					break;				case SYN_SENT:					if (rx_tcp_hdr->cntrl_bits & (TCP_CNTRL_ACK || TCP_CNTRL_SYN))					{   						// received SYN and ACK, enter ESTABLISHED, send ACK						tcp_table[current_TCB].state = ESTABLISHED;						tcp_table[current_TCB].remote_seq = rx_tcp_hdr->seq;   						tx_tcp_packet(current_TCB, TCP_CNTRL_ACK, 0, 0);					}					else if (rx_tcp_hdr->cntrl_bits & TCP_CNTRL_SYN)					{	   					// received SYN, enter SYN_RECVD, send ACK						tcp_table[current_TCB].remote_seq = rx_tcp_hdr->seq;						tcp_table[current_TCB].state = SYN_RECVD;   						tx_tcp_packet(current_TCB, TCP_CNTRL_ACK, 0, 0);					}					break;				case SYN_RECVD:  					if (rx_tcp_hdr->cntrl_bits & TCP_CNTRL_ACK)   	 				{   	   					// received ACK, enter ESTABLISHED						tcp_table[current_TCB].remote_seq = rx_tcp_hdr->seq;						tcp_table[current_TCB].state = ESTABLISHED;   		   			}					break;				case ESTABLISHED:					if (rx_tcp_hdr->cntrl_bits & TCP_CNTRL_FIN)					{   						// received FIN, send ACK, close connection   	   					// skip the CLOSE_WAIT state						tcp_table[current_TCB].state = LAST_ACK;						tx_tcp_packet(current_TCB, TCP_CNTRL_ACK | TCP_CNTRL_FIN, 0, 0);					}					else						process_data = 1;   					break;				case CLOSE_WAIT:					break;				case FIN_WAIT_1:					break;				case FIN_WAIT_2:					break;				case CLOSING:					break;				case LAST_ACK:					if (rx_tcp_hdr->cntrl_bits & TCP_CNTRL_ACK)					{						tcp_table[current_TCB].state = CLOSED;					}				case CLOSED:  					delete_TCB(current_TCB);					break;				case TIME_WAIT:					break;			}			// connection is established, send data to correct socket			if (process_data == 1)				switch (rx_tcp_hdr->dst_port)				{					case TCP_PORT_HTTP:						rx_http_packet((unsigned char *)tcp_data, tcp_len - sizeof(struct tcp_hdr), current_TCB);						break;				}		} 	}	// else discard packet}void tx_tcp_packet(unsigned char current_TCB, unsigned char control_bits, unsigned char *szData, unsigned int nLength){	unsigned char tx_buf[BUF_LEN];	struct ip_hdr *tx_ip_hdr = (struct ip_hdr *)(tx_buf + sizeof(struct eth_hdr));	struct tcp_hdr *tx_tcp_hdr = (struct tcp_hdr *)(tx_buf + sizeof(struct ip_hdr) + sizeof(struct eth_hdr));	unsigned char *tcp_data = (unsigned char *)(tx_buf + sizeof(struct eth_hdr) + sizeof(struct ip_hdr) + sizeof(struct tcp_hdr));	unsigned int *chksum_hdr = (unsigned int *)tx_ip_hdr->srcIP;	unsigned int tcp_len = nLength + sizeof(struct tcp_hdr);	unsigned long chksum = tcp_len + IP_TCP;	int i;		for (i = 0; i < nLength; i++)	{		*tcp_data = szData[i]; 		tcp_data++;	}	    tx_tcp_hdr->src_port = tcp_table[current_TCB].local_port;    tx_tcp_hdr->dst_port = tcp_table[current_TCB].remote_port;    tx_tcp_hdr->seq = tcp_table[current_TCB].local_seq++;    if (control_bits & TCP_CNTRL_ACK)	    tx_tcp_hdr->ack = tcp_table[current_TCB].remote_seq;	tx_tcp_hdr->cntrl_bits = control_bits;	   	for (i = 0; i < 8; i++)		chksum += *chksum_hdr;	chksum_hdr = (unsigned int *)tx_tcp_hdr;	// if the packet length is odd, pad it	if (tcp_len % 2)		*((unsigned char *)chksum_hdr + tcp_len) = 0;	tcp_len = (tcp_len + 1) >> 1;	for (i = 0; i < tcp_len; i++, chksum_hdr++)		if (i != 8)			chksum += *chksum_hdr;	chksum = ~((chksum >> 16) + (chksum & 0xffff));	tx_tcp_hdr->checksum = (unsigned int)(chksum & 0xffff);	tx_ip_packet(tx_buf, nLength + sizeof(struct tcp_hdr), IP_TCP);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲一本大道中文在线| 久久精品国产久精国产| 丝袜诱惑制服诱惑色一区在线观看| 久久99日本精品| 欧美性生活大片视频| 日本一区二区三区dvd视频在线| 亚洲成人一区二区| 91原创在线视频| 欧美激情中文字幕一区二区| 免费不卡在线视频| 在线观看免费亚洲| 亚洲精品老司机| 成人国产精品免费观看视频| 国产亚洲精品超碰| 精品一区二区三区欧美| 欧美一二三四在线| 亚洲第一久久影院| 欧美性做爰猛烈叫床潮| 一区二区三区色| 99riav一区二区三区| 国产欧美精品区一区二区三区| 免费观看在线综合色| 91精品国产麻豆| 天天色综合成人网| 欧美色精品在线视频| 亚洲小说春色综合另类电影| 91成人免费在线视频| 一区二区在线看| 色噜噜狠狠成人中文综合| 亚洲欧美色图小说| 色久优优欧美色久优优| 一区二区三区**美女毛片| 在线观看亚洲专区| 日韩精品亚洲一区| 精品美女一区二区| 国产99久久久国产精品潘金网站| 欧美国产国产综合| 99久久免费国产| 一区二区在线电影| 欧美日韩国产成人在线免费| 日韩在线观看一区二区| 欧美成人国产一区二区| 国产成人精品网址| 亚洲码国产岛国毛片在线| 色琪琪一区二区三区亚洲区| 午夜伦理一区二区| 精品久久一二三区| 成人av资源在线观看| 亚洲欧美另类小说| 欧美一区二区久久| 国产乱子伦视频一区二区三区| 国产精品全国免费观看高清| 在线观看三级视频欧美| 麻豆一区二区99久久久久| 国产偷v国产偷v亚洲高清| 久久综合色天天久久综合图片| 国内精品国产三级国产a久久| 国产亚洲精品久| 欧美三级电影一区| 国产在线国偷精品免费看| 亚洲摸摸操操av| 欧美xxxxx牲另类人与| 99精品视频在线观看免费| 亚洲成人自拍网| 中文字幕av一区二区三区| 欧美三级日韩在线| 国产99精品在线观看| 日日嗨av一区二区三区四区| 中文字幕成人在线观看| 欧美精品三级日韩久久| 国产成人精品一区二区三区四区 | 色婷婷av久久久久久久| 香蕉成人啪国产精品视频综合网| 精品国产麻豆免费人成网站| 色综合视频在线观看| 蜜桃av一区二区| 一区二区成人在线视频| 久久嫩草精品久久久精品一| 欧美日韩三级一区二区| 成人av综合一区| 国产一区二区三区综合| 午夜成人免费电影| 亚洲欧美另类在线| 国产精品欧美综合在线| 欧美一区二区视频观看视频| 91亚洲国产成人精品一区二三 | 亚洲高清在线视频| 国产精品美女久久久久aⅴ国产馆| 欧美肥大bbwbbw高潮| 91无套直看片红桃| 国产乱码一区二区三区| 久久国产精品色| 亚洲777理论| 夜夜嗨av一区二区三区网页| 国产欧美精品区一区二区三区| 91精品国产福利| 555夜色666亚洲国产免| 欧美性猛片aaaaaaa做受| 99视频精品免费视频| 国产精品系列在线播放| 激情文学综合网| 免费看欧美女人艹b| 婷婷久久综合九色综合伊人色| 亚洲人精品午夜| 亚洲欧美日韩国产综合在线| 一区视频在线播放| 国产精品久久毛片| 中文字幕欧美一区| 日韩毛片高清在线播放| 国产欧美综合色| 国产精品女主播在线观看| 国产午夜亚洲精品羞羞网站| 久久精品夜夜夜夜久久| 国产亚洲精品7777| 国产欧美日韩在线视频| 中文字幕不卡在线播放| 中文字幕制服丝袜一区二区三区| 国产无人区一区二区三区| 精油按摩中文字幕久久| 国产乱人伦偷精品视频免下载| 国产成人在线免费观看| 国产成人在线观看免费网站| 成人av网站在线| av在线不卡免费看| 欧洲av在线精品| 91麻豆精品国产91久久久资源速度| 在线播放/欧美激情| 日韩女同互慰一区二区| 欧美精品一区男女天堂| 国产欧美视频一区二区| 一区二区三区中文免费| 日韩高清不卡一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 国产成人综合在线播放| 91色|porny| 欧美顶级少妇做爰| 久久久久久久久久久电影| 日韩一区欧美小说| 日韩高清中文字幕一区| 国产精品夜夜爽| 91免费国产在线观看| 欧美日韩不卡在线| 久久久亚洲精品一区二区三区 | 色综合久久久久久久久久久| 欧美日韩高清一区二区不卡| 精品国产91亚洲一区二区三区婷婷 | 在线中文字幕一区二区| 日韩一区二区三区四区| 亚洲国产精品成人久久综合一区| 夜夜嗨av一区二区三区中文字幕 | 国产欧美一区二区三区在线看蜜臀| 亚洲天堂福利av| 男人的天堂亚洲一区| www.亚洲色图.com| 欧美va亚洲va香蕉在线 | 国产欧美一区二区精品婷婷| 亚洲欧美aⅴ...| 麻豆91免费观看| 91看片淫黄大片一级在线观看| 91精品国产一区二区三区| 欧美激情一区二区三区全黄 | 国产乱妇无码大片在线观看| 色婷婷久久综合| 国产日本欧美一区二区| 日本女人一区二区三区| 91久久精品午夜一区二区| 国产欧美日韩一区二区三区在线观看| 亚洲成人黄色影院| 99久久精品情趣| 久久久久国色av免费看影院| 午夜精品久久久久久久久| 成人免费观看视频| 久久久久久免费网| 麻豆国产精品777777在线| 欧美日韩综合在线免费观看| 国产精品成人一区二区艾草 | 亚洲成人精品一区| 成人深夜在线观看| 久久精品在线观看| 久久精品国产99| 91精品国产免费| 亚瑟在线精品视频| 在线观看亚洲a| 亚洲精品免费在线播放| 99天天综合性| 中文字幕中文字幕在线一区| 成人亚洲精品久久久久软件| 久久久久高清精品| 国产精品18久久久| 久久精品在这里| 国产成人精品亚洲午夜麻豆| 久久久久9999亚洲精品| 久久成人免费电影| 精品处破学生在线二十三| 精品一区二区成人精品| 日韩免费视频一区| 精品一区二区三区在线播放视频| 91精品视频网| 美国三级日本三级久久99| 欧美不卡一区二区三区|