Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przypisanie wyniku polecenia System(); do stringa

Ostatnio zmodyfikowano 2012-11-18 20:22
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
Przypisanie wyniku polecenia System(); do stringa
» 2012-11-17 14:02:45
Witam.

Ostatnio mam problem z internetem, a mianowicie ciągle mi przerywa połączenie. Szukam jakiegoś prostego programu który musi jedynie sprawdzać, czy jest dostęp do internetu, czy go nie ma i jeśli nie ma to gdzieś zapisywać o której godzinie. Szukałem sporo takiego programu, ale znajduję jedynie jakieś zaawansowane programy np. sprawdzające ile danych wysłałem, ile odebrałem ale żaden nie spełniał w/w funkcji.

Gdy w konsoli systemowej wywołam ping'a z parametrem -t, to na wynikach widać kiedy nie ma internetu, ale nie jest to potem ujmowane w statystykach podsumowania. Tzn jak przez godzinę zostawiłem konsolę z pingiem, to co parę minut było wyświetlane : "Odpowiedź z 192.168.1.254: Sieć docelowa jest nieosiągalna.", ale potem w podsumowanie pokazało mi, że straciłem tylko 3 pakiety.

W związku z tym, stwierdziłem, że może sam sobie taki program napiszę, i chyba najprościej by było, gdyby udało się wyniki polecenia System() gdzieś przypisywać, wówczas z nich bym zliczał np. ile razy zdanie "Sieć docelowa jest nieosiągalna" występuje i miał to czego potrzebuję. Jednak nie znam sposobu aby te wyniki otrzymać. Tzn jeśli wywołam te polecenie, to są one wypisywane na ekran, ale ja je potrzebuję mieć w pamięci.

  • Jest jakiś sposób, żeby wyniki polecenia System(); przesłać do pamięci ?
  • Albo czy da się np. odczytać co jest na ekranie konsoli ?

Bo bawić się z lepszymi poleceniami do pingowania (np. w WinAPI) raczej mi się nie chce.

Jeśli znacie odpowiedź na powyższe pytania, albo jakiś prosty program który rejestruje braki w dostępie do internetu, będę wdzięczny za post. Obecnie sprawdzam połączenie za pomocą programu Ping 32 i zobaczę, czy on mi coś da.
P-69406
crash
» 2012-11-17 18:53:49
Gotoiec, testowany, działa

C/C++
#include <time.h>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main( int argc, char * argv[] )
{
    const char * command = "ping cpp0x.pl > res.txt"; //zapisuje ping'a do pliku
    string readed;
   
    for(;; )
    {
        system( command ); //ping..
       
        ifstream input( "res.txt", ios::in );
        input >> readed; //wczytujemy pierwsza linijke z pliku
       
        if( readed[ 2 ] == 'd' ) //jesli na trzecim miejscu jest literka d, to wtedy dupa ;p
        {
            time_t rawtime; //nalezy pobrac czas w milisekundach od 1970 LOL
            struct tm * timeinfo; //i przerobic go pozniej na bardziej czytelna postac
           
            time( & rawtime );
            timeinfo = localtime( & rawtime );
            printf( "Brak polaczenia nastapil o: %s\n", asctime( timeinfo ) );
           
            printf( "\n\nNacisnij enter aby zakonczyc program." );
            cin.ignore();
            return 0;
        }
    }
}
P-69421
Admixior
» 2012-11-17 18:59:56
1. możesz się pobawić z przekierowaniem strumieni.
main.exe:
uruchamia:system("sedzia.exe<ping costam");
pobiera z jakim kodem zakończyła się appka
lub
main.exe
uruchamia:system("ping costam>plik.txt");
odczytujesz plik i oceniasz.

2. Nie musisz się bawić w ten sposób wystarczy takie coś
C/C++
#include <winsock2>
#pragma comment(lib, "ws2_32.lib")
//...

int main()
{
    //....
    if( !gethostbyname( "google.pl" ) )
    {
        //internetu nie ma
    }
    else
    {
        //internet jest
    }
   
}

jak cache na twoim routerze będzie zapisywać ip to możesz próbować się połączyć z googlem na jedno z ip funkcją connect:

1.Adres IP:173.194.35.151
2.Adres IP:173.194.35.159
3.Adres IP:173.194.35.152

PS.: mógłby mnie ktoś oświecić w jaki sposób przykładowa funkcja gethostbyname(...); zwraca adres tak żeby nie było memleaka?
P-69422
xevuel
» 2012-11-17 19:10:53
Można też pobawić sie tym: http://msdn.microsoft.com/en-us/library/96ayss4b(v=vs.71).aspx. Problem może być tylko z symulowaniem wprowadzania danych, nie udało mi się tego wykombinować...


//edit:
PS.: mógłby mnie ktoś oświecić w jaki sposób przykładowa funkcja gethostbyname(...); zwraca adres tak żeby nie było memleaka?
Nie specjalnie rozumiem o co chodzi, możesz mi wyjaśnić? :)
P-69423
Admixior
» 2012-11-17 19:24:22
Nie specjalnie rozumiem o co chodzi, możesz mi wyjaśnić? :)
Wiem że to nie mój temat ale... ;]chodzi o to że gethostbyname(..) zwraca adres do miejsca w pamięci. Z tym że ona sama to miejsce rezerwuje i nikt je nie zwalnia.
P-69424
xevuel
» 2012-11-17 19:34:02
Można utworzyć w funkcji statyczny obiekt, którego destruktor zająłby się zwolnieniem pamieci ;]
P-69425
McAffey
Temat założony przez niniejszego użytkownika
» 2012-11-18 11:58:25
Wczoraj nie miałem czasu na sprawdzenie, więc dopiero dziś odpisuję.

@crash dzięki wielkie, dobry sposób, więc z niego skorzystam.

@Admixior

main.exe
uruchamia:system("ping costam>plik.txt");
odczytujesz plik i oceniasz

Na takiej zasadzie działa sposób Crash'a, więc też dzięki za podanie :)

A co do sposobu z gethostbyname();, to nie bawiłem się nigdy na połączeniach sieciowych, ale ten sposób zwraca mi ciągle informację, że internetu nie ma, a WSAGetLastError zwraca kod 10093.
P-69452
xevuel
» 2012-11-18 12:04:24
A co do sposobu z gethostbyname();, to nie bawiłem się nigdy na połączeniach sieciowych, ale ten sposób zwraca mi ciągle informację, że internetu nie ma, a WSAGetLastError zwraca kod 10093.
Pierwsze trzeba zainicjować WinSock:
http://support.ipswitch.com/kb/WSK-19980714-EM37.htm
[MSDN] WSAStartup
P-69454
« 1 » 2
  Strona 1 z 2 Następna strona