Problem z dynamiką i znakiem " . " w winsock

0

Witam
Jestem początkujący jeżeli chodzi o Delphi, postanowiłem napisać prostą aplikację za pomocą której będę mógł resetować modem Thomson TCM 420 którego używa się w większości kablówek. bez potrzeby uzywania www. Aplikacja działa na komponencie winsock dołączanym dynamicznie mam jednak z nia 2 problemy.

  1. Zresetowanie modemu następuje dopiero gdy 2 razy kliknę w button, dlaczego nie działa gdy klikne raz?

  2. Dlaczego w niektórych miejscach mogę normalnie wstawić " . " (kropka) a w innych muszę jako hex bo inaczej aplikacja nic nie wysyła? przykład: New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A')); jeżeli mam "HTTP/1.1 to aplikacja niczego nie wysyła a więc kropkę musiałem zapisac jako hex. Oto cały kod.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, ComCtrls, ExtCtrls, OleCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure NewRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  New : TClientSocket;
  Dane : String;
implementation

{$R *.dfm}
Function Hex(strData:string): string;
var sresult:string; sfinal:string; hexc:cardinal; i:integer;
begin
i:=1;
while i<=length(strData) do
begin
hexc := strtoint('$' + copy(strData,i,2));
sresult :=  inttostr(hexc);
sresult := chr(strtoint(sresult));
sfinal := sfinal + sresult;
i:=i+2;
end;
result := sfinal
end;

procedure TForm1.NewRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.lines.add(Dane);
Memo1.SelLength := length(Memo1.Text);
Memo1.SelStart := length(Memo1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
New := TClientSocket.Create(self);
New.Address := ('192.168.100.1');
New.Port := 80;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
New.Active :=True;

IF New.Active = True then
New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A'));
New.Socket.SendText('Host: 192.168.100.1' + hex('0A'));
New.Socket.SendText('User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1' + hex('0A'));
New.Socket.SendText('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + hex('0A'));
New.Socket.SendText('Accept-Language: pl,en-us;q=0.7,en;q=0.3' + hex('0A'));
New.Socket.SendText('Accept-Encoding: gzip, deflate' + hex('0A'));
New.Socket.SendText('Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7' + hex('0A'));
New.Socket.SendText('Connection: keep-alive' + hex('0A'));
New.Socket.SendText('Referer: http://192.168.100.1/set_scan_page.asp' + hex('0A'));
New.Socket.SendText('Content-Type: application/x-www-form-urlencoded' + hex('0A'));
New.Socket.SendText('Content-Length: 20' + hex('0A')  + hex('0A'));
New.Socket.SendText('CmInfoDsFreq1=&CmInfoUsId1=' + hex('0A'));
Button1.Click;
end;

end.
0
  1. Dlaczego w niektórych miejscach mogę normalnie wstawić " . " (kropka) a w innych muszę jako hex bo inaczej aplikacja nic nie wysyła? przykład: New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A')); jeżeli mam "HTTP/1.1 to aplikacja niczego nie wysyła a więc kropkę musiałem zapisac jako hex.

Bo jesteś geniuszem i uważasz że to z tego wynika.

hexc := strtoint('$' + copy(strData,i,2));
sresult :=  inttostr(hexc);
sresult := chr(strtoint(sresult));

Genialny kod!!!

  1. Zresetowanie modemu następuje dopiero gdy 2 razy kliknę w button, dlaczego nie działa gdy klikne raz?

A ja się dziwię że za drugim razem działa, bo nigdzie nie widzę wywołania procedury podłączenia.

Moja rada: Zacznij od podstaw, bo twój kod to jedna wielka herezja.

0

Spodziewałem się tego typu odpowiedzi i dlatego napisałem że jestem początkujący, nie wiedziałem że to forum tylko dla zaawansowanych wszak w regulaminie nie jest o tym napisane.

1

Spodziewałem się tego typu odpowiedzi i dlatego napisałem że jestem początkujący, nie wiedziałem że to forum tylko dla zaawansowanych wszak w regulaminie nie jest o tym napisane.

  1. Masz forum newbie, tam się pyta o podstawy.
  2. Skoro nic nie umiesz to powiedziałem ci żebyś poczytał tutoriale, bo to że jesteś początkującym wcale nie zwalnia cię z wysiłku który musisz włożyć w naukę niektórych rzeczy (właściwie to zobowiązuje to poważniejszego traktowania rad dawanych przez doświadczonych użytkowników).

Ogarnij podstawy, potem zajmij się bardziej zaawansowanymi programami.

0

Do kodu "wkradł" się błąd, oczywiście linijki z "Button1.Click;" nie powinno być.

0

Pierwszy problem udało mi się rozwiązać, okazało się że winę ponosiła jedna linijka kodu.

New.Address := ('192.168.100.1'); należało zmienić na New.Host := ('192.168.100.1');

Problem drugi nadal pozostaje nierozwiązany i zapewne ponownie zaleje mnie fala krytyki ale nie zniechęca mnie to i nadal będę próbował rozwiązać problem, nawet gdybym miał spędzić nad tym całą noc.

0

i zapewne ponownie zaleje mnie fala krytyki

Jaka fala krytyki? Fala dobrych rad, żebyś nauczył się programować naprawdę.
Twój kod nie ma większego sensu, i domyślam się że w ogóle nie działa. Ale spoko, naprawiaj te 'błędy' zamiast posłuchać naszych rad i programować po ludzku.

0

Kod działa, chodziło o to aby resetować modem Thomson TCM 420 bez potrzeby uruchamiania przeglądarki, używa się tego modemu między innymi w kablówce Vectra i Petrus, zresztą jak ktoś ma internet w którejś z tych kablówek to może sobie sprawdzić. Nie rozumiem dlaczego sugerujesz iż kłamie odnośnie do tego kodu? Pisałbym posty w sprawie pomocy nad kodem który miałby nigdy nie zadziałać? jaki to ma sens? Napisałeś też abym zaczął od podstaw a ja uważam że to są podstawy bo przecież nie próbuję pisać gier, serwerów IRC czy aplikacji bazodanowych itd to tylko prosty "Resetter" którego jedynym zadaniem jest zresetowanie wyżej wymienionego modemu, poza tym tak naprawdę to dopiero moje pierwsze kroki w Delphi i w ogóle w programowaniu, nie jest powiedziane że się do tego nadaje, czas pokaże.

0

Nie rozumiem dlaczego sugerujesz iż kłamie odnośnie do tego kodu? Pisałbym posty w sprawie pomocy nad kodem który miałby nigdy nie zadziałać? jaki to ma sens?

Tobie się może wydawać że działa, albo ja się mylę co do jego aż tak strasznej niepoprawności, ale widząc ifa w buttonclicku widać że nic nie umiesz.

Napisałeś też abym zaczął od podstaw a ja uważam że to są podstawy bo przecież nie próbuję pisać gier, serwerów IRC czy aplikacji bazodanowych itd to tylko prosty "Resetter" którego jedynym zadaniem jest zresetowanie wyżej wymienionego modemu, poza tym tak naprawdę to dopiero moje pierwsze kroki w Delphi i w ogóle w programowaniu, nie jest powiedziane że się do tego nadaje, czas pokaże.

No jasne, to jest bardzo proste tylko że dla ciebie to i tak jest za trudne. Bazujesz się pewnie na jakimś gotowcu który lekko przerabiasz czy coś. Nie rozumiesz co kod znaczy, tylko usiłujesz go skopiować i zaadaptować nie rozumiejąc jego działania. Nie czytasz tutoriali o podstawach i o tym co robi co (może coś o tym wiesz, ale nie jest to wiedza wystarczająca do ogarnięcia kodu). Nie znasz biblioteki którą stosujesz (wiesz jak się nazywa?).
Programowanie to nie jest zabawa "może jak przestawię to tutaj to zacznie działać". Widać ty usiłujesz tak się bawić. Jeżeli nawet uda ci się ukończyć ten program to wreszcie dojdziesz do miejsca gdzie utkniesz ze względu na nieznajomość mechanizmów.
Nie wiem czy chcesz programować zawodowo/profesjonalnie, ale jeżeli tak to droga nie prowadzi przez przerabianie gotowców tylko skrupulatne czytanie tutoriali i pisanie kalkulatorów, notatników, paintów. Widać taki banalny 'resetter' który ma wysłać jeden request HTTP jest dla ciebie trudny w takim stopniu ze błądzisz po forach.

Poziom twojej programistycznej wiedzy prezentuje ten kod:

New.Active :=True;
IF New.Active = True then

Moja rada: daruj sobie przepisywanie gotowców i napisz coś samemu. Wiem że newbi oczekuje że będzie zaraz OS pisać ale niestety, to tak się nie prezentuje.

1

Bazujesz się pewnie na jakimś gotowcu który lekko przerabiasz czy coś. Nie rozumiesz co kod znaczy, tylko usiłujesz go skopiować i zaadaptować nie rozumiejąc jego działania. Nie czytasz tutoriali o podstawach i o tym co robi co (może coś o tym wiesz, ale nie jest to wiedza wystarczająca do ogarnięcia kodu). Nie znasz biblioteki którą stosujesz (wiesz jak się nazywa?).
Programowanie to nie jest zabawa "może jak przestawię to tutaj to zacznie działać". Widać ty usiłujesz tak się bawić. Jeżeli nawet uda ci się ukończyć ten program to wreszcie dojdziesz do miejsca gdzie utkniesz ze względu na nieznajomość mechanizmów

Masz rację posłużyłem się snifferem aby zobaczyć co musi zostać wysłane aby zresetować modem, zajrzałem też w źródło strony modemu, skorzystałem tez z Delphi 7 a nie jestem jego autorem, skorzystałem z komputera którego podzespoły nie zostały wyprodukowane przeze mnie, baa mało tego użyłem energii elektrycznej której nie wytworzyłem. Mógłbym tak wymieniać w nieskończoność jak patron programistów o nicku -123 treści wiele ale nic na temat, przeczytałem kilka postów które napisałeś ale nic zupełnie z nich nie wynika, próbujesz się kreować na wielkiego programistę pomimo że tak naprawdę nie umieściłeś ani linijki własnego kodu (pewnie z obawy przed krytyką tych którzy naprawdę potrafią programować) podkreślasz że "kodzisz" od 5 lat po to aby następnie poradzić jednemu z użytkowników

No jasne, możesz napisać skomplikowany system snapshotowania pamięci albo...
UŻYĆ PLIKÓW?!
innemu użytkownikowi napisałeś
Ja podpowiem: Wywalając kontrolkę.

Jestem pod wrażeniem ogromu twojej wiedzy z zakresu programowania :) W końcu programujesz od 5 lat także wiesz co piszesz. Problem jest taki ze owszem sporo piszesz ale to wszystko jest takie hmm "jałowe" w dodatku zazwyczaj ma z tematem tyle wspólnego co Hitler z pokojową nagrodą nobla. Podsumowując Twoje wnioski są warte tyle co przemyślenia schizofrenika który na domiar złego zapomniał o lekach. W sumie nie powinienem się dziwić zawsze znajdzie się ktoś kto będzie chciał za wszelką cenę zdyskredytować zupełnie nieznane sobie osoby tylko po to aby samemu "zaplusować" w oczach innych, pewnie ktoś to kupi i uzna cie za naprawdę świetnego programistę szkoda że jesteś tylko programistą-teoretykiem. Mi można wiele zarzucić jak np brak brak odpowiedniej wiedzy i doświadczenia do tego aby napisać jakąś wartościową aplikację z tym że ja się do tego przyznaje i zdaje sobie sprawę ze swoich wad, po prostu mam dystans do samego siebie czego tobie zabrakło. Powtórzę to co napisałem wcześniej dla mnie to jak na razie ZABAWA i nie spinam się tak jak ty a jedynie próbuję znaleźć odpowiedź na nurtujące mnie pytania a ten post to tylko REAKCJA na twoją AKCJE. Na szczęście są na tym forum naprawdę dobrzy programiści i nie omieszkali pomóc wysyłając PW :)

Jeszcze małe sprostowanie. Nie jestem autorem funkcji "Hex" której użyłem w kodzie, pozostała część kodu jest moja, użyłem ClientSocket zamiast np IdHTTP z prostych powodów.

  1. ClientSocket w zupełności do tego wystarczy
    2.To moje pierwsze kroki w Delphi więc na idHTTP przyjdzie jeszcze czas o ile nie zabraknie zapału, umiejętności, motywacji itd.

Pewnie wiele osób dziwi się że użyłem kilka razy słowa "zabawa" traktuję to jako zabawę ponieważ nie zajmuje się programowaniem zawodowo, nie miałem z nim styczności w szkole i jest dla mnie hobby. Może w przyszłości osiągnę poziom odpowiedni do tego aby nazwać się programistą (jeżeli nie to trudno) ale jak na razie jest jak jest. "Nie od razu Rzym zbudowano" lub jak kto woli "Nie od razu Kraków zbudowano" (wersja lokalna)
Na tym kończę i pozdrawiam wszystkich którzy pomogli za pomocą PW.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0