我有一个 RDT header 类,它包含用于实现多个可靠数据传输协议(protocol)的信息。我需要将该信息(总共 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,但它会清除我所有的 header 字段。知道如何让它发挥作用吗?
谢谢,
埃里克·R。
编辑:
这是我的 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
字段充当后者的“字符串”的零终止符调用正在打印。
干杯,
– 阿尔夫
关于c++ - 为什么 memcpy 无法正常运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3911689/