| 
			| 
					
						| 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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #11 : 05-04-2004 20:56 »  |  | 
 
 Это можно решить за пять минут, используюя bash и inetd (или xinetd). С bash понятно вопрос как это к inetd прикрутить (можно с аутентификацией). Извини, не понял. Уточни, пожалуйста. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #12 : 05-04-2004 21:01 »  |  | 
 
 RXL, я просто не понимаю как inetd заставить запускать этот скрипт или я чегото не понял. Чего-то совсем тупой к ночи. |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #13 : 05-04-2004 21:29 »  |  | 
 
 См. файл /etc/inetd.conf - структура совсем проста.Если у тебя xinetd, то посмотри в /etc/xinetd.d  и его ман - там не сложно
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #14 : 05-04-2004 21:37 »  |  | 
 
 RXL, огромное спасибо. Просто жирно-толстое такое СПАСИБО! Вот.гляну если не забуду для общего развития.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #15 : 05-04-2004 22:24 »  |  | 
 
 LogRus,    Я надеюсь что это шутка? У меня такое ощещние что да... Извини, но сейчас лучшего ответа не нашел - лучше завтра, когда голова прояснится... |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #16 : 06-04-2004 02:59 »  |  | 
 
 RXL, а чего нормальный такой ответ. сказал где прочесть и порядок. Я иногда рабываю про RTFM когда под Виндами работаю.   |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 |  |  | 
	|  |