Я создавал сервер-клиентское приложение на основе RPC.как вернуть массив из функции
У меня есть struct
называется event
, который содержит:
int type_id
long int time
У меня есть функция в сервере, который возвращает (event*
):
event *
log_1_svc(event *argp, struct svc_req *rqstp)
{
static event* result;
result = (struct event*)malloc (3 * sizeof (struct event));
while (i <3)
{
result[i].type_id = i;
result[i].time = i;
i++;
}
return &result
}
То, что я хочу, чтобы получить результаты на стороне клиента используя этот указатель.
Вот код на сайте клиента:
log_prog_1(char *host,int client_type,int type_id,long int time)
{
event *result_1;
result_1 = log_1(&log_1_arg, clnt); // this calls the function in server and gurantee that the result is returned an address to pointer
int i =0;
while (i<3)
{
printf ("Type: %d\n",result_1[i].type_id);
printf ("Time: %ld\n",result_1[i].time);
[CODE][/CODE]
i++;
}
}
Этот код работает, но это, кажется, что она возвращает адреса не значения (цифры, приведенные в клиентском терминале отличается от тех, в терминале сервера).
Я попытался дать возвращение сервера result
:
return result;
не адрес результата (как написано выше):
return &result;
Он работал, но только первый элемент правильно печатается в терминале клиента , остальные 2 элемента - 0.
Просьба предоставить мне решение и спасибо заранее:)
Этот код не компилируется: вы возвращаете '& result', который имеет тип' event ** '. Пожалуйста, напишите какой-нибудь реальный код. –
Кроме того, причина, по которой вы не можете заставить это работать, заключается в том, что ваш клиент и сервер (предположительно) два отдельных процесса и, следовательно, имеют независимые адресные пространства. Нельзя видеть память другого. Вам нужно будет изучить «общую память», если вы хотите перенести исходные указатели. –
@ OliCharlesworth, даже с разделяемой памятью блоки памяти, вероятно, не будут иметь тот же адрес.Вместо необработанного указателя вы хотите использовать смещение в блоке разделяемой памяти. –