У меня есть класс для заголовка RDT, который содержит информацию для реализации нескольких надежных протоколов передачи данных. Мне нужно прикрепить эту информацию (всего 12 байт) к моему буферу отправки, чтобы передать его по сокету. Я пытаюсь использовать memcpy для этого, но по какой-то причине он просто оставляет мусор в буфере. Ниже приведена строка кода, которая не работает. (RDT_HDR_SIZE определяется как 12).Почему memcpy не работает должным образом?
Определение переменных, передаваемых этой функции.
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, однако он стирает все мои поля заголовка. Любая идея, как заставить это работать?
Спасибо,
Eric R.
EDIT:
Вот код для моего класса 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
};
Вы пробовали использовать SizeOf (RdtHeader), а не жесткого кодирования размер буфера? – 2010-10-12 04:31:08