Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
nakseg

rpc. Связка клиент сервер и написания лог файла.

28.12.2010, 15:35. Показов 2060. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста... Клиент собрал, а вот сервер не собирается:


Bash
1
2
3
4
5
6
7
naks@naks-O:~$ cc -o server_log ~/kurs/log_svc.c ~/kurs/log.c
/home/naks/kurs/log.c: In function ‘rlog’:
/home/naks/kurs/log.c:17: warning: return makes integer from pointer without a cast
/home/naks/kurs/log.c:25: warning: return makes integer from pointer without a cast
/tmp/ccnQAw1c.o: In function `log_prog_1':
log_svc.c:(.text+0x4a): undefined reference to `rlog_1_svc'
collect2: ld returned 1 exit status
log.x:

C
1
2
3
4
5
program LOG_PROG {
version LOG_VER {
int RLOG (string) = 1;
} = 1;
} = 0x31234567;
log.h

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */
 
#ifndef _LOG_H_RPCGEN
#define _LOG_H_RPCGEN
 
#include <rpc/rpc.h>
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#define LOG_PROG 0x31234567
#define LOG_VER 1
 
#if defined(__STDC__) || defined(__cplusplus)
#define RLOG 1
extern  int * rlog_1(char **, CLIENT *);
extern  int * rlog_1_svc(char **, struct svc_req *);
extern int log_prog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
 
#else /* K&R C */
#define RLOG 1
extern  int * rlog_1();
extern  int * rlog_1_svc();
extern int log_prog_1_freeresult ();
#endif /* K&R C */
 
#ifdef __cplusplus
}
#endif
 
#endif /* !_LOG_H_RPCGEN */
log_svc.c

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */
 
#include "/home/naks/kurs/log.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
 
static void
log_prog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
    union {
        char *rlog_1_arg;
    } argument;
    char *result;
    xdrproc_t _xdr_argument, _xdr_result;
    char *(*local)(char *, struct svc_req *);
 
    switch (rqstp->rq_proc) {
    case NULLPROC:
        (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
        return;
 
    case RLOG:
        _xdr_argument = (xdrproc_t) xdr_wrapstring;
        _xdr_result = (xdrproc_t) xdr_int;
        local = (char *(*)(char *, struct svc_req *)) rlog_1_svc;
        break;
 
    default:
        svcerr_noproc (transp);
        return;
    }
    memset ((char *)&argument, 0, sizeof (argument));
    if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
        svcerr_decode (transp);
        return;
    }
    result = (*local)((char *)&argument, rqstp);
    if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
        svcerr_systemerr (transp);
    }
    if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
        fprintf (stderr, "%s", "unable to free arguments");
        exit (1);
    }
    return;
}
 
int
main (int argc, char **argv)
{
    register SVCXPRT *transp;
 
    pmap_unset (LOG_PROG, LOG_VER);
 
    transp = svcudp_create(RPC_ANYSOCK);
    if (transp == NULL) {
        fprintf (stderr, "%s", "cannot create udp service.");
        exit(1);
    }
    if (!svc_register(transp, LOG_PROG, LOG_VER, log_prog_1, IPPROTO_UDP)) {
        fprintf (stderr, "%s", "unable to register (LOG_PROG, LOG_VER, udp).");
        exit(1);
    }
 
    transp = svctcp_create(RPC_ANYSOCK, 0, 0);
    if (transp == NULL) {
        fprintf (stderr, "%s", "cannot create tcp service.");
        exit(1);
    }
    if (!svc_register(transp, LOG_PROG, LOG_VER, log_prog_1, IPPROTO_TCP)) {
        fprintf (stderr, "%s", "unable to register (LOG_PROG, LOG_VER, tcp).");
        exit(1);
    }
 
    svc_run ();
    fprintf (stderr, "%s", "svc_run returned");
    exit (1);
    /* NOTREACHED */
}
В log.h rlog_1_svc определена внешне. Значит искать её нужно в log_svc.c, но там только:
C
1
local = (char *(*)(char *, struct svc_req *)) rlog_1_svc;
мб я в log.x накосячил?

Добавлено через 2 минуты
log.c

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <rpc/rpc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include </home/naks/kurs/log.h> 
 
int rlog (char **arg) 
{
/*Возвращаемое значение должно определяться как static*/ 
static int result;
int fd; /*Файловый дескриптор журнала*/ 
int len;
result = 1;
 
/*0ткроем файл журнала (создадим, если он не существует), 
в случае неудачи вернем код ошибки result == 1.*/ 
if ((fd=open( "~/loggin/server.log", O_CREAT | O_RDWR | O_APPEND)) < 0) return (&result);
len = strlen(*arg); 
 
if (write(fd, *arg, strlen(*arg)) != len)
result = 1; 
else
result = 0; 
close (fd); 
return(&result); /*Возвращаем результат - адрес result*/
}
Добавлено через 1 час 49 минут
За помощь готов отблагодарить материально. Нужно срочно и я подавлен и в отчаяние
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2010, 15:35
Ответы с готовыми решениями:

Связка клиент (Objtctive C) - сервер (Java)
Здравствуйте. Данный проект разрабатывается, для приема сообщений с помощью Ipad поступающих с сервера. Среди вариантов есть использование...

Как работает связка клиент-сервер (apache-php-mysql)?
верна ли схема web сервера, php, mysql, apache, noip? Нарисовал схемку взаимодействия клиента с web-сервером с apache, php, mysql и...

Клиент-сервер на основе SocketTCP архитектура написания
Добрый день Гуру, есть у меня задача: Необходимо написать клиент - серверную программу. Сервер на базе WinServer 2012 R2 и БД MSSQL 2012....

2
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2010, 16:02
Цитата Сообщение от nakseg Посмотреть сообщение
undefined reference to `rlog_1_svc'
где тело этой функции?
0
nakseg
29.12.2010, 14:43
в том то и дело. rpc компилятор её не создал О_О. Я же отписался подробно, чтобы не было этого вопроса.

Мб я что то напутал в log.x?! Не могла бы Вы поюзать rpcgen log.x на своей машине. Может он что то другое соберёт? x_x

Добавлено через 1 час 21 минуту
Меня осенило. rlog_1_svc не должен появляться сам. rpc строит шаблон. а rlog_1_svc описываем в log.c (свой файл)

в log.c заменяем :
C
1
int rlog (char **arg)
на :
C
1
int *rlog_1_svc (char **arg, struct svc_req * req)
Добавлено через 11 минут
Помогите теперь поправить варнинг...


Bash
1
2
3
naks@naks-O:~$ cc -c ~/kurs/client.c ~/kurs/log_clnt.c
/home/naks/kurs/client.c: In function ‘main’:
/home/naks/kurs/client.c:32: warning: assignment makes pointer from integer without a cast
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <rpc/rpc.h>
#include "log.h" 
#include <stdlib.h>
main(int argc, char *argv[])
{
CLIENT *cl;
char *server, *mystring, *clnttime; 
time_t bintime;
int *result;
if (argc != 2) { 
fprintf(stderr, "Формат вызова: %s Адрес_хоста\n",
argv [0]); 
exit (1) ;
}
 
server = argv [1];
 
/*Получим дескриптор клиента. В случае неудачи - сообщим о 
невозможности установления связи с сервером*/
 
if ( (cl = clnt_create (server, LOG_PROG, LOG_VER, "udp")) == NULL) 
{
clnt_pcreateerror (server); 
exit (2); 
}
 
/*Выделим буфер для строки*/
mystring = (char * )malloc (100); 
 
/*0пределим время события*/
bintime = time((time_t *) NULL);
clnttime = ctime(&bintime );
sprintf (mystring, "%s - Клиент запущен", clnttime);
 
/*Передадим сообщение для журнала - время начала работы клиента. 
В случае неудачи - сообщим об ошибке*/ 
if ( (result = rlog_1(&mystring, cl)) == NULL) {
fprintf(stderr, "error2\n"); 
clnt_perror(cl, server); 
exit(3); 
}
 
/*B случае неудачи на удаленном компьютере сообщим об ошибке*/ 
if (*result !=0 )
fprintf(stderr, "Ошибка записи в журнал\n"); 
 
/*0свободим дескриптор*/ 
clnt_destroy(cl);
exit (0);
}

в случае выполнения с варнингом:

naks@naks-O:~$ ~/client_log localhost
Ошибка записи в журнал

Добавлено через 19 часов 26 минут
Всё поправил. Спасибо мне, что не пропил моск до конца! И Никсману за ап!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2010, 14:43
Помогаю со студенческими работами здесь

Языки программирования для написания приложения клиент -сервер
Здравствуйте, подскажите, пожалуйста, с помощью каких языков можно написать клиентское приложение для работы с субд (Sql server от...

Что необходимо знать, для написания программы сервер-клиент?
В идеале хочу написать сервер для своей игры, сделанной на Unity. Но понимаю, что без хорошей (ну или, хотя бы, средней) базы я этого...

Взаимодействие WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер
Здравствуйте. Интересует информация о взаимодействии WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер через ОРС-инфтерфейс. ...

Клиент-серверное приложение на С с использованием RPC
Имеется такая проблема. С использованием RPC реализовать клиент-серверное приложение. На вход клиенту задается имя файла, которое...

Клиент-сервер, открытие файла
Здравствуйте. Пишу клиент-серверное приложение. Такая задача: клиент должен считать текстовый файл и поместить его содержимое в Memo, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru