0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14

Эхо-сервер

18.01.2020, 21:55. Показов 1391. Ответов 0

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Пишу эхо-сервер и возникла проблема с созданием вектора из массивов char`ов для буфера клиента.
Подскажите, пожалуйста, как лучше записать? Ниже прикреплю код сервера.

Заранее спасибо за ответы!

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
#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <string.h>
#include <system_error>
 
#define CHECK(func) \
    if ((func) == -1) \
    { \
        throw std::system_error(errno, std::generic_category()); \
    }
 
int BUF_SIZE =  100;
 
int main (int argc, char *argv[])
{
    int server_fd = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0);
 
    union { sockaddr_in sain; sockaddr sa; } addr{}; // инициализация нулями
    addr.sain.sin_family = AF_INET; // IPv4
    addr.sain.sin_port = htons(22222);
    addr.sain.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // 127.0.0.1 
    // или inet_aton("127.0.0.1", &addr.sin_addr.s_addr);
 
    bind(server_fd, &addr.sa, sizeof(addr)); // присвоить адрес (имя) сокету
    listen(server_fd, SOMAXCONN);  // ожидать соединений
    std::vector<pollfd> fds{{server_fd,POLLIN}}; // добавить сервер
 
    poll(fds.data(), fds.size(), -1); // опросить дескрипторы
    
    std::vector<char []> buffs; // данные
    std::vector<int> is_send;  // все отправили, что было получено, или нет 
    std::vector<int> size_remaining_data; // сколько осталось отправить, если не все отправилось
 
    for (size_t i = 0; i < fds.size(); ++i) 
    {
        const pollfd& f = fds[i];
 
        if (f.revents == 0) { continue; }
 
        if (f.fd == server_fd) 
        { // прием новых соединений
            int client_fd = accept4(server_fd, 0, 0, SOCK_NONBLOCK);
            fds.push_back({client_fd, POLLIN|POLLOUT}); // добавить клиента
            char buff[BUF_SIZE];
            buffs.push_back(buff);
            is_send.push_back(1);
            size_remaining_data.push_back(0);
 
        } 
        else // чтение/запись в существующие соединения
 
        {   
            int valread;
            int valsend;
            if (is_send[i]) // все предыдущее отправлено 
            {
                CHECK(valread = recv(f.fd, buffs[i], BUF_SIZE, 0));
                CHECK(valsend = send(f.fd, buffs[i], BUF_SIZE, 0));
 
                if (valsend != BUF_SIZE) // не все отправилось
                {
                    is_send[i] = 0;
                    size_remaining_data[i] = BUF_SIZE - valsend;
                }
                else // все отправилось
                {
                    is_send[i] = 1;
                }
            }
            else // что-то не смогли отправить в прошлый раз
            {
                char new_buff[size_remaining_data[i]];
                memcpy(new_buff,buffs[i] + (BUF_SIZE - size_remaining_data[i]), size_remaining_data[i]); // копируем те данные, которые надо отправить
                CHECK(valsend = send(f.fd, new_buff, size_remaining_data[i], 0));
 
                if (valsend != size_remaining_data[i]) // если и в этот раз не все отправилось
                {
                    is_send[i] = 0;
                    size_remaining_data[i] = size_remaining_data[i] - valsend;
                }
                else // все остатки отправили 
                {
                    is_send[i] = 1;
                }
            }           
        } 
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2020, 21:55
Ответы с готовыми решениями:

Комментарии к коду эхо-клиент/эхо-сервер
Ребятки ,нужна очень ваша помощь !!! кому не тяжело напишите пожалуйста коментарии к кодам (((код не мой ,но его нужно по заданию...

Параллельный эхо-сервер
Добрый день! Мне нужно на базе шаблона параллельного эхо-сервера, использующего модель “один клиент – один процесс”, разработать UDP...

Ошибка "Соединение не установлено" при реализации эхо сервера
Здравствуйте. Попробовала перевести свой С код эхо клиента на С++. До этого он прекрасно работал и программка эхо сервера подсоединялась к...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2020, 21:55
Помогаю со студенческими работами здесь

консоль эхо сервер
Разработать простейший TCP echo сервер. Требования Запускается на IP адресе 0.0.0.0 и TCP порту 2222 Получает сообщения...

Эхо-сервер с неблокирующим сокетом
Здравствуйте, уважаемые форумчане. Пишу эхо-сервер, основной функционал работает, но нужно сделать его неблокирующим, для обслуживания...

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

SIP - телефон: эхо сервер
Привет всем! Получил задание на курсовой написать эхо сервер для SIP-телефонии. Рассматриваю вариант application server based. Мне...

TCP-эхо клиент-сервер (WinSock)
Здравствуйте! Подскажите, пожалуйста, почему TCP-эхо клиент-сервер неправильно работает? Сервер отправляет клиенту правильно только первую...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

Новые блоги и статьи
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