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

[C] клиент-сервер

14.12.2012, 22:00. Показов 628. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, объясните, пожалуйста, эту прогу.
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define oops(m,x) {perror(m); exit(x);}
int run_unpack(int *, int *);
int run_ui(int *, int *);
int main(void)
{
 
    int pid;
    int to_unpack[2], from_unpack[2];
 
    /*образовать два канала*/
    if(pipe(to_unpack) == -1 || pipe(from_unpack) == -1)
    {
        oops("pipe failed", 1);
    }
 
    /*создать два процесса*/
    switch(fork())  
        {
            case -1: 
                oops("ошибка fork",1);     
                break;
            case 0: 
                printf("Порожденный процесс pid=%d\n",getpid());
                run_unpack(to_unpack,from_unpack);
            default:
                printf("Родительский процесс pid=%d\n",getpid());
                run_ui(to_unpack, from_unpack);
                wait(NULL);
        }
}
 
int run_unpack(int in [2], int out [2])
{
    if(dup2(in[0],0) == -1) /*дублирование дескриптора конца для чтения в дескриптор 0*/
    {
        oops("dc: cannot redirect stdin",3);
    }
 
    close(in[0]);   /*уже продублировали in[0] в 0, будем читать данные через дескриптор 0*/
    close(in[1]); /*закрываем записываемый конец канала*/
 
    if(dup2(out[1],1) == -1)    /*дублирование дескриптора конца для записи в дескриптор 1*/
    {
        oops("run_unpack: cannot redirect stdout",4);
    }
    close(out[1]);  /*уже продублировали out[1] в 1, будем записывать данные через дескриптор 1*/
    close(out[0]); /*закрываем читаемый конец канала*/
    execlp("./unpack","./unpack", NULL);
    oops("cannot run unpack",5);
}
 
 
int run_ui(int to_unpack[2], int from_unpack[2])
{
    unsigned int r; /* код состояния */
    unsigned int e; /* признак ошибки */
    unsigned int w; /* признак занятости */
    unsigned int u; /* количество байт */
    unsigned int UnitStateWord; /*слово состояния */
    FILE *fin, *fout;
    int i;
 
    close(to_unpack[0]); /*не производить чтение из канала к unpack*/
    close(from_unpack[1]); /*не записывать в канал из unpack*/
 
    fout = fdopen(to_unpack[1],"w"); /*преобразовать файловые дескрипторы*/
    fin = fdopen(from_unpack[0],"r"); /*в потоки*/
 
    if (fout == NULL || fin == NULL)
 
    {
        fprintf(stderr, "Ошибка: не удалось преобразовать каналы в потоки");
        exit(1);
    }
        for (i =0; i<2; i++)
        {
            printf("Введите упакованое слово состояния устройства (0 - 65535) >");
            scanf("%u",&UnitStateWord);
            if (fprintf(fout, "%u\n", UnitStateWord) == EOF)
            {
                fprintf(stderr, "Ошибка: не удалось записать в канал");
                exit(1);
            }
 
            fflush(fout);
 
            if (fscanf(fin, "%u %u %u %u",&r,&e,&w,&u) <= 0)
            {
                break;
            }
            
            printf("Код состояния: %u\n",r);
            printf("Признак ошибки: %u\n",e);
            printf("Признак занятости: %u\n",w);
            printf("Кол-во переданных байт: %u\n",u);
        
            }
    fclose(fout);
    fclose(fin);    
}
2.2 Листинг программы сервера.
 
#include <stdio.h>
int main(void)
 
{
  unsigned int r; /* код состояния */
  unsigned int e; /* признак ошибки */
  unsigned int w; /* признак занятости */
  unsigned int u; /* количество байт */
  unsigned int UnitStateWord; /*слово состояния */
  /* формирование упакованного кода */
        while (scanf("%u",&UnitStateWord) != EOF)
    {
        /*fprintf(stderr,"unpack schital %u\n",UnitStateWord);*/
        r=(UnitStateWord>>7)&1;
        e=(UnitStateWord>>5)&1;
        w=(UnitStateWord>>6)&1;
        u=(UnitStateWord>>8)&0xFF;
  /* вывод результата */
        printf("%u %u %u %u\n", r,e,w,u);
        fflush(stdout);
  /*fprintf(stderr,"unpack vivel %u %u %u %u\n", r,e,w,u);*/
        }
}
интересует, зачем дублировать дискриптор
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2012, 22:00
Ответы с готовыми решениями:

Приложение клиент-сервер
Реализовать приложение клиент-сервер на очередях сообщений и на семафорах и разделяемой памяти. В обоих вариантах клиент отправляет серверу...

Падает программа клиент-сервер
Помогите пожалуйста! Закрываю сервер, падает клиент. Самое главное, что в клиенте, не могу понять, вроде все обрабатываю правильно Код:...

Клиент-сервер (функция read)
Что должна возвращать функция read, если я пытаюсь считать данные, но сервер мне их не отсылал? И должна ли? Потому что у меня просто...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2012, 22:00
Помогаю со студенческими работами здесь

Клиент и сервер в одной программе
Здравствуйте. Вот код: #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; #include &lt;netinet/in.h&gt; #include &lt;unistd.h&gt; #include...

Низкоуровневые сокеты. Udp клиент-сервер
Здравствуйте.Помогите пожалуйста поправить код сервера,принимающего сообщение от клиента и выводящего его на экран.клиент компилируется,а...

Чат (Сервер|Клиент) с UDP протоколом
Всем Привет, вообщем задача написать простенький чат c использованием UDP протокола. Для начала я написал эхо-сервер (1 сервер - 1...

Клиент сервер не работает через интернет
Делаю сетевую консольную игрушку для курсача, если подключатся через 127.0.0.1 или через локальный ip то все работает, но когда пытаюсь...

Клиент-Сервер с удаленным выполнением команд
Доброго времени суток, есть задача, с помощью сокетов выполнять на сервере команду введенную клиентом и возвращать клиенту. Например -...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru