Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Visual Basic i "Wiersz poleceń"

09 Mar 2005 21:55 3837 19
  • Poziom 16  
    Jak zrobić aby można było czytać wyniki wysłane przez program (chodzi tu głównie o net.exe, ale również o inne) wywołany procedurą (albo funkcją - czym?) i jak do takiego programu wysyłać (tu chodzi głównie o telnet.exe).
  • Poziom 27  
    Stosuje się 'przekierowanie strumieni' czyli stdin i stdout. Robisz sobie dwie pipy :) funkcją CreatePipe() i wstawiasz jedną jako stdin, a drógą jako stdout w strukturę STARTUPINFO. Potem tylko CreateProcess, a komunikacja z programem (taka sama jakbyś klikał w okienku dosowym) przez ReadFile i WriteFile, tyle że zamiast uchwytów do pliku - podstawiasz uchwyty to jednej z 'pipe'

    mam gotowy działający przykładzik bo akurat bawiłem się w to i potrzebowałem odczytać co program do mnie gada

    Code:
    STRING pipebuff
    
    STARTUPINFO si
    PROCESS_INFORMATION pi
    SECURITY_ATTRIBUTES sa

    ZeroMemory(&si, len(si))
    sa.nLength        = len(sa)
    sa.bInheritHandle = 1
    sa.lpSecurityDescriptor = NULL

    if CreatePipe(&Rpipe, &Wpipe, sa, 300) = FALSE

    ...blah jakiś error

    endif

    si.cb = len(si)
    si.dwFlags    = STARTF_USESTDHANDLES
    si.hStdOutput = Wpipe
    si.hStdInput  = GetStdHandle(STD_INPUT_HANDLE) /*tu dajesz drógą pipę jeśli chcesz nadawać*/
    si.hStdError  = GetStdHandle(STD_ERROR_HANDLE)

    ok = CreateProcess(NULL, "telnet.exe", NULL, NULL, True, CREATE_NO_WINDOW, NULL, NULL, si, pi)

    CloseHandle(Wpipe) /*nie potrzebne*/
    CloseHandle(pi.hProcess)
    CloseHandle(pi.hThread)

    while ok
       ZeroMemory(&pipebuff, 255)
       ReadFile(Rpipe, &pipebuff, 254, &ok, NULL)
    /*pokaż w edicie co odebrałeś*/
       SendMessage(edithandle, EM_REPLACESEL, FALSE, &pipe)
    wend

    /*program sie skończył*/
    CloseHandle(Rpipe)


    Pewnie ciekawszy przykład znajdziesz w goglarce :)
    Ten przykład zatrzymuje cały program do czasu aż uruchomiony proces się 'skończy'. Samo ReadFile też blokuje program jak blokujący socket
  • Poziom 16  
    Więc temat odnowię, stwierdzeniem, że i pod VB6 i pod VB .NET to co ujrzałem poniżej nie ma prawa istnieć.
    W "goglarce" nie znalazłem nic co by mnie interesowało, albo nie potrafię takich rzeczy szukać. A może wie ktoś jak chociaż sobie otworzyć połączenie z serwerem jakimś (przykładowo moim) i wyswietlać to co serwer mi wyśle i móc wysyłać coś do serwera.
    Tylko proszę aby nie było wypowiedzi w stylu "Telnet to całkiem prosty protokół, otwierasz port i wszystko to co przyjdzie wyświetlasz, a to co napisze użytkownik wysyłasz do serwera." jak pewien supermoderator mi kiedyś napisał bo to nie wnosi nic nowego.
  • Poziom 27  
    chodzi o to co programy wysyłają w sieć? Jeśli masz XP albo 2000 to żaden problem, otwierasz socket i odbierasz wszystko co się dzieje z kartą sieciową :)
    Code:
    ]sockaddr_in sk
    
    INT buf, dwBytesReturned, sock
    buf = 1
    dwBytesReturned = 0

    sk.sin_family = AF_INET
    sk.sin_port   = 0
    sk.sin_addr   = inet_addr("zewnętrzny IP")
    sock          = socket(AF_INET, SOCK_RAW, IPPROTO_IP)

    bind(sock, sk, len(sk))
    WSAIoctl(sock, SIO_RCVALL, &buf, 4, 0, 0, &dwBytesReturned, 0, 0)

    i teraz albo CreateThread() albo WSAAsyncSelect(), jak komu wygodniej, pamiętając o tym żeby odebrać całą paczkę IP naraz (max 65535 bajtów)

    Program którego zrzut widać działa na takim sockecie, ale służy mi tylko do rozłączania pewnych wścibskich serwerów typu gemius, doubleclick...
  • Poziom 16  
    Zacznijmy od początku - chcę porozmawiać z komputera daleko z moim komputerem, na któym jest zainstalowany serwer telnet, a nie nasłuchiwać jakieś karty sieciowe. Chcę to zrobić za pośrednictwem mojego programu, bo chciałbym sobie uprościć życie i dodać kilka możliwości, które mam w pełni opracowane tylko nie wiem na przykłąd jak to wysłać i jak zobaczyć co odpowiedział. Bardzo bym prosił o opis jakbym nigdy o VB nie słyszał, bo poprzedniw stawałys ię dla mnie niezrozumiałe.

    Dziękuję.
  • Poziom 16  
    niestety... ta stronka oferuje dużo odmiennych rozwiązań, ale tego tam nie ma. Ktoś coś mi poradzi?
  • Poziom 27  
    Kody ktore wczesniej widziales nie sa niestety do visual basica.

    Zebym ci mogl odpowiedziec zadam ci pare pytan.

    Rozumiem ze chcesz stworzyc sobie protokol ktorym bedziesz porozumiewal sie ze swoim programem zdalnie za posrednictwem sieci lub internetu?
    CZy mozesz napisac sobie dwie aplikacje klient i serwer?
  • Poziom 16  
    Stanowczo wolałbym obsługiwać Telnet, ale jakbyś mi wyjaśnił zasadę działania takiego czegoś od "zera" to pewnie nie miałbym nic przeiwko. Chodzi mi o to abym mógł na przykład po wysłaniu do serwera jakiegoś tekstu (komendy) serwer odpowiedział zgodnie z tym co sobie wymślę. Jeżeli będę rozumiał to może być.
  • Pomocny post
    Poziom 27  
    Bardzo dobrze kombinujesz. Potem zamiast aplikacji klienta polaczysz sie telnetem.
    Nie widze innego wyboru jak urzycie kontrolki winsock. bez niej bedzie trzeba troszke rzezbic.

    zaciagnij chat room ze strony
    http://www.vbtools.atelier.pl/vbprog.php?dzial=4

    Tam jest bardzo prosto opisana komunikacja miedze kompami po adresie IP. (mozesz odpalic na jednym)

    pozdro
  • Poziom 16  
    Nie wiem jak to połączć z telnetem, bo nie wiem jak działa winsock. Jakby ktoś miał opis Winsock byłbym bardzo wdzięczny.
    Dzięki.

    PS Jakby ktoś miał jakąś metodę na obsługę jednak telnetu to proszę piszcie.

    Zmieniłem ze względu na nieczytelność tamtej wiadomości.
  • Poziom 27  
    Winsock w VB jest bardzo prościutko obsługiwać (jeśli znasz chociaż trochę VB).
    Jeśli dobrze cię zrozumiałem, to masz na gdzieś zainstalowany już serwer telnetu i chciałbyś napisać klienta.
    W skrócie to wygląda tak:
    W wrzucasz na Formę kontrolkę Winsock (jeśli jej nie ma musisz dodać z listy - WINSOCK.OCX). Przyjmijmy że nazywa się ona Winsock1

    Jeśli chcesz połączyć się z jakimś serwerem używasz polecenia:
    Code:
    Winsock1.Connect HostIP, RemotePort

    Gdzie HostIP to nazwa/IP serwera, a RemotePort to port na którym nasłuchuje twój serwerek telnetu.

    Code:
    Winsock1.GetData strData

    Ta funkcja zwraca ci do zmiennej strData to co przyszło z serwera do twojego klienta. Aby wykryć zdarzenie przyjścia danych z serwera używamy procedurki:
    Code:
    Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    
    Dim strData As String
    Winsock1.GetData strData
    ' dalsza część kodu
    End Sub

    W "dalszej części kodu" piszemy co mamy zrobić z danymi które przyszły (np. wyświetlić w polu tekstowym.

    Code:
    Winsock1.SendData strData

    Za pomocą procedurki SendData wysyłamy na serwer zawartość zmiennej strData.

    Code:
    Winsock1.Close

    Polecenie Close zamyka połączenie z serwerem.

    Tak przedstawiają się polecenia Winsock'a. Tyle potrzeba by napisać klienta. Pamiętaj, że jednak najlepiej nauczysz się na przykładach.
  • Poziom 16  
    A jak do tego skonfigurować winsock?
    Bo on ma jakieś tajemnicze opcje.
    VB znam, niektórzy mówią, że bardzo dobrze, ale tego nigdy nie robiłem.
  • Poziom 27  
    Dla tego programu, co robisz, nie musisz już konfigurować Winsock'a. Wystarczy, że wklejasz go w Formę i powinien chodzić.
    Przedstawię krótko wszystkie właściwości konfiguracji Winsock:
    (Name) - Nazwa kontrolki (jak w każdej innej), musisz ją ustalić. Domyślnie: Winsock1
    Index - Numer kontrolki w tablicy (jeśli robisz tablicę kontrolek). Zastosowanie: np jeśli aplikacja korzysta z kilku serwerów równolegle. Nazwy będą wtedy miały: Winsock(1), Winsock(2), .... Winsock (i).
    Left i Top - Te właściwości ma każda kontrolka. Winsock akurat ich nie wykorzystuje, bo i tak go nie widać na Formie. Najlepiej ustalić te właściwości na zero.
    LocalPort - Tu ustalasz wartość portu na używanym na komputerze lokalnym. Też nie używane w twojej aplikacji.
    Protocol - Wybierasz protokół sieciowy dla twojego programu (pomiędzy TCP a UDP). Telnet używa protokołu TCP (najczęściej używany - domyślny).
    RemoteHost - Adres serwera z jakim się łączysz
    RemotePort - Port serwera z jakim się łączysz

    Właściwości RemoteHost i RemotePort są ustawiane przy poleceniu:
    Code:
    Winsock1.Connect HostIP, RemotePort

    Jeśli chcesz, możesz je wcześniej zdefiniować i potem łączyć się za pomocą polecenia:
    Code:
    Winsock1.Connect

    ale to tylko zbędne wydłużanie kodu programu.

    Jeśli chcesz coś jeszcze wiedzieć to pytaj. Pozdrowienia.
  • Poziom 16  
    Tak. Przetestowałem ale serwer wysyła do nie same znaki zapytania (to tak wygląda w msgbox czyli to są jakieś nieznane znaki) a ja nie wiem co zrobić aby zobaczyć oc serwer "miał na myśli".
  • Poziom 27  
    Napisz dokładnie, czy to jest serwet Telnetu, który komunikuje się w trybie znaków ASCII; czy to np. SSH (Secure SHell), który transmisję przeprowadza w trybie kodowanym.
    Próbowałeś się połączyć do tego serwera programami typu Putty? To taki programik, obsługujący właśnie różne protokoły od bezpośredniego - Raw, do kodowanego SSH. Tam przed połączeniem wybierasz rodzaj protokołu.
    Jeśli to SSH trzeba napisać jakiś dekoder dodatkowo do tego.
  • Poziom 16  
    Przecież pisałem, że chcę się łączyć z serwerem telnetu.
  • Poziom 27  
    Przygotowałem prosty przykład takiego programiku, wraz z kodem źródłowym masz w pliku. Pamiętaj, że nie ma on obsługi błędów.
    Sprawdź co przychodzi z serwera jak się połączysz.
    Czy próbowałeś łączyć się za pomocą innych programów. Chociażby windowsowego telnet.exe. Jeśli to działa na telnet.exe to powinno też działać na programie napisanym pod Winsock'a.
  • Poziom 16  
    Chyba skoro mówię o łączeniu się z serwerem TELNET to on działa, co nie? Na co komu telnet, który nie dziła. Poza tym skąd miałbym wiedziec co wpisać kiedy, gdyby m się z z nim nie połączył w inny, sprawny sposób?
    Czy próbowałeś łączyć się za pomocą innych programów. Chociażby windowsowego telnet.exe.
    To było trochę głupie pytanie. Przepraszam, bo mnie trochę poniosło, ale tak jest.

    Poza tym przykłąd, który w programie telnet.exe wygląda tak:
    Code:
    !----------------------------------------------------------!
    
    !                     WITAJ W SYSTEMIE!                    !
    !----------------------------------------------------------!

    W tym przykładowym programie wygląda tak:
    Code:
    !----------------------------------------------------------!
    
    !                     WITAJ W SYSTEMIE!                    !!----------------------------------------------------------![/

    Lekka różnica nie?

    PS. Serwer jest mój więc działa na pewno :).
  • Poziom 27  
    Przepraszam, że tak naciskałem na ten program. Ale dane zwracane z serwera, które opisałeś wyglądały jakby nie był to telnet, tylko jakiś zupełnie inny protokół (te znaki zapytania - ???). A to co ci teraz zwraca mój przykład jest poprawne. Teraz musisz tylko napisać jakąś procedurkę, która zmieni ci te napisy na poprawne.
    Te [8;1f należą już do telnetu (pochodzą one z konsoli). Oznaczają one np. rozpoczęcie pogrubienia czy zmianę koloru. Musisz napisać procedurę żeby albo wywalić je zupełnie z tekstu, albo wstawiać pogrubiony, kolorowy tekst np. w kontrolce RichEdit.
    Jak znajdę opis kolorowania w konsoli to napiszę jakiś przykład.
    Pozdrowienia.