Страница 2 из 2
Добавлено: 20 май 2004, 13:52
Max
Понятно спасибо,переделаю,но почему функция не хочет работать нормально,когда ее вызываешь из других?
Еще вопрос: не знаешь, как получить IP адрес коннектещейся к тебе машины.
Мне надо организовать обнаружение DDoS атак, и я думаю сканировать свои порты, и если в один и тот же порт в маленький промежуток времени ломятся куча пакетов с десятка два разных IP, то это DDoS. Ведь по идее так

Добавлено: 20 май 2004, 13:56
exe
Max - по порядку. Избавься от ошибки.
Потом открой другую тему насчёт портов.
Функция делает coredump когда вызываешь из других, потому что
скорее всего стэк другой. А данные возможно разрушены в стеке.
Точнее можно сказать после полной проверки.
Добавлено: 20 май 2004, 17:13
Гость
Кстати почему-то никто не сказал, что надо сделать чтобы получить core.
$ ulimit -c 1000000
и будет тебе щастье

Добавлено: 20 май 2004, 19:52
mend0za
можно ещё наверх SIGILL программе навернуть
для уверенности
Добавлено: 20 май 2004, 23:09
exe
Max - перепиши всё.
strcat так много. Ну возьми sprintf, или stringstream из C++.
Или почитай книги по языку. А функция где coredump вообще
слишком запутанная. Я пока ожидаю книжку из инета - почитал и
понял что ничего не понял.
memset чего стоит: memset(fileret,sizeof(fileret),0);
Кстати пройди программу в gdb. Честно говоря то что ты написал
совершенно непонятно. Возможно стиль виноват или язык C/C++
незнакомый для тебя (Прога C, комментарии C++), но эту программу
ни один человек без бутылки не поймёт.
Добавлено: 21 май 2004, 09:00
Max
Ошибку я нашел в функции ReadFileInfo, там не инициализировалась i.
С stringstream действительно удобней, спасибо.
memset чего стоит: memset(fileret,sizeof(fileret),0);
Но чем вам memset не нравится.
Добавлено: 21 май 2004, 11:00
exe
Max,
А что он у тебя делает? Ответ - ничего.
Ты заполняешь fileret странным символом 0 раз.

Добавлено: 21 май 2004, 12:02
Max
Я просто хочу обнулть массив, не освобождая память.
Как сделать правильно?
Добавлено: 21 май 2004, 14:12
Гость
Используй bzero - так не ошибешься: bzero(&var, sizeof(var)). В memset можно второй и третий параметры перепутать т.к. они одинакового типа. Stevens рекомендует определять bzero (если ее нет на системе) как макрос использующий memset.
Добавлено: 21 май 2004, 16:31
exe
bzero не везде существует.
memset(fileret, 0, sizeof(fileret));
man memset.
Добавлено: 21 май 2004, 16:43
Max
Всем большое спасибо!
Не могли бы еще подсказать, где в этом куске ошибка.
Здесь рисуется простое однострочное меню, управляющееся стрелками влево, вправо и ентером, при нажатие на который вызывается функция и выводится ее результат.
Код: Выделить всё
//************Main Module**************//
static void finish(int sig);
int Menu;
static char* MenuStr[10] = {"Система","Версия ПО","Тип входа","Политика паролей","Файловая система","TCP/IP","Сервисы","Аудит","DDoS","Выход (ESC)"};
static int com;
int main(){
/* инициализируй свои не относящиеся к curses структуры данных здесь */
Menu = 0;
(void) signal(SIGINT, finish); /* подготовить прерывания для завершения */
(void) initscr(); /* инициализировать библиотеку curses */
keypad(stdscr, TRUE); /* разрешить преобразование кодов клавиатуры */
(void) nonl(); /* не делать NL->CR/NL при выводе */
(void) cbreak(); /* читать один символ за раз, не ждать \n */
(void) noecho(); /* не показывать ввод */
if (has_colors())
{
start_color();
/*
* Простое назначение цветов, часто нужное всем.
*/
init_pair(1, COLOR_GREEN, COLOR_BLACK);
init_pair(2, COLOR_MAGENTA, COLOR_BLACK);
}
while(1){
move(0,0);
int x = 0,y = 0,tx=0,ty=0;
if(com==27) break;
switch(com){
case 260:{
if(Menu>0) Menu--;
break;
}
case 261:{
if(Menu<9) Menu++;
break;
}
case 13:{
clear();
move(0,0);
switch(Menu){
case 0:{
printw("Информация о системе:\n",ComputerInform());
getch();
break;
}
}
break;
}}
color_set(1,NULL);
//*****draw menu*****///
for(int i = 0;i<10;i++){
if(Menu ==i){
getyx(stdscr,x,y);
}
printw("%s",MenuStr[i]);
getyx(stdscr,tx,ty);
move(tx,ty+1);
}
move(x,y);
color_set(2,NULL);
printw("%s",MenuStr[Menu]);
com = getch();
clear();
}
finish(0);
return 1; /* мы закончили */
}
static void finish(int sig)
{
endwin();
}
Но экран становится черным и ничего не выводится, только надпись, которую я печатаю до этого printw("Text");
Почему?
Добавлено: 21 май 2004, 19:21
Llama
Max, маны, маны курить! printw пишет символу в структуру типа WINDOW а не на экран. Конкретно - курить man referesh
