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

Все о программировании под *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 ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Ответить