Program sieciowy

0

Mam do Was pytanie. Potrzebuję napisać aplikację która będzie komunikowała się z urządzeniem działającym w sieci domowej. Udało mi się przechwycić dane wysyłane przez to urządzenie w sieci za pomocą socketest (dodam, że urządzenie działa jako client i szuka w sieci serwera). Chciałbym napisać aplikację która odpowie urządzeniu na owe zapytanie. A jest to:

Client closed conection.
New Client: 192.168.1.153
GET /upg/aapll/mbb HTTP/1.1
User-Agent: Java/1.1-rr-b03
Host: 192.168.1.213:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
Connection: keep-alive

Programowanie opanowałem na poziomie bardzo podstawowym (delphi i C#) i poszukuję jakiejś wskazówki czego się złapać i czego użyć, aby odpowiedzieć na owy pakiet. Z góry dzięki za odpowiedz.

0

Jeszcze jedno pytanie jakie pojawiło się w trakcie to w jaki sposób wysłać powyższe zapytanie do urządzenia (np. za pomocą przeglądarki www) i uzyskać od niego odpowiedz?

0

To co widać wygląda mi na zwykłe pobieranie pliku metoda GET protokołu HTTP. Adres masz, nazwę i ściezkę do pliku też. To teraz skoro znasz Delphi nawet tylko podstawy to polecam Synapse pod VCL (mój artykul na: Obsługa protokołu HTTP przy użyciu pakietu Synapse poza tym na stronie projektu jest w miarę bogata dokumentacja i przykłady) albo Simpe Tcp pod WinAPI lub do dokladniejszego ogarnięcia co ma być wysłane lub odebrane protokółem TCP (moduł pobierzez z http://piechnat.pl/article/simpletcp.html - a prosty przykład klienta i serwera są dołączone). Także podejrzewam, że należy zwrócić taki kod html jakiego oczekuje klient jeżeli jego treść jest sprawdzana. Wysłanie tego do jakiegoś serwera również nie jest problemem, a jest tymbardziej banalne, bo wszystko co potrzebujesz juz otrzymałeś obserwując sockety. Akurat podstawy protokołu HTML są według mnie banalne. Podsumowująć pozostaje Tobie tylko usiąść i to zakodować. Skoro znasz Delphi to w tym będzie najszybciej, bo z C# nie miałem w ogóle styczności dlatego nic nie doradzę. No to tyle, powodzenia.

0
olesio napisał(a):

To co widać wygląda mi na zwykłe pobieranie pliku metoda GET protokołu HTTP. Adres masz, nazwę i ściezkę do pliku też. To teraz skoro znasz Delphi nawet tylko podstawy to polecam Synapse pod VCL (mój artykul na: Obsługa protokołu HTTP przy użyciu pakietu Synapse poza tym na stronie projektu jest w miarę bogata dokumentacja i przykłady) albo Simpe Tcp pod WinAPI lub do dokladniejszego ogarnięcia co ma być wysłane lub odebrane protokółem TCP (moduł pobierzez z http://piechnat.pl/article/simpletcp.html - a prosty przykład klienta i serwera są dołączone). Także podejrzewam, że należy zwrócić taki kod html jakiego oczekuje klient jeżeli jego treść jest sprawdzana. Wysłanie tego do jakiegoś serwera również nie jest problemem, a jest tymbardziej banalne, bo wszystko co potrzebujesz juz otrzymałeś obserwując sockety. Akurat podstawy protokołu HTML są według mnie banalne. Podsumowująć pozostaje Tobie tylko usiąść i to zakodować. Skoro znasz Delphi to w tym będzie najszybciej, bo z C# nie miałem w ogóle styczności dlatego nic nie doradzę. No to tyle, powodzenia.

Przerobiłem sobie ten przykład dla swoich potrzeb. I pobiera mi kod html do memo (np. z wp.pl), ale jak wpiszę adres komputera i postawię serwer za pomocą socket test to socket test nie reaguje. Kod co prawda niczym się nie różni, ale umieszczam go poniżej:

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, HTTPSend, JPEG, Vcl.StdCtrls,
  Vcl.ExtCtrls, IdBaseComponent, IdAntiFreezeBase, Vcl.IdAntiFreeze;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

const
  Opera_UserAgent = 'Java/1.1-rr-b03';

implementation

{$R *.dfm}

procedure DownloadToStream(const URL : string; const SomeStream : TStream);
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  Str, DirectLink : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          DownloadToStream(DirectLink, SomeStream);
        end;
    else
      SynHttp.Document.SaveToStream(SomeStream);
      SomeStream.Position := 0;
    end;
  finally
    SynHttp.Free;
  end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  MemStream : TMemoryStream;
begin
  MemStream := TMemoryStream.Create;
  MemStream.Position := 0;
  DownloadToStream('http://172.0.0.1/upg/aapll/mbb HTTP/1.1', MemStream);
  MemStream.Position := 0;
  try
    Memo1.Lines.LoadFromStream(MemStream);
  finally
    MemStream.Free;
  end;
end; 

Chciałbym jeszcze dodać, że na zrzucie z socket test widać, że klient się łączy z serwerem. Samą metodą GET, jestem w stanie osiągnąć taki efekt?

0

Skoro urządzenie komunikuje się przez HTTP to może po prostu postaw sobie jakiś serwer HTTP i go oskryptuj.

0

Postanowiłem "ręcznie" wysłać zapytanie do serwera, za pomocą programu "Putty" po telnecie. Po wysłaniu zapytania:

GET /upg/aapll/mbb HTTP/1.1
User-Agent: Java/1.1-rr-b03
Host: 192.168.1.213:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
Connection: keep-alive

Otrzymałem odpowiedz:

HTTP/1.1 400 Bad Request
Content-Length: 199
Content-Type: text/html; charset=ISO-8859-1
Date: Sun, 07 Oct 2012 13:49:42 GMT
SERVER: BH

<!DOCTYPE HTML PUBLIC "-*IETF*DTD HTML 2.0//EN"><html><head><title>400 Bad Request</title></head><body>

Client error: 400 Bad Request


<address>BH</address></body></html>

Więc, chyba coś robię nie tak ;/

adf88 napisał(a):

Skoro urządzenie komunikuje się przez HTTP to może po prostu postaw sobie jakiś serwer HTTP i go oskryptuj.

Jak na razie zależy mi, aby wyłapać odpowiedz serwera. Bo bez tego nie będę w stanie go zastąpić.

0

Po Raw nie ma żadnej odpowiedzi z serwera

0
lordi156 napisał(a):

Po Raw nie ma żadnej odpowiedzi z serwera

To poczytaj o protokole HTTP zanim zaczniesz kleić zapytania ręcznie. Koniec nagłówków jest symbolizowany przez podwójną sekwencję \r\n, czyli w tym wypadku dwa entery pod rząd. Inaczej serwer ciągle próbuje czytać zapytanie.

0
Demonical Monk napisał(a):
lordi156 napisał(a):

Po Raw nie ma żadnej odpowiedzi z serwera

To poczytaj o protokole HTTP zanim zaczniesz kleić zapytania ręcznie. Koniec nagłówków jest symbolizowany przez podwójną sekwencję \r\n, czyli w tym wypadku dwa entery pod rząd. Inaczej serwer ciągle próbuje czytać zapytanie.

Demonical Monk zwracam honor, jednak poszło :) Wielkie dzięki za podpowiedz. Otrzymałem odpowiedz:

HTTP/1.1 200 OK
Content-Length: 112
Content-Type: application/octet-stream
Date: Sun, 07 Oct 2012 18:15:13 GMT
RealTimeInfo.dlna.org: DLNA.ORG_TLAG=*
SERVER: BH

1Ä}­A]X=ŚÉi EÜľq{JşcîěłnßjGfĄć\u´&Ł5Sé;ěZŽýřéâŔö[8*Zű@¤ştT.ĘĂmˇ RńÇéĄÍdüç&6eIpĽŘZüúçV^((

Czym to może być kodowane i jak trudne do złamania?

0

Przecież serwer Ci wyjaśnił co to jest.

Content-Type: application/octet-stream

To co widzisz pod zapytaniem to jakieś binarne cuda, obstawiam że to streamowany film czy cuś.

PS. Kodowania nie da się złamać, poczytaj o różnicach między kodowaniem, a szyfrowaniem. Szczególną uwagę zwróć na to, że kodowanie zwykle służy przygotowaniu danych do transmisji/archiwizacji/wtf i odbywa się bez zewnętrznego klucza, szyfrowanie takiego klucza wymaga.

0
Demonical Monk napisał(a):

Przecież serwer Ci wyjaśnił co to jest.

Content-Type: application/octet-stream

To co widzisz pod zapytaniem to jakieś binarne cuda, obstawiam że to streamowany film czy cuś.

PS. Kodowania nie da się złamać, poczytaj o różnicach między kodowaniem, a szyfrowaniem. Szczególną uwagę zwróć na to, że kodowanie zwykle służy przygotowaniu danych do transmisji/archiwizacji/wtf i odbywa się bez zewnętrznego klucza, szyfrowanie takiego klucza wymaga.

Gdybym chciał napisać aplikację symulującą serwer to wystarczy, że odpowiem klientowi tymi "cudami binarnymi"? Czy muszę się bardziej postarać?

0

Weź przeczytaj standard HTTP to się dowiesz?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.