Skocz do zawartości

Problem z dynamiką i znakiem " . " w winsock


Nowicjusz

Polecane posty

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

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

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

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

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...