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
Пол:
|
|
« Ответ #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
Пол:
|
|
« Ответ #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
Пол:
|
|
« Ответ #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
Пол:
|
|
« Ответ #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)
|
|
« Ответ #10 : 05-04-2004 15:15 » |
|
Это можно решить за пять минут, используюя bash и inetd (или xinetd). С bash понятно вопрос как это к inetd прикрутить (можно с аутентификацией). 2 nixlama:качай отсюда книжечку и исходники примеров или хотябы исходники http://www.advancedlinuxprogramming.com/downloads.htmlсмотри пример к главе 11 там то что тебе нужно по большей части. можно к примеру дополнительный модуль написать и твоя задача решена. логин с паролем можно брать из строки запроса дальше по своему усмотрению можно использовать модули pam насчет чтения строки в классе istream объекстом которого является cin есть метод захвата строки целиком.
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 05-04-2004 20:56 » |
|
Это можно решить за пять минут, используюя bash и inetd (или xinetd). С bash понятно вопрос как это к inetd прикрутить (можно с аутентификацией). Извини, не понял. Уточни, пожалуйста.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #12 : 05-04-2004 21:01 » |
|
RXL, я просто не понимаю как inetd заставить запускать этот скрипт или я чегото не понял. Чего-то совсем тупой к ночи.
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 05-04-2004 21:29 » |
|
См. файл /etc/inetd.conf - структура совсем проста. Если у тебя xinetd, то посмотри в /etc/xinetd.d и его ман - там не сложно
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #14 : 05-04-2004 21:37 » |
|
RXL, огромное спасибо. Просто жирно-толстое такое СПАСИБО! Вот. гляну если не забуду для общего развития.
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 05-04-2004 22:24 » |
|
LogRus, Я надеюсь что это шутка? У меня такое ощещние что да... Извини, но сейчас лучшего ответа не нашел - лучше завтра, когда голова прояснится...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 06-04-2004 02:59 » |
|
RXL, а чего нормальный такой ответ. сказал где прочесть и порядок. Я иногда рабываю про RTFM когда под Виндами работаю.
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #20 : 04-05-2004 06:26 » |
|
Вдогонку Попробовал откомпилить и запустить. Всё вроде работает, только вот я думал что listen(sockfd, BACKLOG); разрешит конектиться только BACKLOG количеству конектов, но на деле оказалось не так. В чём соль то ? Кстати, nixlama, ты случайно не из Литвы будеш ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #21 : 05-05-2004 08:35 » |
|
MOPO3, это максимальное число соединений, ожидающих accept().
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #22 : 06-05-2004 04:39 » |
|
RXL, Я уже понял nixlama, если тебе надо одновременно показывать данные нескольким юзерам (а я думаю что так), тебе надо использовать fork()
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
|