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

Создание однопотоковых параллельных серверов TCP

28.11.2015, 17:41. Показов 1712. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда происходит отправка данных клиенту, то виснет. Не могу разобрать где ошибка, в интернете тоже не нашел клиента к однопотоковому параллельному серверу!

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

Сервер:
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/signal.h> 
#include <sys/resource.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <netdb.h>
 
typedef long int li; 
 
struct Library{
    char title[50];
    char author[20];
    char year[16];
} lib[10];
 
int DoProcess(int fd)
{
    puts("rabotaet doProcess");
    long int newS;
    unsigned short n = 4, // переменная в которой будет храниться количество записей в структуре
        flag = 0,
        i = 0, j =0;
    char p, p1, s;
    char buf[256], b[256], temp2[10];
 
    do
    {
        recv(newS, temp2, sizeof(temp2), 0);
        p = temp2[0];
        puts(temp2);
        switch (p){
        case '1':
            n++; // переходим к свободному месту в структуре, чтобы занести новые данные
            recv(newS, buf, sizeof(buf), 0);
            strcpy(lib[n].title, buf);
            recv(newS, buf, sizeof(buf), 0);
            strcpy(lib[n].author, buf); 
            recv(newS, buf, sizeof(buf), 0);
            strcpy(lib[n].year, buf);
            break;
        case '2':
            buf[0] = '\0';
            recv(newS, buf, sizeof(buf), 0);
 
            for (i = 0; i <= n; i++)
            {
                if ((strcmp(lib[i].year, buf)) == 0) // если есть заданный год, то выводим на экран
                {
                    sprintf(buf, "Title: %s, Author: %s, Year: %s \n",
                        lib[i].title,
                        lib[i].author,
                        lib[i].year);
                    strcat(b, buf);
                    flag = 1;
                }
            }
 
            if (flag == 0)
            {
                char b[] = "Error\n";
                send(newS, (char *)b, sizeof(b), 0);
            }
            else
                send(newS, (char *)b, sizeof(b), 0); // выводим данные из структуры
 
            memset(b, 0, 256); // clear memory of array b
 
            break;
        case '3':
            for (i = 0; i <= n; i++)
            {
                buf[0] = '\0';
                strcat(buf, lib[i].title); strcat(buf, " ");
                strcat(buf, lib[i].author); strcat(buf, " ");
                strcat(buf, lib[i].year); strcat(buf, "\n");
                write(newS, buf, sizeof(buf));
            }
            break;
        case '4':
            recv(newS, buf, sizeof(buf), 0);
            int tempN = atoi(buf);
            for (i = tempN; i <=n; i++){
                strcpy(lib[i].title, lib[i+1].title);
                strcpy(lib[i].author, lib[i+1].author);
                strcpy(lib[i].year, lib[i+1].year); 
            }
            n--; // make counter less, because we delete data
            break;
        case '5':
            for (i = 1; i <= n; i++){
                for (j = n; j >= i; j--){
                    if(strcmp(lib[j-1].title, lib[j].title) > 0)
                    {
                    strcpy(b, lib[j-1].title);
                    strcpy(lib[j-1].title, lib[j].title);
                    strcpy(lib[j].title, b);
                    
                    strcpy(b, lib[j-1].author);
                    strcpy(lib[j-1].author, lib[j].author);
                    strcpy(lib[j].author, b);
 
                    strcpy(b, lib[j-1].year);
                    strcpy(lib[j-1].year, lib[j].year);
                    strcpy(lib[j].year, b);
                    }
                }
            }
            break;
        case '6':
            exit(0);
        }
    } while(1);
}
 
void main(){
    strcpy(lib[0].title, "C++");
    strcpy(lib[0].author, "Pavlovskaya");
    strcpy(lib[0].year, "1990");
 
    strcpy(lib[1].title, "C#");
    strcpy(lib[1].author, "Arxangelskij");
    strcpy(lib[1].year, "1995");
 
    strcpy(lib[2].title, "VisualC++");
    strcpy(lib[2].author, "Microsoft");
    strcpy(lib[2].year, "2006");
 
    strcpy(lib[3].title, "Java");
    strcpy(lib[3].author, "Petrov");
    strcpy(lib[3].year, "2007");
 
    strcpy(lib[4].title, "Html");
    strcpy(lib[4].author, "Ivanov");
    strcpy(lib[4].year, "2008");
 
    struct sockaddr_in sin;
    int s;
 
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(7500);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
 
    int alen,
        fd,
        nfds,
        ssock;
 
    s = socket(AF_INET, SOCK_STREAM, 0);
    bind(s, (struct sockaddr *)&sin, sizeof(sin));
    listen(s, 5);
    
    fd_set rfds;
    fd_set afds;
 
    nfds = getdtablesize();
    FD_ZERO(&afds);
    FD_SET(s, &afds);
 
    int newS;
    int k;
    do{
        memcpy(&rfds, &afds, sizeof(rfds));
        select(nfds, &rfds, NULL, NULL, NULL);
        if (FD_ISSET(s, &rfds)){
            alen = sizeof(sin);
            newS = accept(s, (struct sockaddr*)&sin, &alen);
            FD_SET(s, &afds);
        }
 
        for (fd = 0; fd<nfds; fd++)
        {
            if (fd != s && FD_ISSET(fd, &rfds))
            {
                if (DoProcess(fd) == 0){
                    (void)close(fd);
                    FD_CLR(fd, &afds);
                }
            }   
        }
    }while(1);
}
Клиент:

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
#include <sys/types.h>
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
int main(){
 
    struct sockaddr_in peer;
    int i, s, t, t1;
    short n = 4;
    int rc;
    char buf[256], p, p1, b[1024], temp2[10];
 
    peer.sin_family = AF_INET;
    peer.sin_port = htons(7500);
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    s = socket(AF_INET, SOCK_STREAM, 0);
    rc = connect(s, (struct sockaddr *)&peer, sizeof(peer));
 
    do
    {      
        puts("Choose:");
        puts("\t1 - Add");
        puts("\t2 - Search");
        puts("\t3 - View");
        puts("\t4 - Delete");
        puts("\t5 - Sort");
        puts("\t6 - Exit");
        scanf("%s", temp2);
        send(s, temp2, sizeof(temp2), 0);
        p = temp2[0];
 
        switch (p){
        case '1': 
            fflush(stdin); fflush(stdout);
            puts("Input name: "); scanf("%s", buf);
            send(s, buf, sizeof(buf), 0);
            puts("Input author: "); scanf("%s", buf);
            send(s, buf, sizeof(buf), 0);
            puts("Input year of book: "); scanf("%s", buf);
            send(s, buf, sizeof(buf), 0);
 
            n++; // increase counter, because we add data
            printf("Book add successfully\n");
            break;
        case '2': 
            puts("Input the year, which you want find: "); scanf("%s", buf);
            send(s, buf, sizeof(buf), 0);
 
            recv(s, buf, sizeof(buf), 0);
                printf("%s", buf); // выводим на экран
            break;
        
        case '3':
            for (i = 0; i <= n; i++)
            {
                read(s, &buf, sizeof(buf));
                printf("%s", buf);
            }
            break;
        case '4':
            printf("What number you want to delete?(0-%d)\n",n); scanf("%s", buf);
            send(s, buf, sizeof(buf), 0);
            n--; // make counter less, because we delete data
            break;
        case '5':
            printf("Sort Completed\n");
            break;
        case '6':
            exit(0);
        }
    }while(1);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2015, 17:41
Ответы с готовыми решениями:

Создание игровых серверов C++
Помогите пожалуйста создать сервер для игры Generals Zero Hour в жанре RTS Generals Zero Hour Спасибо за внимание

Создание много платформенных программ и серверов
Может кто посоветовал какой нибудь материал на данную тему(саиты, кныги) где можна было бы почитать, как говорится научится их созданию...

Создание внутреннего и внешнего серверов. Создание серверов автоматизации
Алгоритм создания: 1. Создайте приложение или DLL, которое должно выступать в роли сервера автоматиза-ции. Можно использовать любое ранее...

1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.11.2015, 22:18
Сделай в коде нормальную проверку ошибок.
Нормальная - т.е. хотя бы проверять, что send, recv и другие
функции возвращают успех. Про подсчет количества принятых и
отправленных байт я уже молчу, это "на закуску".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 22:18
Помогаю со студенческими работами здесь

Создание параллельных задач
Начал потихоньку изучать параллельное программирование. И вот, застрял на такой реальной задачи - есть функция которую требуется вычислить,...

Создание параллельных потоков
Здравствуйте! Помогите, пожалуйста, решить одну проблемку. Мне необходимо, чтобы в двух разных потоках параллельно производилась...

Создание двух серверов
Всем привет. В общем есть два сервера, один проверяет файл политики, второй основной, который принимает клиента после получения файла...

Создание SOCKS 5 серверов
Здравствуйте. Мне нужно научится создавать много своих сокс 5 прокси, есть один человек, он как то делает каждый день по 30к очень быстрых...

Создание цепочки прокси серверов...
Доброго времени суток:)! Подскажите пожалуйста программы: -при помощи которой можно выстроить цепочку из прокси серверов; ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru