Nowicjusz Napisano Kwiecień 14, 2012 Zgłoś Share Napisano Kwiecień 14, 2012 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: [url="http://192.168.100.1/set_scan_page.asp"]http://192.168.100.1/set_scan_page.asp'[/url] + 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')); end; end. Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Kwiecień 15, 2012 Zgłoś Share Napisano Kwiecień 15, 2012 1) Naglowek http powinien byc zakonczony znakiem powrotu karetki i nowej linii. Sprawdz dokladnie w dokumentacji 2) content-lenght - czy na pewno jest dobry? Jezeli po pierwszym kliknieciu nic sie nie dzieje znaczy ze server nie dostal pelnego zapytania i jeszcze czeka, sprawdzaj odpowiedz z servera. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
Nowicjusz Napisano Kwiecień 15, 2012 Autor Zgłoś Share Napisano Kwiecień 15, 2012 Dzięki za odpowiedź, na pewnym słynnym forum dla programistów próbowano zmieszac mnie z błotem z powodu kodu który umieściłem i nieważne było ze dopiero raczkuje w Delphi i w ogóle w programowaniu. Co do samego kodu to okazało się że wystarczyło zmienić tę linię: New.Address := ('192.168.100.1'); (źle) New.Host := ('192.168.100.1'); (dobrze) Link do komentarza Udostępnij na innych stronach More sharing options...
olesio Napisano Kwiecień 15, 2012 Zgłoś Share Napisano Kwiecień 15, 2012 Wprawdzie poradziłeś sobie z problemem, ale na przyszlośc mogę Tobie polecić skorzystanie z modułu SImpleTCP do obsługi protokołu TCP. Moduł dostępny jest wraz z prostym przykładem serwera i klienta (w tamtym przypadku HTTP) na stronie: http://piechnat.pl/a.../simpletcp.html i nie musisz się w nim bawić w jakieś dziwne konstrukcje z funkcją Hex tylko używasz stałej CRLF. A zaletą modułu jest to, że można napisac sobie prostą aplikację w WinAPI bez potrzeby nadmiernego "puchnięcia' exeka jak pod VCL. EDIT: a co do Twojego wątku napisanego na 4p, to właścnie go czytam, ale widzisz pierwszy powód reagowania na Ciebie @123 który jest od jakiegoś czasu aktywniejszy w tym dziale niż ja, ponieważ pracuje i nie mogę siedzieć tam i odpisywać 24/7, był taki że napisałeś nie do właściwego działu. Od pytan o podstawy tam jest Newbie. I nie zrażaj się, po prostu nieraz mamy dosyć pytan o podstawy i braku przejawów prób kombinowania samodzielnie przed zadaniem pytania, stąd pewnie reakcja 123, ale nie zrażaj się. Ja do końca nie biorę poważnie użytkowników, którzy nawet nie kwapią się by tam się zarejestrować. Wtedy można było by łatwiej wyszukiać ich inne posty i zobaczyć, że mają niestety taki specyficzny styl. Pozdrawiam: olesio Link do komentarza Udostępnij na innych stronach More sharing options...
Nowicjusz Napisano Kwiecień 15, 2012 Autor Zgłoś Share Napisano Kwiecień 15, 2012 Dzięki za pomoc oraz link do SimpleTCP mam zamiar napisać "aplikację" od nowa tym razem bez Funkcji "Hex" która po dokładnym przeanalizowaniu kodu i jego poprawkach okazała się niepotrzebna. WinAPI uważam za bardzo dobry pomysł bo trochę wbrew logice jest korzystanie z formy jeżeli "aplikacja" ma wysłać tylko request poprzez protokół HTTP i to cała jej rola. Celowo słowo "aplikacja" umieszczam w cudzysłowiu bo tak naprawdę to tylko kilka linijek kodu a może ich być i będzie (gdy się nieco poduczę Delphi) jeszcze mniej. Na koniec jeszcze raz dziękuję za pomoc i wskazówki, może kiedyś będę mógł się odwdzięczyć. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.