LWIP之TCP層發送相關

2009-5-11 LWIP現在我們正式開始進入對TCP處理過程被分割爲六個功能函數的實現:tcp_input(), tcp_process(), tcp_receive()【用於TCP文件來分析一下:我們知道這裏的函數都是被socket這個函數,當然這期間也做了不少工作,最主要的就是把發送數據的指針放到了msg長度
這個函數的最直接調用有以下幾個:
available = tcp_sndbuf(conn->pcb.tcp);
err = tcp_write(conn->pcb.tcp, dataptr, len, conn->write_msg->msg.w.apiflags);
err = tcp_output_nagle(conn->pcb.tcp);
err = tcp_output(conn->pcb.tcp);
 
的重要性。
#define          tcp_sndbuf(pcb)   ((pcb)->snd_buf)//那就繼續跟蹤這個pcb的時候調用了do_newconn的話有以下代碼
msg->conn->pcb.tcp = tcp_new();
<span times="" new="" roman';="" mso-hansi-font-family:="" 'times="" roman'"="" style="padding: 0px; margin: 0px; color: black; font-family: 宋體; ">哈哈,還記得吧,在前面我討論到了這裏,就沒有再討論了。嗯,現在開始吧。
* Creates a new TCP protocol control block but doesn't place it on
* any of the TCP PCB lists.
* The pcb is not put on any list until binding using tcp_bind().
struct tcp_pcb * tcp_new(void)
{
  return tcp_alloc(TCP_PRIO_NORMAL);
}
pcb×××××××××××××××××××××××××××××××××××××××【當然是tcp分別檢查了3pcb】、tcp_tw_pcbs【處於監聽狀態的pcbs函數更有意思,它分別檢查了4【處於已經綁定但還沒有連接或者監聽pcbs相同的pcb鏈表中了。
對的,別的可以先不管,這就是我們要找的東西
           pcb->snd_queuelen = 0;
           pcb->rcv_wnd = TCP_WND;
           pcb->rcv_ann_wnd = TCP_WND;
           pcb->tos = 0;
           pcb->ttl = TCP_TTL;
           /* The send MSS is updated when an MSS option is received. */
           pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
           pcb->rto = 3000 / TCP_SLOW_INTERVAL;
           pcb->sa = 0;
           pcb->sv = 3000 / TCP_SLOW_INTERVAL;
           pcb->rtime = -1;
           pcb->cwnd = 1;
           iss = tcp_next_iss();
           pcb->snd_wl2 = iss;
           pcb->snd_nxt = iss;
           pcb->snd_max = iss;
           pcb->lastack = iss;
           pcb->snd_lbb = iss;  
           pcb->tmr = tcp_ticks;
      
            pcb->polltmr = 0;
 
#if LWIP_CALLBACK_API
           pcb->recv = tcp_recv_null;
#endif /* LWIP_CALLBACK_API */ 
   
           /* Init KEEPALIVE timer */
           pcb->keep_idle  = TCP_KEEPIDLE_DEFAULT;
   
#if LWIP_TCP_KEEPALIVE
           pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
           pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;
#endif /* LWIP_TCP_KEEPALIVE */
 
           pcb->keep_cnt_sent = 0;
      }
      return pcb;
}好了,下面接着走,該輪到tcp_write
err_t tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags)
{
  /* connection is in valid state for data transmission? */
  if (pcb->state == ESTABLISHED ||
     pcb->state == CLOSE_WAIT ||
     pcb->state == SYN_SENT ||
     pcb->state == SYN_RCVD)
{
if (len > 0)
{
      return tcp_enqueue(pcb, (void *)data, len, 0, apiflags, NULL, 0);
    }
    return ERR_OK;
  }
else
{
    return ERR_CONN;
  }
}
下面的這個tcp_enqueue()函數以實現發送數據,接着tcp_write段,然後再把這些TCP咱們接着上面往下看,tcp_output_nagle來實現的。這個函數或許比tcp_enqueue。文檔是這麼解釋的:tcp_output報頭字段,接着就使用ip_route<span times="" new="" roman';="" mso-hansi-font-family:="" 'times="" roman'"="" style="padding: 0px; margin: 0px; color: black; font-family: 宋體; ">或者ip_output_if<span times="" new="" roman';="" mso-hansi-font-family:="" 'times="" roman'"="" style="padding: 0px; margin: 0px; color: black; font-family: 宋體; ">函數發送數據。
 

本文出自 “bluefish” 博客,請務必保留此出處http://bluefish.blog.51cto.com/214870/158415

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章