我正在尝试改进RPL协议,因此已经实现了新的控制消息。我可以发送整数,但不能发送ip地址。有人可以帮忙吗?我正在使用位于rpl-icmp6.c
的文件contiki/core/net/rpl
。
这是我的第一个函数,正在接收数据:
static void
tru_input(void)
{
int trustValue;
uip_ipaddr_t *trustAddr;
unsigned char *buffer;
buffer = UIP_ICMP_PAYLOAD;
trustValue = buffer[0];
memcpy(&trustAddr, buffer[1], 16);
PRINT6ADDR(trustAddr);
}
这是发送数据的功能:
void
tru_output(uip_ipaddr_t *addr, uip_ipaddr_t *trustAddr, int *trustValue)
{
unsigned char *buffer;
buffer = UIP_ICMP_PAYLOAD;
buffer[0] = &trustValue;
memcpy(buffer[1], &trustAddr, 16);
uip_icmp6_send(addr, ICMP6_RPL, RPL_CODE_TRU, 1);
}
我收到一个java.lang.ArrayIndexOutOfBoundsException:-1。有谁能够帮助我?
编辑:
这是我的新代码,可以正常工作:
static void
tru_input(void)
{
int trustValue;
uip_ipaddr_t trustAddr;
unsigned char *buffer;
buffer = UIP_ICMP_PAYLOAD;
trustValue = buffer[0];
memcpy(&trustAddr, buffer + 1, 16);
PRINT6ADDR(trustAddr);
PRINTF("\n");
}
/*---------------------------------------------------------------------------*/
void
tru_output(uip_ipaddr_t *addr, uip_ipaddr_t *trustAddr, int trustValue)
{
/*Array OF byte: Find out how to enter all the bytes into the PAYLOAD. */
unsigned char *buffer;
buffer = UIP_ICMP_PAYLOAD;
buffer[0] = trustValue;
memcpy(buffer + 1, trustAddr, 16);
uip_icmp6_send(addr, ICMP6_RPL, RPL_CODE_TRU, 17);
}
最佳答案
memcpy(&trustAddr, buffer[1], 16);
您正在将指向buffer [1](即char)的值对应到指向trustAddr的值
我认为您想传递buffer [1]的地址:
memcpy(&trustAddr, buffer + 1, 16);
tru_output中也是如此(您无需将trustAddr的ponter传递给memcpy,因为您已经将其声明为指针了:
memcpy(buffer+1, trustAddr, 16);
我看到您还需要初始化16字节的trustAddr,因为您是将内存处理到随机内存区域,所以不要将trustAddr声明为指针:
uip_ipaddr_t trustAddr;