Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38

Сервер на С, linux

14.01.2023, 00:46. Показов 4978. Ответов 29

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Начну новую тему по серверу. Это по большей части тема-просьба (тут на форуме их много, но все старые, многие без ответов), у меня необходимость, а кому-то может будет интересно.
Нужен сервер, принимающий определённые данные.

В качестве каркаса взял (пока для ознакомления, т.к. с сокетами и серверами вообще никогда не работал) такой код:

Сервер:
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
#include    "unp.h"
#include    <time.h>
 
int
main(int argc, char **argv)
{
    int                 listenfd, connfd;
    struct sockaddr_in  servaddr;
    char                buff[MAXLINE];
    time_t              ticks;
 
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
 
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port        = htons(13);   /* daytime server */
 
    bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
 
    listen(listenfd, LISTENQ);
 
    for ( ; ; ) {
        connfd = accept(listenfd, (SA *) NULL, NULL);
 
        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        write(connfd, buff, strlen(buff));
 
        close(connfd);
    }
}
Клиент:
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
#include    "unp.h"
 
int
main(int argc, char **argv)
{
    int                 sockfd, n;
    char                recvline[MAXLINE + 1];
    struct sockaddr_in  servaddr;
 
    if (argc != 3)
        //err_quit("usage: a.out <IPaddress>");
        printf("usage: a.out <IPaddress> \n");
 
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        //err_sys("socket error");
        {printf("socket error \n");
        exit (1);}
 
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port   = htons(atoi(argv[2])); /* daytime server */
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        //err_quit("inet_pton error for %s", argv[1]);
        printf("inet_pton error for %s\n",argv[1]);
 
    if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
        //err_sys("connect error");
        {printf("connect error \n");
        exit (2);}
 
    while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
        recvline[n] = 0;    /* null terminate */
        if (fputs(recvline, stdout) == EOF)
            //err_sys("fputs error");
            {printf("fputs error \n");
        exit (3);}
    }
    if (n < 0)
        //err_sys("read error");
        {printf("read error \n");
        exit (4);}
 
    exit(0);
}
Результат:

Вложение 1395326

Вложение 1395327



Код клиента немного модифицировал, добавив ему параметр передачи порта, т.к. в примере, серверу почему-то порт назначается рандомно, хотя и прописан жестко. Ещё не разбирался с этой проблемой.

Пы.сы.: ищу единомышленников, буду размещать этот текст на других форумах. Клиентом в дальнейшем будет железяка и данные нужно будет принимать другие.

У меня не хватает времени на изучение вопроса, потому и решил написать в сообществе.

Сразу же отвечу на предполагаемый вопрос: нет, мне никто не платит за это, это больше хобби (пока), но есть планы. Следовательно если рассчитываете сразу заработать, на данном этапе не выйдет.
Вложения
Тип файла: 7z daytimetcpsrv.7z (4.9 Кб, 0 просмотров)
Тип файла: 7z daytimetcpcli.7z (5.0 Кб, 0 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2023, 00:46
Ответы с готовыми решениями:

1с сервер linux + сервер лицензий на windows
Привет! Установленная инфраструктура: Есть установленный кластер 1с (из дистрибутива deb64_8_3_18_1334.tar взятого с официального...

Сервер на Linux
Есть сервер на linux где деплоится приложение. Когда подключаешься к серверу через sftp то там рутовая папка это стандартная файловая...

Сервер на основе Linux
Подскажите как в Linux вырубать инет\печать\флешки\биос в КЦ ?

29
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
19.05.2023, 23:07  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Eddy_Em Посмотреть сообщение
О, какой жуткий код!
Код уже давно другой И да он жуткий. Но, как могу.
Первые посты это был тест а получится ли хотя-бы запустить.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Либо каждому клиенту по потоку
Пока так.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Все жду: когда же это уже в 64-битную систему перейдет?
Что именно, "это"?

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Вот и лепят люди от безнадежности убогие виртуалки
Это прямо уж такие убогие и лепят? Это изолированная среда, с ограниченными ресурсами. Вот сломается ваш сервер с "4096 ядер, и парой терабайт оперативки", что делать будете, из бекапа восстановите? + более гибкое управление ресурсами, резервирование, развертывание, и т.д...

Цитата Сообщение от Eddy_Em Посмотреть сообщение
чтобы не расходовать возможности сервера попусту!
Смотря какая виртуализация. И какой сервер. Если вы какой-нибудь третий пень поставите, то тогда конечно ни на что ресурсов не хватит, кроме контейнеров.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
убогий путь ардуинщика
Даже не в этом дело. на php ту же резидентку не сделаешь. Так можно на скорую руку протестить что-либо.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Зачем усложнять, если не требуется веб-морда?
так не обязательно использовать веб-морду. Это для быстрого развертывания подойдёт "Так можно на скорую руку протестить что-либо.".

В перспективе ещё прикручивание шифрования, как к клиенту, так и к серверу. Пока слабо представляю как это делать.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.05.2023, 04:42
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Увы, в линуксе до сих пор количество потоков/процессов ограничено убогими 65534 штуками (т.к. init занял нулевой). Все жду: когда же это уже в 64-битную систему перейдет?
Эм… Чего?..
Bash
1
2
 cat /proc/sys/kernel/pid_max
4194304
Добавлено через 1 минуту
Bash
1
2
ulimit -u
55436
Добавлено через 2 минуты
Цитата Сообщение от simonC Посмотреть сообщение
Даже не в этом дело. на php ту же резидентку не сделаешь. Так можно на скорую руку протестить что-либо.
Нормальный tcp-реверс-прокси вы в принципе не рассматриваете? Типа nginx или haproxy.
0
Нарушитель
448 / 890 / 106
Регистрация: 23.11.2021
Сообщений: 5,217
Записей в блоге: 19
20.05.2023, 08:23
simonC, шифрование делается при помощи openssl. Я делал с проверкой обоих сертификатов (и сервера, и клиента) - чтобы без паролей работать. Но можно только серверу сертификат, тогда придется БД с логинами и хешами паролей заводить.
Кстати, при POST-запросах веб-морде шапку можно не отправлять, проверено. Но таки веб-морду лучше всего вебсокетами подключать: а) только один раз за сессию надо аутентификацию делать, б) не нужно 10 раз в секунду поллить сервер, чтобы важные события не пропустить.
Но во многих вещах я пошел по пути наименьшего сопротивления: открываю локальный TCP-сокет, а удаленный доступ обеспечиваю ssh-тунеллированием. В таком случае ни TLS заморачиваться не надо, ни БД с хешами паролей.

Добавлено через 3 минуты
Рыжий Лис, вот именно, что по умолчанию де-факто pid_t 16-битный. А должен быть 64-битным!
Помните, еще сравнительно недавно на 64-битной архитектуре size_t был 32-битным и приходилось макросы писать для работы с файлами? Вот, стоило бы и pid_t также сделать 64-битным. А то вот пойдет 256-битная архитектура, а мы как в каменном веке...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.05.2023, 08:28
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Рыжий Лис, вот именно, что по умолчанию де-факто pid_t 16-битный. А должен быть 64-битным!
Не знаю, откуда вы это взяли.
C
1
#define __PID_T_TYPE            __S32_TYPE
Вон без проблем запущен процесс:
Bash
1
2
cat /proc/169807/stat
169807 (htop)
0
Нарушитель
448 / 890 / 106
Регистрация: 23.11.2021
Сообщений: 5,217
Записей в блоге: 19
20.05.2023, 08:29
Рыжий Лис, разницу между 32 и 64 видите?
А здесь еще и знаковый, хоть pid_t не может быть меньше нуля.
И в лимитах всегда по умолчанию число меньше 65536...
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
20.05.2023, 10:50  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Нормальный tcp-реверс-прокси вы в принципе не рассматриваете? Типа nginx или haproxy.
Я не знаю зачем это мне
Не рассматривал изначально. Может пригодится. в паре с сервером, прикручу какой-нибудь механизм к нему.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
шифрование делается при помощи openssl. Я делал с проверкой обоих сертификатов (и сервера, и клиента) - чтобы без паролей работать. Но можно только серверу сертификат, тогда придется БД с логинами и хешами паролей заводить.
Варианты:
1) Один клиент, тогда сертификат серверу и клиенту, проверка обоих сертификатов.
2) Клиент не один, сертификаты на соединение серверу приватник, клиентам публичный ключ, для шифрования соединения, далее по логину и паролю? БД заведена.
3) Сертификаты для аутентификации клиентов. У каждого клиента свой сертификат, сервер по нему идентифицирует клиента. Этот вариант конечно наиболее предпочтительный но и наиболее сложный. Наверное отпечаток сертификата нужно хранить в бд?

Пока-что смотрю на вариант под №2.

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Но во многих вещах я пошел по пути наименьшего сопротивления: открываю локальный TCP-сокет, а удаленный доступ обеспечиваю ssh-тунеллированием. В таком случае ни TLS заморачиваться не надо, ни БД с хешами паролей.
Юзаете аккаунты системы как механизм аутентификации ssh с ключами? Ну тоже вариант. Так действительно даже проще, если научить клиент понимать ssh ключи.
А клиентом что выступает?

Цитата Сообщение от Eddy_Em Посмотреть сообщение
Кстати, при POST-запросах веб-морде шапку можно не отправлять, проверено. Но таки веб-морду лучше всего вебсокетами подключать: а) только один раз за сессию надо аутентификацию делать, б) не нужно 10 раз в секунду поллить сервер, чтобы важные события не пропустить.
"при POST-запросах веб-морде шапку можно не отправлять" - это вы о чём?
"веб-морду лучше всего вебсокетами подключать" - это для просмотра данных?
У меня пока андроид клиент на сокетах, веб-морду сделать особой проблемы не вижу, из той же бд тянуть данные. Ну да, вот динамически то наверное проще на js.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.05.2023, 10:54
Цитата Сообщение от simonC Посмотреть сообщение
2) Клиент не один, сертификаты на соединение серверу приватник, клиентам публичный ключ, для шифрования соединения, далее по логину и паролю?
Нет. Почитайте про клиентские tls-сертификаты. Пары ключей у сервера и клиентов свои.

Добавлено через 2 минуты
А понял.

Тут два варианта:
1) либо шифровать соединение и внутри гонять любые данные в любом протоколе.
2) либо, как вы предложили, публичным ключом шифровать данные и посылать их на сервер.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
20.05.2023, 11:10  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
1) либо шифровать соединение и внутри гонять любые данные в любом протоколе.
Это мой вариант №2, сертифкаты просто для шифрования соединения.Клиент по ssl, или tls. Идентификация по логину и паролю. И далее - гонять данные.

Правильно я понимаю?

Цитата Сообщение от Рыжий Лис Посмотреть сообщение
2) либо, как вы предложили, публичным ключом шифровать данные и посылать их на сервер.
А это мой предложенный вариант №3? Тоесть по отпечатку на сервере распознавать клиента, без шифрования самого соединения, или как?

Я пока ещё не совсем в теме.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.05.2023, 11:23
Наоборот

Цитата Сообщение от simonC Посмотреть сообщение
сертифкаты просто для шифрования соединения.
1) просто серверный tls-сертификат для защиты соединения (+дополнительная авторизация хоть па паролю)
1.1) +pinning серверного сертификата на клиенте(+дополнительная авторизация хоть па паролю)
1.2) +клиентские сертификаты +pinning и на клиенте, и на сервере (дополнительная авторизация не нужна - клиентского сертификата достаточно)

Цитата Сообщение от simonC Посмотреть сообщение
оесть по отпечатку на сервере распознавать клиента, без шифрования самого соединения, или как?
По отпечатку - это подпись.

2) передавать данные в открытом виде и не париться, но подписывать их криптографической подписью
3) шифровать данные (+дополнительная авторизация хоть па паролю)
3.1) шифровать И подписывать
1
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
07.06.2023, 23:35  [ТС]
Нужна помощь, возникла небольшая проблема при разрешении доступа по cidr-маске,

тема тут
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2023, 23:35

Apache сервер на Linux
Здравствуйте. Возникла проблема. Я ещё не опытный пользователь Linux. Поэтому возник такой вопрос. Я установил сервер LAMP. Сам сервер...

Терминальный сервер на Linux
Подскажите какие железки лучше всего покупать для терминального сервера 1С 8.3 на Linux, будут подключаться примерно 5 пользователей. Что...

1c сервер под Linux
Я понимаю, что 1с настроена для работы с MS SQL Server и т.д. Но можно ли заставить 1с-ски сервер работать под Linux?

Портирование на Linux сервер
Доброго времени суток. Будет ли работать на сервере Linux скомпилированное в MonoDevelop приложение?

Почтовый сервер на Linux
Добрый день. Подскажите, как на одном Linux-сервере (Ubuntu 14) развернуть 3 почтовых сервера с разными доменными именами? чтобы можно...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru