Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: monitoring  (Прочитано 23540 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
nixlama
Гость
« : 31-03-2004 06:38 » 

Zdravstvuite,

Mozet bit vi smozete mne pomoc. Est takaja zadaca :

Sozdat programmu (na C++)  rabotajuscuju na servere LINUX , kotoraja razresaet podkliucenim useram (naprmer cerez PuTTY) cerez opredelionnij port polucit dannie monitoringa na ekran ispolzuja polucenie parametri, i obnovliat eti vivodimie dannie fiksirovanimi intervalami vremeni.
Takze dolzno bit ziostko zadano kolicestvo razresaemih podkliucenij.

V opisanii zadanija napisano cto programa prednaznacena dlia nabliudeniem za osnovnimi parametrami i tablicami marsrutizacii ARP protokola.

Pomogite plizz! Goriu ! Kakie hot biblioteki to dlia etogo nuzni ? I hotiabi malenkij primercik !
Nikogda ne programil pod Linux, ne znaju daze s cego nacat Жаль Da i C++ znaju ne nastolko horoso Жаль
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-03-2004 13:04 » 

nixlama, извини, но твой транслит и стиль изложения затрудняют понимание. Лично я замучился переводить - пока поймешь одну фразу, забудешь другую. Попробуй набрать еще раз, но по-русски и подробнее. Если у тебя проблемы с русской клавиатурой, то попробуй набирать тут: http://mail.ru/kb/
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nixlama
Гость
« Ответ #2 : 01-04-2004 05:05 » 

Здравствуйте,

Помогите пожалуйста. Есть такая задача :

Создать программу  (C++)  работающую на сервере LINUX , которая разрешает подключеным юзерам (например через PuTTY) через определённый порт получить данные мониторинга используя полученые параметрыi, и обновлять эти выводимые данные фиксироваными интервалами времени.
Также должно быть жёстко задано количество разрешаемых конектов к етому порту.

В описании задания написано что программа предназначена для наблюдения за основными параметрами и таблицами маршрутизации ARP протокола.

Помогите плизз! Горю ! Какие хоть библиотеки то для этого нужны ? И хотябы небольшой примерчик !
Никогда под Linux не програмил Не знаю даже с чего начать Жаль Да и  C++ знаю только на уровне основ Жаль
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 01-04-2004 11:08 » 

Как я понял, программа должна собирать некие данные со своего хоста и сообщать их любому,Ю к то к ней подсоединился. Если не так - поправь меня.

1)
Работа с сетью - см. сокеты - pinfo libc или man socket.
По программированию сокетов написано много - надо только немного поискать.

2)
Как понимать "для наблюдения за основными параметрами"?

3)
Что имеется в виду под "таблицами маршрутизации ARP протокола"?
Самое простейшее - просматривать файл /proc/net/arp .

Кстати, в Linux-е программирование идет в основном на С, а не на С++.
Ни каких дополнительных библиотек не надо.

Если ты объяснишь цель, которую ты хочешь достичь, то может быть найдется более простое решение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nixlama
Гость
« Ответ #4 : 01-04-2004 11:26 » 

Я сам с трудом понимаю это задание  Жаль  Преподы вечно как напишут...

Как я понимаю, должно быть так :
1. юзер конектится к определённому хосту на порт 4444
2. считывается какойто конфиг файл (это для меня не проблема), в котором описано сколько конектов можно на этот порт и с каким промежутком времени это рефрешить.
3. Выдать ему на экран АРП таблицу стандартную. Типа :
Код:
|      IP-адрес           Ethernet-адрес    |
---------------------------------------------
|     223.1.2.1          08:00:39:00:2F:C3  |
|     223.1.2.2          08:00:28:00:38:A9  |
|     223.1.2.3          08:00:5A:21:A7:22  |
|     223.1.2.4          08:00:10:99:AC:54  |
---------------------------------------------

Вроде всё.
« Последнее редактирование: 25-11-2007 16:03 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 01-04-2004 12:43 » 

Это можно решить за пять минут, используюя bash и inetd (или xinetd). Вешается на inetd программка, которая запустится по конекту пользователя и выдаст ему содеожимое файла /proc/net/arp в любом виде. На каждый запрос запускается копия программы. Плюс inetd - не нужно работыть с сокетами - общение идет через stdin/stdout.
Если bash заменить на C, то времени уйдет больше.

Формат /proc/net/arp простой: первая строка - заголовок, последующий строки - записи ядра в текстовом виде. Первое и четвертое поле - IP и MAC.
Работать с ним нада так: открыл, считал весь, закрыл. Если нужно обновить информацию, то весь цикл open/read/close повторяется.

Вот пример программы на bash - для понимания простоты задачи:
Код:
#!/bin/sh

while cat /proc/net/arp
  do
  sleep 2
  done

Задача на С выглядит аналогично. Нужно только добавить преобразование вида.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nixlama
Гость
« Ответ #6 : 02-04-2004 11:14 » 

Я опять с ламерским вопросом :

Нашол в мануалах документацию по сокетам. Пытаюсь слушать сокет, но ничего не выходит Жаль Не врубаюсь я в этот мануал Жаль
Мне надо создать сокет, слухать его и при каком то коннекте на этот сокет что то делать.

Никак не выходит Жаль Поможите люди добрые!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 02-04-2004 11:47 » 

Ну если ты наберешь в поиске этого форума "socket(", то получишь несколько готовых решений.

int sock,sock2;
struct sockaddr_in sa;

sa.sin_addr.s_addr=htonl(0x7f000001); /* address 127.0.0.1 */
sa.sin_port=htons(12345); /* port 12345 */
sock=socket(AF_INET,SOCK_STREAM,0);
bind(sock,(struct sockaddr*)&sa,sizeof(sa));
listen(sock,5); /* включаем режим прослушивания на сокете */
sock2=accept(sock); /* ждем подключения */
...
close(sock2);
close(sock);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nixlama
Гость
« Ответ #8 : 05-04-2004 04:54 » 

При попытке сделать accept(sock,(struct sockaddr*)&sa,sizeof(sa)); получаю ошибку :
Код:
invalid conversion from 'unsigned int' to 'socklen_t*'


Это ещё что ? Во всех найденых мною примерах была запись accept(sock,(struct sockaddr*)&sa,sizeof(sa)); , и нигде не сказано что такая ошибка может возникнуть   Так больше нельзя...

Вот мой код :
Код:
    descriptor = socket(AF_INET, SOCK_STREAM, 0);
    //bzero(&sa, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = INADDR_ANY;
    sa.sin_port = htons(DEF_PORT);
    bind(descriptor, (struct sockaddr *)&sa, sizeof(sa));
    listen(descriptor, 20);
    int sock = accept(descriptor, (struct sockaddr *)&sa, sizeof(sa));
« Последнее редактирование: 25-11-2007 16:06 от Алексей1153++ » Записан
nixlama
Гость
« Ответ #9 : 05-04-2004 13:05 » 

С этим уже разобрался.

Возник другой вопрос. Есть функция :
Код:
void read_write (char filename[])
{
   //object for output file content
   ifstream fin (filename);
   char ch;
   cout << "Reading from configuration file : \n";
   while (fin.get(ch))
   {
     cout << ch;
   }
   fin.close();
   cout << "Done\n";
}

файл всего из двух строк, мне надо в процессе считывания первую строку присвоить одной переменной, а вторую другой. Хелп плизззз!
« Последнее редактирование: 25-11-2007 16:08 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 05-04-2004 15:15 » 

Цитата: RXL
Это можно решить за пять минут, используюя bash и inetd (или xinetd).

С bash понятно вопрос как это к inetd прикрутить (можно с аутентификацией).
2 nixlama:
качай отсюда книжечку и исходники примеров или хотябы исходники
http://www.advancedlinuxprogramming.com/downloads.html
смотри пример к главе 11 там то что тебе нужно по большей части.
можно к примеру дополнительный модуль написать и твоя задача решена. логин с паролем можно брать из строки запроса дальше по своему усмотрению
можно использовать модули pam
насчет чтения строки
в классе istream объекстом которого является cin есть метод захвата строки целиком.
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 05-04-2004 20:56 » 

Цитата: LogRus
Цитата: RXL
Это можно решить за пять минут, используюя bash и inetd (или xinetd).

С bash понятно вопрос как это к inetd прикрутить (можно с аутентификацией).
Извини, не понял. Уточни, пожалуйста.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 05-04-2004 21:01 » 

RXL, я просто не понимаю как inetd заставить запускать этот скрипт или я чегото не понял. Чего-то совсем тупой к ночи.
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 05-04-2004 21:29 » 

См. файл /etc/inetd.conf - структура совсем проста.
Если у тебя xinetd, то посмотри в /etc/xinetd.d  и его ман - там не сложно
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 05-04-2004 21:37 » 

RXL, огромное спасибо. Просто жирно-толстое такое СПАСИБО! Вот.
гляну если не забуду для общего развития.
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 05-04-2004 22:24 » 

LogRus,  Отлично
Я надеюсь что это шутка? У меня такое ощещние что да...
Извини, но сейчас лучшего ответа не нашел - лучше завтра, когда голова прояснится...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 06-04-2004 02:59 » 

RXL, а чего нормальный такой ответ. сказал где прочесть и порядок. Я иногда рабываю про RTFM когда под Виндами работаю. Отлично
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 06-04-2004 11:47 » 

Отлично
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nixlama
Гость
« Ответ #18 : 07-04-2004 10:11 » 

Ну вот, наваял чего то по ламерски  Улыбаюсь
Код:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

const unsigned short int DEF_PORT = 4444;
unsigned short int DEF_CONNS = 25;
unsigned short int DEF_TRYES = 5;
int tot_conns = 0;
char filename[14] = "syssettings";

void read_write (int conns, int tryes, char filename[]);
void read_write (char filename[]);
void show_table (char filename[]);

int main(int argc, char *argv[])
{

    //check if file exists and if no, create it with default values
    ifstream fin(filename, ios::in);
    if(!fin)
    {
      cerr << "File does not exist!" << endl;
      cout << "Create new file with defaults values!" << endl;
      read_write(DEF_CONNS, DEF_TRYES, filename);
    }
    else
    {
      read_write(filename);
      cout << "Connections MAX :: " << DEF_CONNS << ", Tryes MAX :: " << DEF_TRYES << endl;
    }


    int sockfd;
    int new_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    socklen_t sin_size;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(DEF_PORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    memset(&(my_addr.sin_zero), '\0', 8);
    bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
    listen(sockfd, DEF_CONNS);
    sin_size = sizeof(struct sockaddr_in);
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    if(new_fd && (tot_conns < DEF_CONNS))
    {
      while(1)
      {
         system("clear");
         show_table("/proc/net/arp");
         sleep(DEF_TRYES);
      }
      tot_conns++;
    }
    else
    {
      cout << "Waiting for connection...\n";
    }

  return EXIT_SUCCESS;
}


/************************************************************************************/
/************************************  Functions  ***********************************/
/************************************************************************************/
void read_write (int conns, int tryes, char filename[])
{
   //object for input file content
   ofstream fout (filename);
   fout << conns << "\n";
   fout << tryes << "\n";
    fout.close();
   cout << "File created!\n\n";
}

void read_write (char filename[])
{
   FILE *file;
   char c[30]; /* make sure it is large enough to hold all the data! */
   int n[2];

   file = fopen(filename, "r");
   if(file==NULL)
   {
     printf("Error: can't open file.\n");
   }
   else
   {
     int counter = 0;
     while(fgets(c, 10, file)!= NULL)
     {
       n[counter] = atoi(c);
       counter++;
     }
     DEF_CONNS =  n[0];
     DEF_TRYES =  n[1];
   }
}

void show_table(char filename[])
{
   ifstream fin (filename);
   char ch;
   cout << "Here is the table : \n\n";
   while (fin.get(ch))
   {
      cout << ch;
   }
   cout << "\n*******************************************\n";
   fin.close();
}

Подкиньте плизз ссылочку, как эти данные отправлять подключеному клиенту(сейчас выводятся на стороне сервера), или разъясните мне тупому что значат параметры функци send();  А то с ангельским туго в понимании, особенно в тех документации  :oops: .
« Последнее редактирование: 25-11-2007 16:11 от Алексей1153++ » Записан
nixlama
Гость
« Ответ #19 : 08-04-2004 07:58 » 

Проблема решена. Спасибо за участие.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #20 : 04-05-2004 06:26 » new

Вдогонку Ага

Попробовал откомпилить и запустить. Всё вроде работает, только вот я думал что listen(sockfd, BACKLOG); разрешит конектиться  только BACKLOG количеству конектов, но на деле оказалось не так. В чём соль то ?

Кстати, nixlama, ты случайно не из Литвы будеш ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 05-05-2004 08:35 » 

MOPO3, это максимальное число соединений, ожидающих accept().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #22 : 06-05-2004 04:39 » 

RXL, Я уже понял  Улыбаюсь
nixlama, если тебе надо одновременно показывать данные нескольким юзерам (а я думаю что так), тебе надо использовать fork()
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines