Link to home
Start Free TrialLog in
Avatar of wizard2000
wizard2000

asked on

TClientSocket help

We are trying to write a program which uses a TClientSocket object to send a text string to an HTTP server and receive the response.

It seems so far that the socket is opened and data is sent to the server (apache logs confirm this). However, no data seems to be recevied and processed on the OnRead event. This does not even seem to be triggered.

Please note that this is Delphi 5.

Code below:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form1.ClientSocket1.Active := True;
//clientsocket1.Open;
clientsocket1.Socket.SendText('GET http://www.getminted.com/Hello HTTP/1.1' + #13 + 'Host: www.getminted.com' + #13 + 'Connection: close' + #13 + #13 );
clientsocket1.socket.
FWaiting := true;
Application.MessageBox('SendText','', MB_OKCANCEL + MB_DEFBUTTON1) ;
while FWaiting do
Application.processmessages;
end;


procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
Buffer : array [0..4095] of char;
BytesReceived : integer;
MemoryStream : TMemoryStream;
begin
Application.MessageBox('ClientSocket1Read','', MB_OKCANCEL + MB_DEFBUTTON1) ;

  while FWaiting do
  begin
    MemoryStream := TMemoryStream.Create;
    try
     // Sleep(200);
      while True do
      begin
      BytesReceived := Socket.ReceiveBuf(Buffer,SizeOf(Buffer));
      if (BytesReceived <= 0) then
        Break
      else
      begin
      edit1.text := Buffer;
      MemoryStream.Write(Buffer,BytesReceived);
      end;

      end;
      FWaiting := False;
      MemoryStream.Position := 0;
   // XMLResponse.LoadFromStream(MemoryStream);
    finally
      MemoryStream.Free;
    end;
  end;
end;
Avatar of RHenningsgard
RHenningsgard
Flag of United States of America image

If you're getting connected to port 80 of the web server and getting no response to your GET, then your GET isn't formatted correctly.  You may find the easiest way to get it right is to observe in detail how a web browser formats its GET and then duplicate that precisely.

I recommend the following:

1) Get a copy of Ethereal (see http://www.ethereal.com ) and install it on the machine on which you're running your Delphi test application.

2) Run Ethereal, capturing your own network traffic, with the filter "port 80".

3) Use a web browser (like IE) to fetch the URL you're trying to get with your Delphi application.

4) Read the Ethereal log to see precisely how the GET is formatted by IE, then duplicate that precisely in your application.

In the process, you'll both figure out what your application is doing wrong, and you'll learn to use a very powerful diagnostic tool (one you're going to want sooner or later anyhow).

Rob---
For what it's worth, I think I've always seen web browsers use both #13 carriage return and #10 line feed for terminators, i.e.

clientsocket1.Socket.SendText('GET http://www.getminted.com/Hello HTTP/1.1' + #13#10 + 'Host: www.getminted.com' + #13#10 + 'Connection: close' + #13#10#13#10 );

That might be the problem.

Rob
ASKER CERTIFIED SOLUTION
Avatar of RHenningsgard
RHenningsgard
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of wizard2000
wizard2000

ASKER

Yep but the thing is, if you do it from a telnet prompt (on a unix machine at least) you get data back. IE just using
GET /Hello HTTP/1.0
Host: www.getminted.com

(note 2 returns to terminate the data)

This returns 'stuff' - thing is im not getting the onread event triggered which as far as im concerned it should be. The additional stuff is not needed to get a response from the server so shouldent be need to trigger the onread as far as i can see.

Why is it not triggering?!?! Driving me nuts... BTW I started using 13 10 as the term chars but it makes no difference.

And, strangest of all, apache is showing the request in the logs. As an error, but a raw socket shouldent be aware of that.
Unfortunatly ethereal just crashes as soon as its started...
right... you don't send the whole www... after the GET everytime, just the URL from the root point, in this case "/Hello"

in any case... shouldn't you get a response back saying at least error or something?
Exactly! Damn event should be triggered... I have a messagebox alert first thing in the onread event but it never gets called, program just gets stuck in the application.processmessages bit.

Normally im a unix / perl coder so this is a bit out of my experience... but do you guys concur this should be right?
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
erm, i accepted an answer days ago... why was this changed?