帮助我理解这个TCP / IP代码片段

时间:2011-02-13 01:54:34

标签: c

我正在阅读“TCP / IP Lean”一书,我遇到了以下不明白的代码。有人能解释一下吗?

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 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

似乎是将len个数据从data复制到循环缓冲区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,即复制的字节数。