我有一个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,但它会清除所有标头字段。知道如何让这个工作吗?
谢谢,
Eric 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
};
答案 0 :(得分:2)
正如马克所说,看看sizeof(RdtHeader)。结构中可能有一些填充(特别是因为那里有一个long int)会抛出计算结果。
但除此之外,我在这里看不到明显的问题。如果您在可行的环境中运行它,或尝试使用调试器,我会尝试添加一些打印输出。可能真正的问题出在代码的其他地方。
答案 1 :(得分:2)
这可能太明显了,但究竟你是如何检查缓冲区的?
你试过吗
printf( "%s\n", send_buf + sizeof(RdtHeader) );
如果您正在做...
printf( "%s\n", send_buf );
...那么你应该期望只看到垃圾(操作正确),因为win
字段作为后一个调用正在打印的“字符串”的零终结符
干杯&第h。,
- Alf
答案 2 :(得分:0)
memcpy(header + 1, payload, payload_size + 1);
return sizeof(*header) + payload_size + 1;
1
,表明有效载荷是
以null结尾的字符串。你可能会
想复制那个终结者,所以就是这样
包含在上一个memcpy
参数。header
指针来计算memcpy目标,如果类型发生更改,您将永远不必进行强制转换,特别是如果您更改buf
的类型。您可以依赖于C ++允许X *
降级为void *
以避免难以投射的事实。