прослушивать порт и отвечать если пришел заданный текст

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-14 11:26:54

уже.. тока все равно бестолку...

Код: Выделить всё

int errr=-1/0/1; //менял от -1 до 1, толку ноль...

                if ((f = open(".", O_RDONLY, 0)) == -1)
                    errr(1, "open()");
                if (fchdir(f) == -1)
                    errr(1, "fchdir()");
radist04ka@ gcc -o TempR tempd.c
tempd.c: In function 'main':
tempd.c:46: error: called object 'errr' is not a function
tempd.c:48: error: called object 'errr' is not a function
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение FreeBSP » 2011-02-14 12:27:31

выспись =)

Код: Выделить всё

cp tempd.c /tmp/tempd.c.bak
cat tempd.c | sed 's/err=/ecode=/g' | sed 's/err!=/ecode!=/g' / sed 's/int err/int ecode/g' > tempd.c
вроде так..

фишка в том что переменная и функция имеют одно и то же имя
а если ты собираешь прогу как плюсовую, то функция - суть переменная-указатель на код

P.S. если не курится - приколоти сюда прогу файлом - попробую показать как надо
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-14 12:33:18

да, я уже нашел это:)

не те параметры менял:
вот так:

Код: Выделить всё

radist04ka@ cat tempd.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <err.h>
#include <fcntl.h>
#include <getopt.h>

int main()
{
        int st=-1;
        int server_sockfd, client_sockfd;
        int server_len, client_len;
        int MAX_LINE_LEN;
        int f;

        struct sockaddr_in server_address;
        struct sockaddr_in client_address;

        server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

        server_address.sin_family = AF_INET;
        server_address.sin_addr.s_addr = htonl(INADDR_ANY);
        server_address.sin_port = htons(9734);
        server_len = sizeof(server_address);
        st=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));

        if(st!=0) printf("bind error!\n");
        else printf("bind is ok\n");
        st=-1;

        st=(listen(server_sockfd, 5));
        if(st!=0) printf("listen error!\n");
        else printf("listen is ok\n");
        daemon(0, 1);
        while(1)
        {
                if ((f = open(".", O_RDONLY, 0)) == -1)
                    err(1, "open()");
                if (fchdir(f) == -1)
                    err(1, "fchdir()");

                char *path = "filetest";
                char buf[MAX_LINE_LEN];
                FILE *file;
                int nread;

                client_len = sizeof(client_address);
                client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);

                nread = read(client_sockfd, &buf, sizeof(buf) - 1);
                if (nread < 1) {
                        printf("read: %s. closing connection\n", strerror(errno));
                        close(client_sockfd);
                        continue;
                }
                buf[nread] = 0;
                printf("server got: \"%s\"\n", buf);

                if (strncmp(buf, "TEST", 4) == 0) {
                        strncpy(buf, "OK\n", sizeof(buf) -1);
                        buf[sizeof(buf) - 1] = 0;
                } else if(strncmp(buf, "GETTEST", 7) == 0) {
                        file = fopen(path, "r");
                        if (file == NULL ||
                            fgets(buf, sizeof(buf), file) == NULL) {
                                strncpy(buf, "ERR\n", sizeof(buf) -1);
                                buf[sizeof(buf) - 1] = 0;
                        }
                        if (file)
                                fclose(file);
                } else {

                        printf("bad command from client, closing connection\n");
                        close(client_sockfd);
                        continue;

                }

                printf("server answer: \"%s\"\n", buf);
                write(client_sockfd, &buf, strlen(buf));
                close(client_sockfd);
        }

}
собираться собиратся:

Код: Выделить всё

radist04ka@ gcc -o TempR tempd.c
radist04ka@ ./TempR
bind is ok
listen is ok
но

Код: Выделить всё

radist04ka@ ps aux | grep Temp
radist04ka@ sockstat | grep 9734
radist04ka@
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение


Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение FreeBSP » 2011-02-14 12:54:44

думай почему и где падает
и зачем тебе демон если он всеравно в консоль пишет
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-14 16:45:42

выше написанный код с удовольствием работает на лине. через раз запускается на опенбсд и нифига не запускается на фре
и зачем тебе демон если он всеравно в консоль пишет
принтф мона заменить суслог
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение hizel » 2011-02-14 17:04:31

truss в лапы
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение Dambo » 2011-02-15 13:18:16

Жёстко, очень жёстко...
Не верю что выше написанный код рабочий и где либо работает или он не относится к С или С++ )))
Автор послушай FreeBSP воспользуйся ngnix!!!
Если всё таки на столько хочешь восполнить свои знания по программированию, возьми свой код и на каждую строку напиши комментарий, что она и почему делает. Пиши только не потому что ты так думаешь что она это делает, а выписывай из источников сторонних желательно книги или справочники. У тебя настолько банальные ошибки(уверен их много, я на первой остановился), первое что в глаза бросилось это "char buf[MAX_LINE_LEN];" переменная MAX_LINE_LEN не определенна... потом её же лучше и в read() использовать, ты там как буфер используешь(поэтому -1 не надо), а не как строку...
Когда пишешь, то что не знаешь надо пользоваться множеством исходников/источников, что то могло устареть, что то может работать при определённых условий...
http://www.lissyara.su/articles/freebsd ... et_server/ можно воспользоваться трудом Fastman`a, она написана возможно специально для вас...

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-16 2:32:27

точно говорю что на лине запускалось и работало...

но пришли методом тыка чтения и опроса общества к такому виду:

Код: Выделить всё

radist04ka@ cat /localhost/source/tempdaemon/radiktemp3.c
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>

#define SERVER_ADDRESS          "0.0.0.0"
#define SERVER_DATA             "./meteo.dat"
#define SERVER_NAME             "radist04ka"
#define SERVER_PORT             6728
#define TCP_BACKLOG             15
#define MAX_LINE_LEN            80

int main()
{
        struct sockaddr_in addr;
        socklen_t addrlen;
        FILE *file;
        int client_fd, n, on, server_port, server_fd;
        char *data_path, *server_address;
        char buf[MAX_LINE_LEN];

        /* Defaults. */
        data_path = SERVER_DATA;
        server_address = SERVER_ADDRESS;
        server_port = SERVER_PORT;

        /* Setup listener. */
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(server_port);
        if (inet_aton(server_address, &addr.sin_addr) == 0)
                errx(1, "invalid listen address \"%s\"", server_address);
        if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
                err(1, "socket");
        on = 1;
        if (setsockopt(server_fd, SOL_SOCKET,
            SO_REUSEADDR, &on, sizeof(on)) != 0)
                err(1, "setsockopt");
        if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
                err(1, "bind");
        if (listen(server_fd, TCP_BACKLOG) != 0)
                err(1, "listen");

        /* Daemonize. */
        if (daemon(1, 1) == -1)
                err(1, "cannot daemonize");
        openlog(SERVER_NAME, LOG_PID | LOG_NDELAY, LOG_DAEMON);
        syslog(LOG_INFO, "Waiting for connections on %s port %d",
            inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

        /* Loop. */
        while(1) {
                /* Handle connection. */
                memset(&addr, 0, sizeof(addr));
                addrlen = sizeof(addr);
                client_fd = accept(server_fd, (struct sockaddr *)&addr, &addrlen);
                if (client_fd == -1) {
                        syslog(LOG_ERR, "accept(): %s", strerror(errno));
                        continue;
                }
                syslog(LOG_INFO, "Accept connection from %s:%d",
                    inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

                n = read(client_fd, &buf, sizeof(buf) - 1);
                if (n < 1) {
                        syslog(LOG_ERR, "read(): %s. Closing connection",
                            strerror(errno));
                        close(client_fd);
                        continue;
                }
                buf[n] = 0;
                syslog(LOG_INFO, "got: \"%s\"\n", buf);

                if (strncmp(buf, "TEST", 4) == 0) {
                        strncpy(buf, "OK\n", sizeof(buf) -1);
                        buf[sizeof(buf) - 1] = 0;
                } else if(strncmp(buf, "GETTEST", 7) == 0) {
                        file = fopen(data_path, "r");
                        if (file == NULL ||
                            fgets(buf, sizeof(buf), file) == NULL) {
                                syslog(LOG_ERR, "file: %s", strerror(errno));
                                strncpy(buf, "ERR\n", sizeof(buf) -1);
                                buf[sizeof(buf) - 1] = 0;
                        }
                        if (file)
                            fclose(file);
                } else {
                        syslog(LOG_INFO, "bad command, closing connection");
                        close(client_fd);
                        continue;
                }

                syslog(LOG_INFO, "answer: \"%s\"\n", buf);
                write(client_fd, &buf, strlen(buf));
                close(client_fd);
        }
}

Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение



Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение Fastman » 2011-02-19 18:53:28

Прошу прощения что лезу с глупостями :)
Вам не надо писать программы, вообще.
Предлагаю два варианта:
1. Нанять толкового человека и заплатить денег.
2. Если свербит в жопе - выучить предметную область и сделать правильно (за месяц не получиться)
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-20 11:22:53

1. денег нет таких чтобы нанять.... у меня стипуха в 1000 рэ а не в 1000 у.е.
2. я и писал выше, что не программист... учить все для того чтобы одного демона написать... не рационально.
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение Fastman » 2011-02-20 12:24:31

QweЯty писал(а):1. денег нет таких чтобы нанять.... у меня стипуха в 1000 рэ а не в 1000 у.е.
И поэтому мы все тут должны помочь получить тебе диплом. Ага :)
Чтобы ты потом пришел ко мне устраиваться на работу и отнял у меня время :)
QweЯty писал(а):2. я и писал выше, что не программист... учить все для того чтобы одного демона написать... не рационально.
Да конечно ! Знания вообще нерациональны :) Проще ходить по форумам и бредить.

Оффтоп завязываю.
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
QweЯty
лейтенант
Сообщения: 796
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение QweЯty » 2011-02-20 17:40:28

какой диплом?

я не в койей мере не программист, а радист антеннщик. с паяльником и радиоволнами дружу, а не со строками кода.

и устраиваться на работу программистом я не собираюсь. я не в этой области специалист! могу сказать по АЧХ все параметры антенн и трактов ВЧ что и как идет. сварить/колоть оптоволокно умею, но не умею программировать!

программу я попросил для того чтобы завести одну хрень, которая никоем образом к учебе не относиться...
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Гость
проходил мимо

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение Гость » 2011-02-20 17:43:44

QweЯty, вас троллят))) не обращайте внимание
программа то уже заработала как надо?


Аватара пользователя
itux
мл. сержант
Сообщения: 114
Зарегистрирован: 2008-11-09 12:37:55
Откуда: Kemerovo
Контактная информация:

Re: прослушивать порт и отвечать если пришел заданный текст

Непрочитанное сообщение itux » 2011-04-11 10:15:21

Вот и отличненько :Bravo:
Просто в следующий раз, надо четко ставить задачу, альтруизм еще никто не отменял :)
Пиши что не программист, а например плотник, столяр или маляр.
Указывай задачу, только точно что сколько и куда, возможно тебе быстрее помогут и не оскорбят :)
А еще и пивом на крайний случай отделаешься или просто так сделают, кому не сложно ;-)
несу чушь, не дорого... звонить +7903.......