Member 11112168 Ответов: 1

Как управлять указателями при использовании инея в contiki?


Привет, в моем сценарии у меня есть 2 узла: отправитель и получатель.

узел 1 отправляет пакеты получателю, а запрос представляет собой массив указателей char на некоторые строки:

packetbuf_copyfrom(request[i], strlen(request[i]));

А в приемнике я хочу, чтобы добавить пакеты к списку :

но когда я хочу распечатать список полученных пакетов, он печатает только последний полученный пакет, т. е. все элементы списка указывают на последнюю строку.

Как мне управлять указателями, чтобы решить эту проблему?

Что я уже пробовал:

#include "contiki.h"

#include "dev/leds.h"

#include <stdio.h>
#define MAX_RECORD 20
struct record{
	struct record *next;
	char* message;

};
MEMB(record_memb, struct record,MAX_RECORD);
LIST(record_list);
/*---------------------------------------------------------------------------*/
PROCESS(example_unicast_process, "Example unicast");
AUTOSTART_PROCESSES(&example_unicast_process);
/*---------------------------------------------------------------------------*/
static void
recv_uc(struct unicast_conn *c, const linkaddr_t *from)
{
  printf("unicast message received from %d.%d : %s\n",
	 from->u8[0], from->u8[1],(char *)packetbuf_dataptr());
char* temp = (char *)packetbuf_dataptr();
struct record *n; 

n = memb_alloc(&record_memb);
 
n-> message = temp; 

list_add(record_list,n);
for(n = list_head(record_list); n != NULL; n = n->next) {

  printf(" = %s \n", n->message);
}//end for
  

}
static const struct unicast_callbacks unicast_callbacks = {recv_uc};
static struct unicast_conn uc;
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(example_unicast_process, ev, data)
{
  PROCESS_EXITHANDLER(unicast_close(&uc);)
    
  PROCESS_BEGIN();

  unicast_open(&uc, 146, &unicast_callbacks);
  static int i = 1;
  while(1) {
    static struct etimer et;
    linkaddr_t addr;
    
    etimer_set(&et, CLOCK_SECOND);
    
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
 char * arr= "hello";
if(i == 2 ){
    i = 1; packetbuf_copyfrom("hello", 5);
} else {  packetbuf_copyfrom("good bye baby", 14); i = 2; }
 
    addr.u8[0] = 1;
    addr.u8[1] = 0;
    if(!linkaddr_cmp(&addr, &linkaddr_node_addr)) {
      unicast_send(&uc, &addr);
    }

  }

  PROCESS_END();
}
/*------------

Richard MacCutchan

Где находится код для list_xxx функции?

Member 11112168

Либ/список.ч

1 Ответов

Рейтинг:
11

Jochen Arndt

Цитата:
но когда я хочу распечатать список полученных пакетов, он печатает только последний полученный пакет, т. е. все элементы списка указывают на последнюю строку.
Это потому, что message член вашего record структура-это char* указатель, который установлен в packetbuf_dataptr() для всех добавленных элементов. Этот пакетный буфер содержит вне курса всегда последнее полученное сообщение.

Вы должны выделить память для строк и скопировать их:
n = memb_alloc(&record_memb);
n->message = malloc(1 + strlen(temp));
strcpy(n->message, temp);
list_add(record_list,n);
Обратите внимание, что вы удалили выделенную память при удалении элементов из списка и перед удалением самого списка.


Member 11112168

Спасибо Йохен