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

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

?? tcp.c

?? 一個輕量tcpip協議在移植在ucOS2系統上運行
?? C
?? 第 1 頁 / 共 3 頁
字號:
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_connect():
 *
 * Connects to another host. The function given as the "connected"
 * argument will be called when the connection has been established.
 *
 */
/*-----------------------------------------------------------------------------------*/
err_t
tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
	    err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err))
{
  u32_t optdata;
  err_t ret;
  u32_t iss;

  DEBUGF(TCP_DEBUG, ("tcp_connect to port %u\n", port));
  if(ipaddr != NULL) {
    pcb->remote_ip = *ipaddr;
  } else {
    return ERR_VAL;
  }
  pcb->remote_port = port;
  if(pcb->local_port == 0) {
    pcb->local_port = tcp_new_port();
  }
  iss = tcp_next_iss();
  pcb->rcv_nxt = 0;
  pcb->snd_nxt = iss;
  pcb->lastack = iss - 1;
  pcb->snd_lbb = iss - 1;
  pcb->rcv_wnd = TCP_WND;
  pcb->snd_wnd = TCP_WND;
  pcb->mss = TCP_MSS;
  pcb->cwnd = 1;
  pcb->ssthresh = pcb->mss * 10;
  pcb->state = SYN_SENT;
#if LWIP_CALLBACK_API  
  pcb->connected = connected;
#endif /* LWIP_CALLBACK_API */  
  TCP_REG(&tcp_active_pcbs, pcb);
  
  /* Build an MSS option */
  optdata = htonl(((u32_t)2 << 24) | 
		  ((u32_t)4 << 16) | 
		  (((u32_t)pcb->mss / 256) << 8) |
		  (pcb->mss & 255));

  ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, (u8_t *)&optdata, 4);
  if(ret == ERR_OK) { 
    tcp_output(pcb);
  }
  return ret;
} 
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_slowtmr():
 *
 * Called every 500 ms and implements the retransmission timer and the timer that
 * removes PCBs that have been in TIME-WAIT for enough time. It also increments
 * various timers such as the inactivity timer in each PCB.
 */
/*-----------------------------------------------------------------------------------*/
void
tcp_slowtmr(void)
{
  struct tcp_pcb *pcb, *pcb2, *prev;
  u32_t eff_wnd;
  u8_t pcb_remove;      /* flag if a PCB should be removed */
  err_t err;
  
  err = ERR_OK;

  ++tcp_ticks;
  
  /* Steps through all of the active PCBs. */
  prev = NULL;
  pcb = tcp_active_pcbs;
  if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
  while(pcb != NULL) {
    DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
    LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
    LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
    LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);

    pcb_remove = 0;

    if(pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
      ++pcb_remove;
      DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
    }
    else if(pcb->nrtx == TCP_MAXRTX) {
      ++pcb_remove;
      DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
    } else {
      ++pcb->rtime;
      if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) {

	/* Time for a retransmission. */
        DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %u pcb->rto %u\n",
                               pcb->rtime, pcb->rto));

	/* Double retransmission time-out unless we are trying to
           connect to somebody (i.e., we are in SYN_SENT). */
	if(pcb->state != SYN_SENT) {
	  pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
	}

	tcp_rexmit(pcb);
	
        /* Reduce congestion window and ssthresh. */
        eff_wnd = MIN(pcb->cwnd, pcb->snd_wnd);
        pcb->ssthresh = eff_wnd >> 1;
        if(pcb->ssthresh < pcb->mss) {
          pcb->ssthresh = pcb->mss * 2;
        }
        pcb->cwnd = pcb->mss;

        DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %u ssthresh %u\n",
                                pcb->cwnd, pcb->ssthresh));
      }
    }
	  
    /* Check if this PCB has stayed too long in FIN-WAIT-2 */
    if(pcb->state == FIN_WAIT_2) {
      if((u32_t)(tcp_ticks - pcb->tmr) >
	 TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
        ++pcb_remove;
        DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n"));
      }
    }

    /* If this PCB has queued out of sequence data, but has been
       inactive for too long, will drop the data (it will eventually
       be retransmitted). */
#if TCP_QUEUE_OOSEQ    
    if(pcb->ooseq != NULL &&
       (u32_t)tcp_ticks - pcb->tmr >=
       pcb->rto * TCP_OOSEQ_TIMEOUT) {
      tcp_segs_free(pcb->ooseq);
      pcb->ooseq = NULL;
      DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
    }
#endif /* TCP_QUEUE_OOSEQ */

    /* Check if this PCB has stayed too long in SYN-RCVD */
    if(pcb->state == SYN_RCVD) {
      if((u32_t)(tcp_ticks - pcb->tmr) >
	 TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
        ++pcb_remove;
        DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
      }
    }


    /* If the PCB should be removed, do it. */
    if(pcb_remove) {
      tcp_pcb_purge(pcb);      
      /* Remove PCB from tcp_active_pcbs list. */
      if(prev != NULL) {
	LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
        prev->next = pcb->next;
      } else {
        /* This PCB was the first. */
        LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
        tcp_active_pcbs = pcb->next;
      }

      TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT);

      pcb2 = pcb->next;
      memp_free(MEMP_TCP_PCB, pcb);
      pcb = pcb2;
    } else {

      /* We check if we should poll the connection. */
      ++pcb->polltmr;
      if(pcb->polltmr >= pcb->pollinterval) {
	pcb->polltmr = 0;
        DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
	TCP_EVENT_POLL(pcb, err);
	if(err == ERR_OK) {
	  tcp_output(pcb);
	}
      }
      
      prev = pcb;
      pcb = pcb->next;
    }
  }

  
  /* Steps through all of the TIME-WAIT PCBs. */
  prev = NULL;    
  pcb = tcp_tw_pcbs;
  while(pcb != NULL) {
    LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
    pcb_remove = 0;

    /* Check if this PCB has stayed long enough in TIME-WAIT */
    if((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
      ++pcb_remove;
    }
    


    /* If the PCB should be removed, do it. */
    if(pcb_remove) {
      tcp_pcb_purge(pcb);      
      /* Remove PCB from tcp_tw_pcbs list. */
      if(prev != NULL) {
	LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
        prev->next = pcb->next;
      } else {
        /* This PCB was the first. */
        LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
        tcp_tw_pcbs = pcb->next;
      }
      pcb2 = pcb->next;
      memp_free(MEMP_TCP_PCB, pcb);
      pcb = pcb2;
    } else {
      prev = pcb;
      pcb = pcb->next;
    }
  }
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_fasttmr():
 *
 * Is called every TCP_FINE_TIMEOUT (100 ms) and sends delayed ACKs.
 */
/*-----------------------------------------------------------------------------------*/
void
tcp_fasttmr(void)
{
  struct tcp_pcb *pcb;

  /* send delayed ACKs */  
  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
    if(pcb->flags & TF_ACK_DELAY) {
      DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
      tcp_ack_now(pcb);
      pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
    }
  }
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_segs_free():
 *
 * Deallocates a list of TCP segments (tcp_seg structures).
 *
 */
/*-----------------------------------------------------------------------------------*/
u8_t
tcp_segs_free(struct tcp_seg *seg)
{
  u8_t count = 0;
  struct tcp_seg *next;
 again:  
  if(seg != NULL) {
    next = seg->next;
    count += tcp_seg_free(seg);
    seg = next;
    goto again;
  }
  return count;
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_seg_free():
 *
 * Frees a TCP segment.
 *
 */
/*-----------------------------------------------------------------------------------*/
u8_t
tcp_seg_free(struct tcp_seg *seg)
{
  u8_t count = 0;
  
  if(seg != NULL) {
    if(seg->p == NULL) {
      memp_free(MEMP_TCP_SEG, seg);
    } else {
      count = pbuf_free(seg->p);
#if TCP_DEBUG
      seg->p = NULL;
#endif /* TCP_DEBUG */
      memp_free(MEMP_TCP_SEG, seg);
    }
  }
  return count;
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_setprio():
 *
 * Sets the priority of a connection.
 *
 */
/*-----------------------------------------------------------------------------------*/
void
tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
{
  pcb->prio = prio;
}
/*-----------------------------------------------------------------------------------*/
/*
 * tcp_seg_copy():
 *
 * Returns a copy of the given TCP segment.
 *
 */ 
/*-----------------------------------------------------------------------------------*/
struct tcp_seg *
tcp_seg_copy(struct tcp_seg *seg)
{
  struct tcp_seg *cseg;

  cseg = memp_malloc(MEMP_TCP_SEG);
  if(cseg == NULL) {
    return NULL;
  }
  memcpy((char *)cseg, (const char *)seg, sizeof(struct tcp_seg)); 
  pbuf_ref(cseg->p);
  return cseg;
}
/*-----------------------------------------------------------------------------------*/
#if LWIP_CALLBACK_API
static err_t
tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
  arg = arg;
  if(p != NULL) {
    pbuf_free(p);
  } else if(err == ERR_OK) {
    return tcp_close(pcb);
  }
  return ERR_OK;
}
#endif /* LWIP_CALLBACK_API */
/*-----------------------------------------------------------------------------------*/
static void
tcp_kill_prio(u8_t prio)
{
  struct tcp_pcb *pcb, *inactive;
  u32_t inactivity;
  u8_t mprio;


  mprio = TCP_PRIO_MAX;
  
  /* We kill the oldest active connection that has lower priority than
     prio. */
  inactivity = 0;
  inactive = NULL;
  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
    if(pcb->prio <= prio &&
       pcb->prio <= mprio &&
       (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
      inactivity = tcp_ticks - pcb->tmr;
      inactive = pcb;
      mprio = pcb->prio;
    }
  }
  if(inactive != NULL) {
    DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB 0x%p (%ld)\n",
		       (void *)inactive, inactivity));
    tcp_abort(inactive);
  }      
}

/*-----------------------------------------------------------------------------------*/
static void
tcp_kill_timewait(void)
{
  struct tcp_pcb *pcb, *inactive;
  u32_t inactivity;

  inactivity = 0;
  inactive = NULL;
  for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
    if((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
      inactivity = tcp_ticks - pcb->tmr;
      inactive = pcb;
    }
  }
  if(inactive != NULL) {
    DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB 0x%p (%ld)\n",
		       (void *)inactive, inactivity));
    tcp_abort(inactive);
  }      
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看视频欧美| 亚洲一二三四区| 欧美一区午夜视频在线观看| 色一情一伦一子一伦一区| 不卡av在线免费观看| 成人美女视频在线观看| 成人晚上爱看视频| av高清久久久| 欧美色欧美亚洲另类二区| 欧美性受xxxx| 欧美电影在线免费观看| 欧美高清你懂得| 欧美mv和日韩mv国产网站| 国产欧美精品一区二区色综合朱莉| 精品国产污污免费网站入口| 久久香蕉国产线看观看99| 国产日韩影视精品| 亚洲视频电影在线| 美脚の诱脚舐め脚责91| 国产精品一区久久久久| 91在线国产福利| 在线不卡一区二区| 国产欧美一区二区精品久导航| 中文字幕不卡的av| 亚洲一区二区在线观看视频| 蜜臀a∨国产成人精品| 成人免费毛片片v| 欧美日韩高清一区| 国产亚洲制服色| 性做久久久久久免费观看| 韩国成人在线视频| 色婷婷av一区二区三区大白胸| 欧美一区二区三区成人| 国产精品黄色在线观看| 偷窥少妇高潮呻吟av久久免费| 美女在线观看视频一区二区| 不卡的av网站| 精品日韩一区二区三区| 亚洲美女免费在线| 国产乱淫av一区二区三区 | 精品粉嫩超白一线天av| 自拍偷拍欧美精品| 久久精品二区亚洲w码| 91丝袜美腿高跟国产极品老师 | 日本不卡一区二区三区| 成人黄色国产精品网站大全在线免费观看| 色久优优欧美色久优优| 国产农村妇女毛片精品久久麻豆 | 樱桃视频在线观看一区| 国产永久精品大片wwwapp| 欧美伦理视频网站| 亚洲精品高清在线| 成人爱爱电影网址| 久久亚洲精品国产精品紫薇| 日本成人超碰在线观看| 欧美视频在线不卡| 亚洲黄色免费网站| 91视频你懂的| 国产精品理论片在线观看| 精品一区二区日韩| 欧美一二三在线| 免费成人在线观看视频| 欧美精品一二三四| 亚洲综合色视频| 在线免费不卡电影| 亚洲精品亚洲人成人网在线播放| 成人免费毛片嘿嘿连载视频| 久久久久久久久久久久久久久99| 五月婷婷综合在线| 欧美日韩中文一区| 亚洲午夜久久久久| 欧美日韩专区在线| 视频一区二区中文字幕| 91麻豆精品91久久久久同性| 亚洲午夜精品网| 欧美精品三级日韩久久| 五月天欧美精品| 欧美一区二区三级| 日韩成人精品在线| 精品久久久久一区| 国产suv精品一区二区三区| 久久综合九色综合97_久久久| 精品一区二区三区在线播放视频| 日韩女优制服丝袜电影| 开心九九激情九九欧美日韩精美视频电影| 欧美丝袜丝nylons| 美女网站视频久久| 久久久久久亚洲综合影院红桃| 高清国产午夜精品久久久久久| 国产日本亚洲高清| av在线播放不卡| 亚洲h精品动漫在线观看| 日韩一区二区在线观看视频| 极品尤物av久久免费看| 国产精品午夜春色av| 一本大道综合伊人精品热热 | 中文字幕av免费专区久久| 91久久国产综合久久| 午夜精品免费在线| 国产婷婷色一区二区三区四区| a亚洲天堂av| 日韩电影在线观看一区| 国产亚洲欧美在线| 欧美色综合网站| 国产一区二区成人久久免费影院| 国产精品美女一区二区| 在线成人小视频| 国产成人日日夜夜| 亚洲一区二区欧美激情| 精品国偷自产国产一区| 91社区在线播放| 久久精品国产一区二区三区免费看 | 艳妇臀荡乳欲伦亚洲一区| 日韩午夜电影av| 91女厕偷拍女厕偷拍高清| 日本欧美在线观看| 亚洲美女精品一区| 久久久综合精品| 欧美日韩国产三级| av成人老司机| 国内外精品视频| 亚洲国产精品一区二区久久 | 99re成人精品视频| 极品少妇一区二区三区精品视频| 亚洲欧美激情在线| 国产日本一区二区| 精品久久人人做人人爰| 欧美久久婷婷综合色| 99精品久久免费看蜜臀剧情介绍| 免费精品视频在线| 亚洲国产中文字幕| 亚洲精品视频在线观看免费| 久久久久久久一区| 欧美一级在线免费| 欧美日韩国产影片| 欧美自拍偷拍午夜视频| www.亚洲免费av| 成人在线综合网| 国产91丝袜在线18| 国产一区二区三区免费| 老司机精品视频线观看86| 亚洲一区二区三区美女| 亚洲精品欧美二区三区中文字幕| 2020国产精品自拍| 精品美女在线播放| 精品成人一区二区| 久久久久久日产精品| 久久久亚洲精品一区二区三区| 精品少妇一区二区三区免费观看 | 日韩欧美一区二区久久婷婷| 7777精品久久久大香线蕉| 欧美日韩精品欧美日韩精品一综合| 91美女片黄在线| 91豆麻精品91久久久久久| 色欧美乱欧美15图片| 日本精品一区二区三区高清| 色激情天天射综合网| 欧美熟乱第一页| 欧美一区二区三区的| 欧美岛国在线观看| 久久久不卡影院| 国产精品久久久久影院亚瑟| 欧美韩国日本不卡| 最新国产成人在线观看| 一区二区三区欧美日| 亚洲国产一区二区三区| 美女视频黄免费的久久| 国产一区激情在线| 床上的激情91.| 欧美综合一区二区三区| 51久久夜色精品国产麻豆| 日韩一区二区精品在线观看| 精品国产露脸精彩对白| 国产精品美女一区二区| 亚洲成人一区二区在线观看| 日韩成人一区二区| 国产成人在线免费| 色999日韩国产欧美一区二区| 欧美日韩高清影院| 国产日韩欧美不卡| 亚洲成人精品一区二区| 国产麻豆视频一区二区| 97久久人人超碰| 精品久久久久久最新网址| 中文字幕亚洲欧美在线不卡| 婷婷成人综合网| 国产传媒欧美日韩成人| 欧美三级资源在线| 国产午夜精品一区二区三区视频| 亚洲女人小视频在线观看| 免费一级片91| 91视频www| 久久久久久久综合狠狠综合| 一区二区欧美在线观看| 精品亚洲国内自在自线福利| 色哟哟国产精品| 国产农村妇女毛片精品久久麻豆| 亚洲成av人片一区二区三区| 国产成人免费视频网站高清观看视频| 91久久一区二区|