我正在阅读“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);
}
答案 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
,即复制的字节数。