Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Помогите определить ошибку. 
:(
    Опции темы
shad0w
Дата 13.11.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.5.2005

Репутация: нет
Всего: нет



Имеется такой код
Код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <process.h>

FILE * fp;
FILE * err;
char p_addr[255];

int _ping (char * ADDR){
    char buff[1024]={0},redy_bf[1024]={0},end_buff[1024]={0};
    /* buff - plase to get ansvers                   *\
    |* redy_bf - buffer to make command              *|
    \* end_buff - place 2 make ready 4 analys answer */
    
    FILE *pipe_fd;
    
    strcat(redy_bf,"ping -n 1 ");
    strcat(redy_bf,ADDR); //"ping -n 1 addr" - the end command
    
    /*щоб не працювати з сирими сокетами       *\
    |*і не збарати кожен пакет рукакми         *|
    \*будемо використовувати "ф-ії" ос =)      */
    pipe_fd = popen(redy_bf, "r");
    while(fgets(buff, sizeof(buff), pipe_fd) != NULL) {
    strcat(end_buff,buff);//<<< here we got ready 4 analys answer
    }
    
    //                                                             
    //                   VVV<<<--- if we have TTL, than ping is OK =)
    if (strstr(end_buff,"TTL=")){ 
  return 0; //<<<<<<
    } else {
  return 1;//<<<<<
    }//if ping is OK - return 0, else - return 1
    
}

int main (int argc, char * argv[]){
    
    //while (1){
  fp=fopen("names.txt","r");
  if (!fp){
    printf("[-]Error opening file");
    return -1;
  }
    
  while (fgets(p_addr,255,fp)!=NULL){
  
    printf("pinging %s\n", p_addr);
    if(_ping(p_addr)){
    err=fopen(p_addr,"a");
    fprintf(err,"[-]Error: addres %s is dead\n",p_addr);
    fclose(err);
    }
    memset(p_addr,0,255);
  
  }
  fclose(fp);
  Sleep(5000);
    //}
}


Как видно его действия таковы: открываем файл с адресами хостов, пингуем каждый хост и если хост не отвечает - пишем это в файл, в качестве имени файла будет использоваться имя хоста.
Трабла в следующем - если в файле names.txt имеется более одного дохлого хоста, то прога вылетает.

Цитата
D:\progi\C\trash\pingalka>main0.exe
pinging 127.0.0.1

pinging 127.0.0.2

pinging 127.0.0.3

pinging ya.ru

pinging yandex.ru

pinging wrambler.ru


abnormal program termination

D:\progi\C\trash\pingalka>


Меня интересует почему так случается, и где ошибка.
PS Компилятор - lcc-win32.
PPS может кто нибудь потестит этот код на другом компилере (не lcc-win32), у меня просто сейчас нету такой возможности.
PM MAIL   Вверх
JackYF
Дата 13.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



Давай твой names.txt...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
shad0w
Дата 13.11.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.5.2005

Репутация: нет
Всего: нет



Цитата

Давай твой names.txt... 


127.0.0.1
127.0.0.2
127.0.0.3
128.1.1.1
192.168.0.1
PM MAIL   Вверх
sergejzr
Дата 13.11.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Модератор: Название темы должно отражать ее суть!


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Rockie
Дата 14.11.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



shad0w, хм.. может нужно пересобрать проект? у меня так вообще (BCBuilder 6):
Код
  pipe_fd = popen(redy_bf, "r");

Цитата
[C++ Error] shablon.cpp(25): E2268 Call to undefined function 'popen'
[C++ Error] shablon.cpp(25): E2034 Cannot convert 'int' to 'FILE *'



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Dov
Дата 15.11.2006, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(Rockie @  14.11.2006,  20:50 Найти цитируемый пост)
 pipe_fd = popen(redy_bf, "r");

Скорее всего  popen это fopen. хотя слово красивое.  smile 
И вместо redy_bf нужно ADDR, имхо.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Rockie
Дата 15.11.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Dov, тоже так думал, но скорее всего это таки 
Цитата
 
FILE *_popen(
   const char *command,
   const char *mode 
);
FILE *_wpopen(
   const wchar_t *command,
   const wchar_t *mode 
);

то есть нечто вроде аналога system("...");


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Damarus
Дата 15.11.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



Цитата(Rockie @  15.11.2006,  16:17 Найти цитируемый пост)
то есть нечто вроде аналога system("...");

Цитата
Creates a pipe and executes a command.

shad0w, пример:
Код
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

bool ping(const std::string& host)
{
    FILE *ping_pipe = _popen((std::string("ping -n 1 ") + host).c_str(), "r");
    if (!ping_pipe) return false;

    std::string ping_answer; char pipe_buffer[128];
    while (fgets(pipe_buffer, sizeof(pipe_buffer), ping_pipe))
        ping_answer += pipe_buffer;

    _pclose(ping_pipe);

    return ping_answer.find("TTL=") == std::string::npos ? false : true;
}

int main(int argc, char *argv[], char *envp[])
{
    std::ifstream names_txt("names.txt");
    if (!names_txt.is_open()) return 1;

    std::vector<std::string> hosts;
    std::copy(std::istream_iterator<std::string>(names_txt),
        std::istream_iterator<std::string>(),
        std::back_inserter<std::vector<std::string> >(hosts));

    names_txt.close();

    for (std::vector<std::string>::const_iterator iter = hosts.begin();
        iter != hosts.end(); iter++)
        std::cout << *iter << " - " << (ping(*iter) ? "true" : "false") << std::endl;
}


Добавлено @ 17:47 
Но лучше проверять код возврата ping.

Это сообщение отредактировал(а) Damarus - 15.11.2006, 17:34
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.