Страница 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 ;)