Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных через именнованый канал 
:(
    Опции темы
iPlay
Дата 20.4.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Если не тяжело кто-нибудь может набросать пример передачи данных через именованный канал. Т.е. вообще собираюсь писать задание типа: Клиент вводит имя файла исходника и файла  конечного и передает данные через именованный канал серверу(в исходнике хранится текст который сервер обработает и передаст результат клиенту, который данные запишет в файл результат). 

Если можно пример реализации в обших чертах.
PM MAIL   Вверх
MAKCim
Дата 20.4.2008, 11:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(iPlay @  20.4.2008,  10:40 Найти цитируемый пост)
Если можно пример реализации в обших чертах. 

1. сервер создает канал для входных сообщений (man mkfifo)
2. клиент создает канал для получения ответа сервера
3. через write() клиент пишет запрос серверу (передавая идентификатор канала для получения ответа)
4. сервер получает запрос, парсит переданный идентификатор канала
выполняет действия с входным потоком данных и пишет результат в канал клиента 

Это сообщение отредактировал(а) MAKCim - 20.4.2008, 11:09


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 20.4.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



С первым пунктом я разобрался будет выглядеть вот так:
Код

//server.c

#include <unistd.h> 
#include <stdio.h>
#include <fcntl.h>

#define PERM 0777                     

int file_descript;                                        
int fifo_descript_r;                                     
                       
int main(void)
{
  printf("\n\t.:SERVER:.\n\n");

  if (( mkfifo("fifo",PERM,0)) < 0 ){
   perror("\n\tError (server - mkfifo)");
   return 0;
}
  if ( (fifo_descript_r = open("fifo",O_RDONLY)) < 0 ){
   perror("\n\tError (server - open fifo)");
   return 0;
}
  close(fifo_descript_r);                     
  return 0;
}


Второй пункт тоже вроде разобрался:
Код

//client.c
#include <stdio.h>
#include <fcntl.h>

int fifo_descript_w;                                     

int main(void)
{
  printf("\n\t.:CLIENT:.\n\n");
  if ( (fifo_descript_w=open("fifo",O_WRONLY)) < 0 ){
   perror("\n\tError (client - open fifo)");
   return 0;
}
  close(fifo_descript_w);                  
  return 0;
}


Непонял 3й пункт и 4й что нужно сделать.
PM MAIL   Вверх
MAKCim
Дата 20.4.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(iPlay @  20.4.2008,  14:07 Найти цитируемый пост)
Непонял 3й пункт и 4й что нужно сделать. 

клиент должен создать еще один канал и передать его идентификатор серверу вместе с запросом
сервер пишет ответ в этот канал


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 20.4.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Тоесть получается вот так: 

Код

//client.c
#include <stdio.h>
#include <fcntl.h>

int fifo_descript_w;                                     
int fifo_descript_sw;
                                     
int main(void)
{
  printf("\n\t.:CLIENT:.\n\n");
  if ( (fifo_descript_w=open("fifo",O_WRONLY)) < 0 ){
   perror("\n\tError (client - open fifo)");
   return 0;
}
  
  if (( mkfifo("fifo_2",PERM,0)) < 0 ){
   perror("\n\tError (server - mkfifo)");
   return 0;
}
  if ( (fifo_descript_sw = open("fifo_2",O_RDONLY)) < 0 ){
   perror("\n\tError (server - open fifo)");
   return 0;
}
  write(fifo_descript_w,fifo_descript_sw,1);
  close(fifo_descript_w); 
  return 0;
}


Похоже на правду или я ошибаюсь?

Это сообщение отредактировал(а) iPlay - 20.4.2008, 16:20
PM MAIL   Вверх
MAKCim
Дата 20.4.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay, 
вот код (без проверки на ошибки)
Код

typedef struct {
    size_t length;
    char name[MAX_NAME];
} header_t;
...
char data[MAX_DATA + sizeof(header_t)];
header_t * header = (header_t*)data;
int fd_r, fd_w;
fd_w = open(SERVER, O_WRONLY);
mkfifo(CLIENT, 0777); /* CLIENT - абсолютный путь к каналу клиента */
header -> length = strlen(CLIENT);
strcpy(header -> name, data);
write(fd_w, data, MAX_DATA + sizeof(header_t));
fd_r = open(CLIENT, O_RDONLY);
...



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 21.4.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



А можно с файла считывать строки с помощью fgets чтобы потмо строки обрабатывать с помощью STL. В частности в этом коде.

Код

#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>

std::string swap_words(const std::string& s)
{
    std::stringstream ss(s);
    typedef std::vector<std::string> V;
    V v;

    std::copy(
        std::istream_iterator<std::string>(ss),
        std::istream_iterator<std::string>(),
        std::back_inserter(v));
    if (v.size() & 1)
        throw std::exception("Нечетное количество слов");
    for(size_t i=0; i <= v.size()/2; i += 2)
        std::swap(v[i], v[i+1]);
    ss.clear();
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(ss, " "));
    return ss.str();

}

PM MAIL   Вверх
iPlay
Дата 6.5.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



В чем тут проблема не могу понять... Вот написал код
Код

//client
#define _STRLEN_ 256

int main(){
    const char *source_file=  "input.txt";
    char source[8], dest[8];

    FILE *f_s = fopen(source_file, "r+");
    if (!f_s){
       printf ("error ...\nfile \"%s\" not found\n", source_file);
       return 0;
     }

    char s_buff_1[_STRLEN_];
    char s_buff_2[_STRLEN_];
    fscanf (f_s, "%s %s", s_buff_1,s_buff_2);
    printf("%s %s",s_buff_1,s_buff_2);

    mkfifo("clsrv",0700);    
    mkfifo("srvcl",0700);

    FILE *f_clsrv = fopen("clsrv", "w");
    fprintf(f_clsrv, "%s %s", s_buff_1,s_buff_2);
    //transmission complete
    
    FILE *f_srvcl = fopen("srvcl", "r");
    fscanf (f_srvcl, "%s %s", s_buff_1,s_buff_2);
    printf("%s %s",s_buff_1,s_buff_2);

    return 0;
}


Код

//serv
#define _STRLEN_ 256

int main(){
  
  FILE *f_clsrv = fopen("clsrv", "r");    
  char ch_buff_1[_STRLEN_];
  char ch_buff_2[_STRLEN_];
  //*ch_buff_1 = 0;
  //*ch_buff_2 = 0;
  fscanf(f_clsrv, "%s %s", ch_buff_1,ch_buff_2);
  printf("%s %s",ch_buff_1,ch_buff_2);
  //getting data sucessfull
  
   FILE *f_srvcl = fopen("srvcl", "w");
   fprintf(f_srvcl, "%s %s",ch_buff_2, ch_buff_1);

  return 0;
}

Не могу понять в чем проблема. Данные от клиента к серверу передать получилось а вот теже данные но обратно в клиент НЕТ. В консоле две проги тупо висят и всё...
PM MAIL   Вверх
bsa
Дата 7.5.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



iPlay, клиентом открывай оба потока сразу при запуске.
А вообще, рекомендую обратить внимание на сокеты (если нужны именованые, то PF_UNIX). Они больше подходят для двустороннего обмена информацией.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.