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

Сервер на С, linux

14.01.2023, 00:46. Показов 4485. Ответов 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
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
14.01.2023, 09:44
Цитата Сообщение от simonC Посмотреть сообщение
Клиентом в дальнейшем будет железяка и данные нужно будет принимать другие.
Если клиентом будет железяка, и вам потребуется Bare Metal программирование, то сразу стоит писать для нее. Ну и сервер лучше делать на неблокируемых сокетах. Хотя я хз, что там у вас за протокол обмена, может короткими сообщениями все обходится.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2023, 10:21
Фиг знает, я бы http взял, а не голые сокеты.

Микросхемы типа Ag9000-S стоят не слишком дорого.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
14.01.2023, 10:32  [ТС]
Azathtot, Если под Bare Metal Вы имеете в виду архитектуру серверного железа/ос, то да есть особенности, т.к. Я не особо силён в сетевом и выбрал из того что было более доступно. Да, обмен короткими сообщениями, с типом сокетов еще не определился. По мере написания.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2023, 10:38
Цитата Сообщение от simonC Посмотреть сообщение
Bare Metal Вы имеете в виду архитектуру серверного железа/ос,
Скорее микроконтроллеры с 8-битной архитектурой типа AVR или 32-битные stm32 (ARM).

В типичных десктопах/ноутбуках/серверах архитектура процессора x86_64 (она же amd64).
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
14.01.2023, 10:54  [ТС]
Рыжий Лис, а при чем тут ag900-s?

"Description The Ag9000-S series of modules are designed to extract power from a conventional twisted pair Category 5 Ethernet cable,"

По-моему это не туда.
Ну да, лучше голый http))

Добавлено через 15 минут
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Скорее микроконтроллеры с 8-битной архитектурой типа AVR или 32-битные stm32 (ARM).
Это клиент. Этим я занят. Тут много всего, начиная от схем, заканчивая макетированием и отладкой, потому что не удобно всё и сразу и написал на форум.

Тема про сервер, особо не важно на чем писан клиент, на сервер придут данные, их обработать.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
14.01.2023, 10:59
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Скорее микроконтроллеры с 8-битной архитектурой типа AVR или 32-битные stm32 (ARM).
Так это вам или свой стек TCPIP писать надо или использовать что-то типа lwIP
Соответственно код будет ну совсем не похож. А к стати, чем вас MQTT или ModBus over TCP не устраивает, что решили свой велосипед с квадратными колесами городить?
1
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
14.01.2023, 11:41  [ТС]
Azathtot,
Скорее всего буду городить протокол обмена поверх tcpip, посмотрю в сторону lwip, спасибо за инфу. Но на железке связь через simcom, потому там врядле удастся что поменять, если не лезть в EAT, разве что на сервере.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
14.01.2023, 11:53
Зачем вам сервер-то свой писать, используйте MQTT. Вон, тот же mosquitto разверните. А если у вас вообще SIMxxxx стоит то там проблем не будет никаких. И lwIP не нужен
1
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
14.01.2023, 22:37
Ну задача для написания собственного сервера нам неизвестна - может скилл прокачать в программировании.
Для конструктивного обсуждения хотелось бы увидеть ТЗ. Ибо каждый из нас по своему додумывает чего же хочет ТС
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
15.01.2023, 00:12  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
может скилл прокачать в программировании
Ну для этого я могу просто взять те же примеры из доступной литературы, и просто поиграться с ними.

ТЗписальщик из меня не очень, если Вам тз на уровне КБ нужно))
Могу попробовать сделать ТЗ в каком-то приближении к какому-то формату, если вам так понятней будет. Но никогда подобным не занимался.

От сервера что нужно:

Принять дынные от клиента(какие? ну, для начала, просто байт), принять дату(пример с датой уже есть, вот от него кусок и оторву), запихнуть в бд, когда запросят данные - выдрать из бд, отправить. БД хотелось бы sql.
SSL(или что-то другое), мультипоточность, аутентификация, хм, ну что же ещё добавить, наверное контрольную сумму ещё надо посылать, чтобы проверить ничего ли не отпало по дороге.

Кроме клиента непосредственно железки, должен быть ещё клиент Android с аутентификацией, на котором можно глянуть что же наприсылала клиент железка. Но туда я и подавно ещё не лез. Только примеров накачал.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
15.01.2023, 02:48
Принять дынные от клиента(какие? ну, для начала, просто байт), принять дату(пример с датой уже есть, вот от него кусок и оторву), запихнуть в бд, когда запросят данные - выдрать из бд, отправить. БД хотелось бы sql.
SSL(или что-то другое), мультипоточность, аутентификация, хм, ну что же ещё добавить, наверное контрольную сумму ещё надо посылать, чтобы проверить ничего ли не отпало по дороге.
Вот вы и начали писать ТЗ.
И сразу же к вам вопрос - а существующее решение вас не устраивает. тот же nginx+php+sql?
Что именно не устраивает? может вам надо к этой связке свой модуль дописать?
Или у вас требования такие что существующее решение вас не устраивает по каким-то характеристикам - тогда надо их обозначить.

Сейчас практически любой MCU сумеет послать по http кусок данных.

Давайте помогу дальше с ТЗ: вот ряд вопросов в продолжении того что вы написали:
1)сколько планируется на начальном этапе железок которые будут что-то передавать на сервер? 1 - 100 -1000 - 10000 штук? Сколько при полностью работающей системе? Сколько запросов в секунду?
Отсюда требования к серверу.
2)Протоколы какие будут? данные от железок надо шифровать? Ключи зашиты в железки или надо в железках делать полноценную поддержку SSL и проверку сертификатов?
3)Железкам надо отвечать - тоесть передавать обработанные команды или просто собирать от них инфу?

ТЗ вам надо написать для себя в любом виде - ибо грамотно написанное и максимально подробное ТЗ это половина всей работы.

Может сейчас вы вообще неправильным путём идёте - может серверную часть можно собрать на существующих известных решениях, а вам сосредоточиться на железках или логике обработки информации от них.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
15.01.2023, 11:28  [ТС]
Уже было на php, nginx, http, оренж клиент ну не очень надёжно это. Сейчас железо другое. Сделать попроще, протестить а потом написать сервер? Ну можно и так. А тогда как мне клиент смотрелку прикрутить в связке к хттп серверу? Надо отдельный серв для смотрелки. Тогда проше сразу писать.

1.
Демка, 1 полноценная

2.
Simcom умеет ssl, но помимо него еще надо какуюто заморочку на случай если отпадет шифрование

3.
Надо.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
15.01.2023, 13:02
Для тестов как раз проще всего написать сервер на связке nginx+php+sql
там сразу пишется и приём данных и хранение и визуализация - можно очеь быстро создать вполне рабучую систему.
Её единственным ограничением будет производительность - пару тысяч клиентов и железок одновременно ужё не потянет.

Simcom умеет ssl, но помимо него еще надо какуюто заморочку на случай если отпадет шифрование
Отпадёт шифрование - это вообще как?

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

А тогда как мне клиент смотрелку прикрутить в связке к хттп серверу? Надо отдельный серв для смотрелки. Тогда проше сразу писать.
Вот этот как раз самое простое. пишите на php обычный сайт - который берёт инфу из базы и показывает вам. хоть с графиками и картинками хоть текстом. Для всей системы достаточно одного веб сервера.

Вот чтобы все эти вопросы отпали надо писать ТЗ и рисовать структуру вашей системы.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
15.01.2023, 18:18  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
Для тестов как раз проще всего написать сервер на связке nginx+php+sql
Это уже делалось ранее, на других железках, работало. Дело было без тз, в разнобой и разными людьми, потому лучше сделать нормально. тут вы правы, тз нужно больше для себя.

Цитата Сообщение от Aledveu Посмотреть сообщение
Отпадёт шифрование - это вообще как?
Закончится сертификат на сервере, например) ну мало ли что, отключить нужно будет ssl, подебажить и т.д.

Цитата Сообщение от Aledveu Посмотреть сообщение
Вот этот как раз самое простое. пишите на php обычный сайт - который берёт инфу из базы и показывает вам. хоть с графиками и картинками хоть текстом. Для всей системы достаточно одного веб сервера.
Да, тут вы тоже правы, это проще всего. Для сервера не нужен даже сервер. Можно обычный скрипт пихания в бд.
Ну а из бд уже страничку или что-либо ещё. Но повторюсь, это уже проходили. Тема понемногу превращается из "Сервер на С" в "А зачем вам сервер на С?"
А вот нужен.

На счёт ТЗ убедили, пропишу то что надо от сервера, от клиента, как смогу.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
18.01.2023, 21:35
Цитата Сообщение от simonC Посмотреть сообщение
из "Сервер на С" в "А зачем вам сервер на С?"
И правильно. Потому что если купить атомно-сканирующий микроскоп и попытаться забить им гвоздь, то будет плохо. И гвоздю (микроскоп под десяток тонн весит) и микроскопу (ронять все же его не стоит).
Поэтому сначала пишете ТЗ, анализируете еего на предмет особенностей обмена, забываете про "написать сервер на Си" и спокойно ставите mosquitto.
Ну а уж если вы пишете серевер на Си, до делаете его неблокирующим и сначала определитесь с протоколом обмена.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
23.01.2023, 17:43  [ТС]
Цитата Сообщение от simonC Посмотреть сообщение
примере, серверу почему-то порт назначается рандомно, хотя и прописан жестко.
либо порт подальше, либо запускать от sudo.

Цитата Сообщение от Azathtot Посмотреть сообщение
Ну а уж если вы пишете серевер на Си, до делаете его неблокирующим и сначала определитесь с протоколом обмена.
всё же решил писать. вот и определяюсь с протоколом, заодно в процессе изучу матчасть.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.01.2023, 06:32
Цитата Сообщение от simonC Посмотреть сообщение
либо порт подальше, либо запускать от sudo.
Или параметр ядра net.ipv4.ip_unprivileged_port_start подкрутить.
0
1 / 1 / 0
Регистрация: 08.01.2023
Сообщений: 38
19.05.2023, 22:25  [ТС]
Цитата Сообщение от Azathtot Посмотреть сообщение
до делаете его неблокирующим
А вот мне, похоже, подходит блокирующий вариант. Хотя может я не совсем понимаю в каком случае мне будет нужен не блокирующий.
Подключение, сокет-клиент в отдельный процесс, и там прием-обработка-передача. По крайней мере, сейчас так. Блокировка в данном случае, может возникнуть, на сколько я понимаю в отдельно взятом дочернем процессе.
А неблокирующий режим можно добавить позже, после передачи сокета в дочерний процесс.
0
Windows must die
828 / 835 / 102
Регистрация: 23.11.2021
Сообщений: 4,855
Записей в блоге: 15
19.05.2023, 22:37
О, какой жуткий код!
А когда клиентов много, что делать? Таки поллинг надо внедрять. Либо каждому клиенту по потоку (что чревато, если клиентов будет очень много). Увы, в линуксе до сих пор количество потоков/процессов ограничено убогими 65534 штуками (т.к. init занял нулевой). Все жду: когда же это уже в 64-битную систему перейдет? Скажем, есть сервер: 4096 ядер, пару терабайт оперативки, а количество потоков все так же адово ограничено... Вот и лепят люди от безнадежности убогие виртуалки вместо того, чтобы не расходовать возможности сервера попусту!

Добавлено через 1 минуту
Цитата Сообщение от Aledveu Посмотреть сообщение
проще всего написать сервер на связке nginx+php+sql
убогий путь ардуинщика

Добавлено через 1 минуту
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
я бы http взял, а не голые сокеты.
Зачем усложнять, если не требуется веб-морда? А многие подобные задачи вообще требуют лишь локальных сокетов, и здесь как нельзя лучше подойдут UNIX-cокеты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2023, 22:37
Помогаю со студенческими работами здесь

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 почтовых сервера с разными доменными именами? чтобы можно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru