Почему Memcpy не работает должным образом?

StackOverflow https://stackoverflow.com/questions/3911689

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня есть класс для заголовка RDT, который содержит информацию для реализации нескольких надежных протоколов передачи данных. Мне нужно прикрепить эту информацию (в общей сложности 12 байтов) к моему буфере для отправки, чтобы перенести ее через розетку. Я пытаюсь использовать Memcpy для этого, но по какой -то причине он просто оставляет мусор внутри буфера. Ниже приведена строка кода, которая не работает. (Rdt_hdr_size определяется как 12).

Определение переменных, которые передаются этой функции.

char payload[] = "sample code sample code";
int payload_size = sizeof(payload) ; 
int pktsize = payload_size + sizeof( RdtHeader )+1 ; // 1 byte for NULL-terminated
char * send_buf = new char[pktsize];

Функция с Memcpy, у которой есть проблемы.

unsigned int Sender::CreateSegment( char * buf, 
         char payload[], int payload_size, unsigned long seqnum ) {
     RdtHeader * header = (RdtHeader *) buf; 
     // set rdt fields:
     header->ack = 0; 
     header->fin = 0; 
     header->ok = 0; 
     header->seq = seqnum; 
     header->win = 0;
     header->syn = 0;
     memcpy( buf+RDT_HDR_SIZE, payload, payload_size );

     return (payload_size + RDT_HDR_SIZE + 1);
}

Если я возьму rdt_hdr_size, полезная нагрузка назначена должным образом BUF, однако она вытирает все мои полки заголовка. Есть идеи, как заставить это работать?

Спасибо,

Эрик Р.

РЕДАКТИРОВАТЬ:

Вот код для моего класса Rdtheader - возможно, он будет полезен.

class RdtHeader{    // 12-byte header 
public: 
//1-byte flags field
    u_char protocol:2;      // 2 bits: protocol type = 0 for RDT3, 1 for GBN, and 2 for STCP    
    u_char syn:1;           // 1 bit: SYN = 1 for connection setup  
    u_char fin:1;           // 1 bit: FIN = 1 for termination
    u_char ok:1;            // 1 bit: OK = 1 receiver agrees, SYN_OK or FIN_OK
    u_char reserved:3;      // 3 bits: unused

    u_char unused;          // 1-byte unused filed; 

    u_short win;            // 2-byte receiver window size (the number of packets)
    u_long seq;             // 4-byte sequence number
    u_long ack;             // 4-byte ack number
}; 
Это было полезно?

Решение

Это может быть слишком очевидно, но как именно вы осматриваете буфер?

Ты пытался

printf( "%s\n", send_buf + sizeof(RdtHeader) );

?

Если вместо этого вы делаете ...

printf( "%s\n", send_buf );

... тогда ты должен ожидать Чтобы увидеть только мусор (с правильной работой), так как win Полевые выступают в качестве нулевого следовника для «строки», которую этот последний вызов печатает.

Ура и хет.,

- Альф.

Другие советы

Как сказал Марк, посмотрите на Sizeof (rdtheader). Внутри структуры может быть некоторая прокладка (тем более что есть длинный INT), который отбросит расчеты.

Но кроме этого я не вижу здесь очевидной проблемы. Я бы попытался добавить несколько распечаток, если вы запускаете ее в среде, где это возможно, или попробовать отладчик. Возможно, реальная проблема в другом месте вашего кода.

memcpy(header + 1, payload, payload_size + 1);
return sizeof(*header) + payload_size + 1;
  • Ты таинственно возвращаешь дополнительное 1, Предполагая, что полезная нагрузка является строкой с нулевым концевым. Вы можете скопировать этот терминатор, так что он включен в последний memcpyпараметр.
  • С помощью header Указатель на расчет пункта назначения MEMCPY, вам никогда не придется отменять, если изменится типы, в частности, если вы измените тип buf. Анкет Вы можете полагаться на тот факт, что C ++ позволяет X * чтобы ухудшиться void * Чтобы избежать уродливого кастинга.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top