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

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

?? tcp.c

?? ecos實時嵌入式操作系統
?? C
?? 第 1 頁 / 共 2 頁
字號:
		BSPLOG(bsp_log("TCP_FLAG_RST rcvd\n"));		do_reset(s);		__pktbuf_free(pkt);		return;	    }	    switch (s->state) {	      case _SYN_SENT:		/* active open not supported */                  if (tcp->flags != (TCP_FLAG_SYN | TCP_FLAG_ACK)) {                      do_reset(s);                      __pktbuf_free(pkt);                      return;                  }                  s->state = _ESTABLISHED;                  s->ack = ntohl(tcp->seqnum) + 1;                  s->seq = ntohl(tcp->acknum);                  send_ack(s);		break;	      case _LISTEN:		if (tcp->flags & TCP_FLAG_SYN) {		    s->state = _SYN_RCVD;		    s->ack = ntohl(tcp->seqnum) + 1;		    s->his_port = ntohs(tcp->src_port);		    memcpy(s->his_addr.ip_addr, r->ip_addr, sizeof(ip_addr_t));		    s->data_bytes = 0;		    BSPLOG(bsp_log("SYN from %d.%d.%d.%d:%d (seq %x)\n",			       s->his_addr.ip_addr[0],s->his_addr.ip_addr[1],			       s->his_addr.ip_addr[2],s->his_addr.ip_addr[3],			       s->his_port, ntohl(tcp->seqnum)));		    tcp_send(s, TCP_FLAG_SYN | TCP_FLAG_ACK, 0);		}		else		    send_reset(pkt, r);		break;	      case _SYN_RCVD:		BSPLOG(bsp_log("_SYN_RCVD timer cancel.\n"));		__timer_cancel(&s->timer);		/* go back to _LISTEN state if reset */		if (tcp->flags & TCP_FLAG_RST) {		    s->state = _LISTEN;		    BSPLOG(bsp_log("_SYN_RCVD --> _LISTEN\n"));		} else if (tcp->flags & TCP_FLAG_SYN) {		    /* apparently our SYN/ACK was lost? */		    tcp_send(s, 0, 1);		    BSPLOG(bsp_log("retransmitting SYN/ACK\n"));		} else if ((tcp->flags & TCP_FLAG_ACK) &&			   ntohl(tcp->acknum) == (s->seq + 1)) {		    /* we've established the connection */		    s->state = _ESTABLISHED;		    s->seq++;		    BSPLOG(bsp_log("ACK received - connection established\n"));		}		break;	      case _ESTABLISHED:	      case _CLOSE_WAIT:		ack = s->ack;  /* save original ack */		if (tcp->flags & TCP_FLAG_ACK)		    handle_ack(s, pkt);		queued = handle_data(s, pkt);		if ((tcp->flags & TCP_FLAG_FIN) &&		    ntohl(tcp->seqnum) == s->ack) {		    BSPLOG(bsp_log("FIN received - going to _CLOSE_WAIT\n"));		    s->ack++;		    s->state = _CLOSE_WAIT;		}		/*		 * Send an ack if neccessary.		 */		if (s->ack != ack || pkt->pkt_bytes > (tcp->hdr_len << 2))		    send_ack(s);		break;	      case _LAST_ACK:		if (tcp->flags & TCP_FLAG_ACK) {		    handle_ack(s, pkt);		    if (ntohl(tcp->acknum) == (s->seq + 1)) {			BSPLOG(bsp_log("_LAST_ACK --> _CLOSED\n"));			s->state = _CLOSED;			unlink_socket(s);		    }		}		break;	      case _FIN_WAIT_1:		if (tcp->flags & TCP_FLAG_ACK) {		    handle_ack(s, pkt);		    if (ntohl(tcp->acknum) == (s->seq + 1)) {			/* got ACK for FIN packet */			s->seq++;			if (tcp->flags & TCP_FLAG_FIN) {			    BSPLOG(bsp_log("_FIN_WAIT_1 --> _TIME_WAIT\n"));			    s->ack++;			    s->state = _TIME_WAIT;			    send_ack(s);			} else {			    s->state = _FIN_WAIT_2;			    BSPLOG(bsp_log("_FIN_WAIT_1 --> _FIN_WAIT_2\n"));			}                        break; /* All done for now */		    }		}                /* At this point, no ACK for FIN has been seen, so check for                   simultaneous close */		if (tcp->flags & TCP_FLAG_FIN) {		    BSPLOG(bsp_log("_FIN_WAIT_1 --> _CLOSING\n"));		    __timer_cancel(&s->timer);		    s->ack++;		    s->state = _CLOSING;                    /* FIN is resent so the timeout and retry for this packet                       will also take care of timeout and resend of the                       previously sent FIN (which got us to FIN_WAIT_1). While                       not technically correct, resending FIN only causes a                       duplicate FIN (same sequence number) which should be                       ignored by the other end. */		    tcp_send(s, TCP_FLAG_FIN | TCP_FLAG_ACK, 0);		}		break;	      case _FIN_WAIT_2:		queued = handle_data(s, pkt);		if (tcp->flags & TCP_FLAG_FIN) {		    BSPLOG(bsp_log("_FIN_WAIT_2 --> _TIME_WAIT\n"));		    s->ack++;		    s->state = _TIME_WAIT;		    send_ack(s);		}		break;	      case _CLOSING:		if (tcp->flags & TCP_FLAG_ACK) {		    handle_ack(s, pkt);		    if (ntohl(tcp->acknum) == (s->seq + 1)) {			/* got ACK for FIN packet */			BSPLOG(bsp_log("_CLOSING --> _TIME_WAIT\n"));			__timer_cancel(&s->timer);			s->state = _TIME_WAIT;		    }		}		break;	      case _TIME_WAIT:		BSPLOG(bsp_log("_TIME_WAIT resend.\n"));		if (tcp->flags & TCP_FLAG_FIN)		    tcp_send(s, 0, 1); /* just resend ack */		break;	    }	} else {	    BSPLOG(bsp_log("Unexpected segment from: %d.%d.%d.%d:%d\n",			   r->ip_addr[0], r->ip_addr[1], r->ip_addr[3],			   r->ip_addr[4], ntohs(tcp->src_port)));	    send_reset(pkt, r);	}    }    if (!queued)	__pktbuf_free(pkt);}void__tcp_poll(void){    __enet_poll();    MS_TICKS_DELAY();    __timer_poll();}int__tcp_listen(tcp_socket_t *s, word port){    BSPLOG(bsp_log("tcp_listen: s[%p] port[%x]\n", s, port));    memset(s, 0, sizeof(tcp_socket_t));    s->state    = _LISTEN;    s->our_port = port;    s->pkt.buf = (word *)s->pktbuf;    s->pkt.bufsize = ETH_MAX_PKTLEN;    s->pkt.ip_hdr  = (ip_header_t *)s->pkt.buf;    s->pkt.tcp_hdr = (tcp_header_t *)(s->pkt.ip_hdr + 1);    s->next = tcp_list;#if 0    /* limit to one open socket at a time */    if (s->next) {	BSPLOG(bsp_log("tcp_listen: recursion error\n"));	BSPLOG(while(1));    }#endif        tcp_list = s;    return 0;}/* * SO_REUSEADDR, no 2MSL. */void__tcp_so_reuseaddr(tcp_socket_t *s){//    BSPLOG(bsp_log("__tcp_so_reuseaddr.\n"));    s->reuse = 0x01;}/* * Block while waiting for all data to be transmitted. */void__tcp_drain(tcp_socket_t *s){//    BSPLOG(bsp_log("__tcp_drain.\n"));    while (s->state != _CLOSED && s->data_bytes)	__tcp_poll();//    BSPLOG(bsp_log("__tcp_drain done.\n"));}/* * Close the tcp connection. */static voiddo_abort(void *s){    BSPLOG(bsp_log("do_abort: send RST\n"));    tcp_send((tcp_socket_t *)s, TCP_FLAG_ACK | TCP_FLAG_RST, 0);    __timer_cancel(&abort_timer);    ((tcp_socket_t *)s)->state = _CLOSED;    free_rxlist((tcp_socket_t *)s);    unlink_socket((tcp_socket_t *)s);}void__tcp_abort(tcp_socket_t *s, unsigned long delay){  __timer_set(&abort_timer, delay, do_abort, s);}/* * Close the tcp connection. */void__tcp_close(tcp_socket_t *s){    __tcp_drain(s);    if (s->state == _ESTABLISHED || s->state == _SYN_RCVD) {	BSPLOG(bsp_log("__tcp_close: going to _FIN_WAIT_1\n"));	s->state = _FIN_WAIT_1;	tcp_send(s, TCP_FLAG_ACK | TCP_FLAG_FIN, 0);    } else if (s->state == _CLOSE_WAIT) {	BSPLOG(bsp_log("__tcp_close: going to _LAST_ACK\n"));	s->state = _LAST_ACK;	tcp_send(s, TCP_FLAG_ACK | TCP_FLAG_FIN, 0);    }    free_rxlist(s);}/* * Wait for connection to be fully closed. */void__tcp_close_wait(tcp_socket_t *s){    BSPLOG(bsp_log("__tcp_close_wait.\n"));    while (s->state != _CLOSED)	__tcp_poll();    BSPLOG(bsp_log("__tcp_close_wait done.\n"));}/* * Read up to 'len' bytes without blocking. */int__tcp_read(tcp_socket_t *s, char *buf, int len){    int          nread;    pktbuf_t     *pkt;    tcp_header_t *tcp;    if (len <= 0 || s->rxcnt == 0)	return 0;    if (s->state != _ESTABLISHED && s->rxcnt == 0)	return -1;    nread = 0;    while (len) {	if (len < s->rxcnt) {	    memcpy(buf, s->rxptr, len);	    BSPLOG(bsp_log("tcp_read: read %d bytes.\n", len));	    s->rxptr += len;	    s->rxcnt -= len;	    nread    += len;	    BSPLOG(bsp_log("tcp_read: %d bytes left in rxlist head.\n",		       s->rxcnt));	    break;	} else {	    memcpy(buf, s->rxptr, s->rxcnt);	    BSPLOG(bsp_log("tcp_read: read %d bytes. pkt[%x] freed.\n",			   s->rxcnt, s->rxlist));	    nread += s->rxcnt;	    buf   += s->rxcnt;	    len   -= s->rxcnt;	    /* setup for next packet in list */	    pkt = s->rxlist;	    s->rxlist = pkt->next;	    __pktbuf_free(pkt);	    if ((pkt = s->rxlist) != NULL) {		tcp = pkt->tcp_hdr;		s->rxcnt = pkt->pkt_bytes - (tcp->hdr_len << 2);		s->rxptr = ((char *)tcp)  + (tcp->hdr_len << 2);		BSPLOG(bsp_log("tcp_read: next pkt[%x] has %d bytes.\n",			   s->rxlist, s->rxcnt));	    } else {		BSPLOG(bsp_log("tcp_read: no more data.\n"));		s->rxcnt = 0;		break;	    }	}    }    return nread;}/* * Write up to 'len' bytes without blocking */int__tcp_write(tcp_socket_t *s, char *buf, int len){    tcp_header_t *tcp = s->pkt.tcp_hdr;    if (len <= 0)	return 0;    if (s->state != _ESTABLISHED && s->state != _CLOSE_WAIT)	return -1;    if (s->data_bytes)	return 0;    if (len > MAX_TCP_DATA)	len = MAX_TCP_DATA;    memcpy(tcp + 1, buf, len);    s->data_bytes = len;    tcp_send(s, TCP_FLAG_ACK, 0);    return len;}/* * Write 'len' bytes from 'buf', blocking until sent. * If connection collapses, return -1 */int__tcp_write_block(tcp_socket_t *s, char *buf, int len){    int total = 0;    int n;    while (len) {        if (s->state == _CLOSE_WAIT) {            // This connection is tring to close            // This connection is breaking            if (s->data_bytes == 0 && s->rxcnt == 0)                __tcp_close(s);        }        if (s->state == _CLOSED) {            // The connection is gone!            return -1;        }        n = __tcp_write(s, buf, len);        if (n > 0) {            len -= n;            buf += n;        }        __tcp_poll();    }    __tcp_drain(s);    return total;}/* * Establish a new [outgoing] connection, with a timeout. */int __tcp_open(tcp_socket_t *s, struct sockaddr_in *host,            word port, int timeout, int *err){    // Fill in socket details    memset(s, 0, sizeof(tcp_socket_t));    s->state = _SYN_SENT;    s->our_port = port;    s->his_port = host->sin_port;    s->pkt.buf = (word *)s->pktbuf;    s->pkt.bufsize = ETH_MAX_PKTLEN;    s->pkt.ip_hdr  = (ip_header_t *)s->pkt.buf;    s->pkt.tcp_hdr = (tcp_header_t *)(s->pkt.ip_hdr + 1);    s->seq = (port << 16) | 0xDE77;    s->ack = 0;    if (__arp_lookup((ip_addr_t *)&host->sin_addr, &s->his_addr) < 0) {        diag_printf("%s: Can't find address of server\n", __FUNCTION__);        return -1;    }    s->next = tcp_list;    tcp_list = s;    // Send off the SYN packet to open the connection    tcp_send(s, TCP_FLAG_SYN, 0);    // Wait for connection to establish    while (s->state != _ESTABLISHED) {        if (s->state == _CLOSED) {            diag_printf("TCP open - host closed connection\n");            return -1;        }        if (--timeout <= 0) {            diag_printf("TCP open - connection timed out\n");            return -1;        }        MS_TICKS_DELAY();        __tcp_poll();    }    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99国产精品麻豆| 日韩欧美在线不卡| 亚洲日本在线天堂| 不卡视频在线观看| 国产精品初高中害羞小美女文| 成人理论电影网| 中文字幕在线观看一区二区| 成人一区在线观看| 中文字幕av一区二区三区高| 丁香激情综合国产| 亚洲免费观看高清完整版在线观看 | 成年人午夜久久久| 综合久久久久久| 免费看日韩a级影片| 久久99精品国产麻豆婷婷 | 亚洲一区av在线| 欧美剧情片在线观看| 看电视剧不卡顿的网站| 国产日产欧美一区二区视频| 日本不卡一区二区三区高清视频| 欧美日韩在线观看一区二区| 亚洲6080在线| 日韩欧美第一区| 成人av资源在线| 日韩激情中文字幕| 久久久精品影视| 欧美日免费三级在线| 国产精品一区二区久久不卡| 亚洲色图.com| 精品国产一二三| 在线免费不卡电影| 国产一区二区免费看| 亚洲制服丝袜在线| 国产欧美日韩视频一区二区| 欧美三级电影在线看| 国产不卡在线播放| 日韩黄色免费网站| 国产精品激情偷乱一区二区∴| 91精品国产乱| 91免费观看视频| 国产成人精品免费在线| 性感美女久久精品| 国产精品国产a级| 精品少妇一区二区三区视频免付费 | 欧美日韩国产免费一区二区 | 99精品视频中文字幕| 日本欧美在线观看| 亚洲精品自拍动漫在线| 久久精子c满五个校花| 欧美三级电影精品| 色综合久久天天| 国产高清在线观看免费不卡| 亚洲成人7777| 一区二区三区在线视频免费| 亚洲国产精华液网站w| 日韩欧美专区在线| 欧洲一区在线观看| av色综合久久天堂av综合| 黑人巨大精品欧美黑白配亚洲| 首页欧美精品中文字幕| 亚洲免费在线观看| 1000精品久久久久久久久| 久久久久久夜精品精品免费| 欧美成人一级视频| 日韩一区二区三区三四区视频在线观看| 色综合天天做天天爱| 丁香一区二区三区| 国产成人av福利| 裸体在线国模精品偷拍| 日本欧美韩国一区三区| 日韩不卡在线观看日韩不卡视频| 一区二区不卡在线视频 午夜欧美不卡在| 国产日韩v精品一区二区| 久久久久久久一区| 久久毛片高清国产| 国内精品伊人久久久久av一坑| 精品一区二区三区的国产在线播放| 亚洲v日本v欧美v久久精品| 亚洲一区在线播放| 亚洲影院久久精品| 亚洲无人区一区| 丝袜亚洲另类丝袜在线| 日日摸夜夜添夜夜添精品视频| 婷婷开心激情综合| 免费高清视频精品| 精品一区二区三区在线观看| 久久爱www久久做| 国产一区视频导航| 成人免费看黄yyy456| 91亚洲国产成人精品一区二区三| av男人天堂一区| 色综合久久久久网| 欧美日韩国产片| 精品成人一区二区三区四区| 久久久不卡网国产精品一区| 久久精品视频一区二区三区| 国产亚洲视频系列| 中文字幕一区二区三| 亚洲一区二区三区视频在线| 日韩成人免费在线| 国产一区不卡精品| 色综合天天综合狠狠| 欧美日韩国产三级| wwwwxxxxx欧美| 成人免费在线视频| 日韩高清不卡一区二区| 国产毛片精品一区| 色呦呦日韩精品| 欧美大尺度电影在线| 中文字幕亚洲区| 日本成人在线电影网| 成人永久看片免费视频天堂| 欧美日韩精品三区| 国产欧美一区在线| 亚洲国产一区二区在线播放| 九九久久精品视频| 色视频欧美一区二区三区| 91麻豆精品久久久久蜜臀| 国产日本一区二区| 亚洲精品欧美二区三区中文字幕| 欧美三级电影在线看| 亚洲欧美视频一区| 久久精品999| 91国内精品野花午夜精品| 精品国产伦一区二区三区免费| 国产精品免费久久| 美女一区二区三区在线观看| 97国产精品videossex| 日韩亚洲欧美一区二区三区| 中文字幕一区二区三区四区不卡| 捆绑变态av一区二区三区| 色一区在线观看| 久久久久久久久蜜桃| 日韩成人dvd| 91蜜桃视频在线| 久久久精品综合| 免费观看一级欧美片| 在线免费一区三区| 久久综合资源网| 日韩精品乱码免费| 日本高清不卡aⅴ免费网站| 久久综合久色欧美综合狠狠| 天天做天天摸天天爽国产一区| 91首页免费视频| 国产欧美一区二区精品性色超碰| 男人的j进女人的j一区| 欧美午夜影院一区| 亚洲欧美日韩国产综合| 国产福利一区二区三区视频| 91精品在线免费| 亚洲成人免费观看| 日本精品视频一区二区三区| 国产精品无码永久免费888| 激情综合网激情| 日韩欧美国产不卡| 日韩影院在线观看| 欧美日韩高清影院| 亚洲福利电影网| 欧美午夜影院一区| 伊人色综合久久天天| 99久久久久久| 中文字幕亚洲欧美在线不卡| 国产v日产∨综合v精品视频| 337p日本欧洲亚洲大胆色噜噜| 男人的j进女人的j一区| 欧美一级久久久久久久大片| 免费在线看成人av| 91麻豆精品国产91久久久使用方法 | 91久久香蕉国产日韩欧美9色| 中文字幕av不卡| 成人精品视频网站| 国产精品私人自拍| 成人综合婷婷国产精品久久蜜臀 | 欧美视频一区二区三区| 亚洲精品成a人| 91国偷自产一区二区使用方法| 一区二区三区在线播放| 91蜜桃免费观看视频| 一区二区三区精密机械公司| 欧美性猛交xxxx黑人交| 五月天亚洲精品| 日韩欧美国产高清| 国产一区视频网站| 国产精品福利在线播放| 色婷婷综合久久久| 亚洲电影一区二区| 日韩精品专区在线影院观看| 国产一区二区91| 国产精品三级视频| 在线国产亚洲欧美| 青青草91视频| 国产欧美日韩精品在线| 色乱码一区二区三区88| 日韩精品一二三四| 欧美精品一区二区精品网| 成人av资源网站| 天天操天天干天天综合网| 精品电影一区二区| 日本福利一区二区| 日本va欧美va欧美va精品|