Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Помогите определить ошибку.


Автор: shad0w 13.11.2006, 18:19
Имеется такой код
Код
#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), у меня просто сейчас нету такой возможности.

Автор: JackYF 13.11.2006, 18:49
Давай твой names.txt...

Автор: shad0w 13.11.2006, 20:33
Цитата

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


127.0.0.1
127.0.0.2
127.0.0.3
128.1.1.1
192.168.0.1

Автор: sergejzr 13.11.2006, 21:52
Модератор: Название темы должно отражать ее суть!

Автор: Rockie 14.11.2006, 20:50
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 *'

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

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

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

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

Автор: Damarus 15.11.2006, 17:33
Цитата(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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)