Помогите мне понять этот фрагмент кода TCP / IP - PullRequest
0 голосов
/ 13 февраля 2011

Я читаю книгу "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 голосов
/ 13 февраля 2011

Кажется, что он копирует до len байтов данных из data в кольцевой буфер bp.

bp->len - это длина циклического буфера и должна быть степенью двойки, а bp->in - это индекс в циклическом буфере, в который должен записываться следующий байт. buff_freelen(bp) возвращает количество свободного места в циклическом буфере, а minw() возвращает минимум двух аргументов.

n устанавливается на количество копируемых байтов, минимум предоставленного len или объем свободного места в целевом буфере. Затем он разбивает это на два фрагмента - n1, который копируется, начиная с bp->data[in] и заканчивая на или до bp->data[bp->len - 1], и n2 (возможно, нулевой длины), который копируется, начиная с bp->data[0].

Опережает bp->in и возвращает n, количество скопированных байтов.

0 голосов
/ 13 февраля 2011

Вы действительно должны дать больше контекста этого кода.Длина WORD, вероятно, составляет 4 байта, поскольку это внутреннее устройство TCP / IP.

Похоже, что-то связано с копированием данных из буфера C в пакет IPv4.Кажется, что два вызова memcpy обмениваются двумя кусками данных.

Было бы полезно, если бы вы могли объяснить, что должны представлять входные данные для buff_in.CBUFF немного вводит в заблуждение, потому что это явно какая-то структура.Может быть, просто байт длины, за которым следует буфер данных, но это поможет, если вы нам точно скажете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...