ClientSocket, wie lesen?
-
Hallo.
Also mir scheint ich bin zu dumm um das ClientSocket unter BCB5 zu verwenden.
Ich puzzle seit 2 Tagen dran rum und kriege es nicht hin irgendetwas von einem server zu empfangen.Hat jemand bitte einen Hinweis für mich?
PS: Ja ich habe die BCB Hilfe gelesen, die hilft mir aber nicht weiter.
danke!
-
hi, hoffe das hilft dir dabei.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString s_packet;
s_packet= "hallo";Client1->Socket->SendText(s_packet);
}void __fastcall TForm1::Server1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString r_packet;r_packet=Socket->ReceiveText();
}MfG
bilal
-
ja soweit war ich auch schon.
aber irgendwie funktioniert das nicht so recht bei mir.AnsiString request; request="GET /index.html HTML/1.0"; ClientSocket1->Open(); ClientSocket1->Socket->SendText(request);
daraufhin möchte ich im OnRead Event des clientsockets lesen wie folgt:
Memo1->Lines->Add(Socket->ReceiveText());
aber irgendwie kommt da nichts
ist mein http GET string falsch?
da müsste doch zumindest irgendwas von "bad request" zurückkommen.steh aufm schlauch.
-
vielleicht solltest du dir mal die RFC von HTTP reinziehen... ( http://www.w3c.org ) oder hier mal vorbei schauen.
-junix
-
ob es geht siehst du am besten an einem selbstgebastelten Server(mit ServerSocket) oder auch gut zum testen geht ein irc oder battle.net Server.
machmal
ClientSocket1 -> Host= "europe.battle.net"; ClientSocket1 -> Port= 6112; ClientSocket1 -> Open(); ClientSocket->Socket->SendText("c"); // für als chatbot einloggen
das Memo1->Lines->Add(Socket->ReceiveText()); lass stehen und du wirst sehen das etwas zurückkommen wird...
Aber webserver ansprechen geht wie schon gesagt etwas komplizierter... dazu musst du in einem nicht soo einfachem übergeordnetem Protokoll kommunizieren(http halt) und das solltest du vorher erstmal lernen
-
nun, danke erstmal für die tips.
aber http ist soweit kein problem, mittels telnet klappen die abfragen ja alle.
connects auf chargen oder echo scheinen zu funktionieren, mich beschleicht der verdacht dass man an die http befehle noch irgendwelche steuerzeichen anhängen muss....
mal schauntschau
-
Original erstellt von <nme>:
aber http ist soweit kein problemdefinitiv schon, denn du hast einwichtiges element vergessen das HTTP benötigt. Schau dir den zweiten link mal genau an... da steht was von blank line...$
-junix
-
meinst du das CLRF
das funktioniert so aber auch nicht ?request="GET /pub/WWW/TheProject.html HTTP/1.1 CLRF";
kannst du uns nicht noch nen Tip geben oder vielleicht die Lösung sagen ?
-
Hi,
vielleicht hilft eine Escapesequenz?Alexander Sulfrian
-
mmh, so funktioniert es
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString request; request="HEAD /k1/index.html HTTP/1.0 \n\n"; ClientSocket1->Host="192.168.0.1"; ClientSocket1->Port=80; ClientSocket1->Open(); ClientSocket1->Socket->SendText(request); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { Memo1->Lines->Add(Socket->ReceiveText()); }
allerdings erst wenn ich den Button zweimal hintereinander drücke...
wo muss ich eigentlich ClientSocket1->Close(); ausführen, damit die Verbindung ordentlich wieder getrennt wird ?
-
CRLF = Carrage return, Linefeed \r\n!!!
-junix
-
das problem mit dem 2x drücken hatte ich auch schon, konnte das nicht lösen
auch ein \r\n oder auch zum test \x0A\x0D und umgekehrt bringt auch nix.
man muss mind. 2x den button drücken.
-
Klar... weil ihr die Verbindung mit dem Request überfahrt. Die Verbindung muss nach dem Aufruf von Open () noch nicht sicher stehen. Ich würde hier empfehlen einen Event zu nutzen. (Schaut euch da mal etwas um). Btw: Das HTTP schreibt \r\n vor und daran hat man sich zu halten. Jeder Request muss mit 2 \r\n abgeschlossen werden!
-junix
-
das ist des rätsels Lösung
--> vielen Dank junixvoid __fastcall TForm1::Button1Click(TObject *Sender) { ClientSocket1->Host=Edit1->Text; ClientSocket1->Port=80; Memo1->Lines->Clear(); ClientSocket1->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { ClientSocket1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { ErrorCode=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { AnsiString request="HEAD / HTTP/1.0 \r\n\r\n"; ClientSocket1->Socket->SendText(request); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { Memo1->Lines->Add(Socket->ReceiveText()); } //---------------------------------------------------------------------------