2011-02-13 141 views
0

我正在阅读“TCP/IP Lean”一书,并且我遇到了下面的代码,我不明白。任何人都可以向我解释吗?帮我理解这个TCP/IP代码片段

WORD buff_in(CBUFF *bp, BYTE *data, WORD len) 
{ 
    WORD in, n, n1, n2; 
    in = (WORD)bp->in & (bp->len-1); 
    n = minw(len, buff_freelen(bp)); 
    n1 = minw(n, (WORD)(bp->len - in)); 
    n2 = n - n1; 
    if (n1 && data) memcpy(&bp->data[in], data, n1); 
    if (n2 && data) memcpy(bp->data, &data[n1], n2); 
    bp->in += n; 
    return(n); 
} 
+2

`CBUFF`不是标准数据类型。不知道它的结构和目的,很难回答这个问题。 – 2011-02-13 02:04:04

回答

0

你真的应该给这个代码更多的上下文。 WORD可能是4字节长,因为这是TCP/IP内部。

它似乎与将数据从C缓冲区复制到IPv4数据包有关。这两个memcpy调用似乎是交换两个数据块。

如果你能解释buff_in的输入应该代表什么,这将有所帮助。 CBUFF有点误导,因为它显然是某种结构。也许只是一个长度字节,然后是数据缓冲区,但如果您确实告诉我们,它会有所帮助。

0

它似乎是从data复制到len字节的数据到循环缓冲区bp

bp->len是循环缓冲区的长度,必须是2的幂,并且bp->in是循环缓冲区中的下一个字节将被写入的索引。 buff_freelen(bp)返回循环缓冲区中的可用空间量,minw()返回两个参数中的最小值。

n设置为要复制的字节数,提供的最小值len或目标缓冲区中的可用空间量。然后它将其分成两个块 - n1,它从bp->data[in]开始复制,并在bp->data[bp->len - 1]和和n2(可能为零长度)之前或之后完成,复制起始于bp->data[0]

它前进bp->in并返回n,复制的字节数。