Как избавится от ошибки?

Все о программировании под *nix
Max

Сообщение Max »

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

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Max - по порядку. Избавься от ошибки.
Потом открой другую тему насчёт портов.

Функция делает coredump когда вызываешь из других, потому что
скорее всего стэк другой. А данные возможно разрушены в стеке.
Точнее можно сказать после полной проверки.

Гость

Сообщение Гость »

Кстати почему-то никто не сказал, что надо сделать чтобы получить core.

$ ulimit -c 1000000

и будет тебе щастье :)

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

можно ещё наверх SIGILL программе навернуть :)

для уверенности
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Max - перепиши всё.

strcat так много. Ну возьми sprintf, или stringstream из C++.
Или почитай книги по языку. А функция где coredump вообще
слишком запутанная. Я пока ожидаю книжку из инета - почитал и
понял что ничего не понял.

memset чего стоит: memset(fileret,sizeof(fileret),0);

Кстати пройди программу в gdb. Честно говоря то что ты написал
совершенно непонятно. Возможно стиль виноват или язык C/C++
незнакомый для тебя (Прога C, комментарии C++), но эту программу
ни один человек без бутылки не поймёт.

Max

Сообщение Max »

Ошибку я нашел в функции ReadFileInfo, там не инициализировалась i.
С stringstream действительно удобней, спасибо.
memset чего стоит: memset(fileret,sizeof(fileret),0);
Но чем вам memset не нравится.

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Max,

А что он у тебя делает? Ответ - ничего.
Ты заполняешь fileret странным символом 0 раз. :-)

Max

Сообщение Max »

Я просто хочу обнулть массив, не освобождая память.
Как сделать правильно?

Гость

Сообщение Гость »

Используй bzero - так не ошибешься: bzero(&var, sizeof(var)). В memset можно второй и третий параметры перепутать т.к. они одинакового типа. Stevens рекомендует определять bzero (если ее нет на системе) как макрос использующий memset.

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

bzero не везде существует.

memset(fileret, 0, sizeof(fileret));
man memset.

Max

Сообщение 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");
Почему?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Max, маны, маны курить! printw пишет символу в структуру типа WINDOW а не на экран. Конкретно - курить man referesh ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Ответить