Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi http GET Request per TSocket senden und Response empfangen (https://www.delphipraxis.net/148462-http-get-request-per-tsocket-senden-und-response-empfangen.html)

jokerfacehro 2. Mär 2010 12:10


http GET Request per TSocket senden und Response empfangen
 
hallo,

ich programmiere mit Delphi 7 Enterprise.

ich mache gerade ein nonVCL socket programm, das auch soweit läuft.
ich möchte jetzt mit dem TCP socket daten von nem Webserver abgreifen

dabei hab ich mir das so gedacht:

Delphi-Quellcode:

str:='GET /download/index.php HTTP/1.1'+#13#10+'Host: blumenhund.afischi.de';

FSocket:=createSocket_TCP;

connectSock(FSocket,hp,80); //hp ist die ipadresse des webservers

Send(FSocket,str,Length(str),1);



function WndProc(hWnd: HWND; Msg: UINT; wp: WPARAM;
lp: LPARAM): integer; stdcall;
var str,str1:string;
    count:integer;
begin
   Result := 0;
  case lp of

    FD_READ:
      begin
      str:='';
      str1:='';
      setLength(str1,8192);
      //showmessage('hallo du da');
      //FillChar(str,Length(str),#0);
        count:=recv(FSocket,str1[1],8192,0);

        while count>0 do begin
          setLength(str1,count);
          str:=str+str1;
          setLength(str1,8192);
          count:=recv(FSocket,str1[1],8192,0);
        end;

        Showmessage(str);
        PostQuitmessage(Msg);
        //-- WMOnAsyncServerData(wp, lp);
      end;
    end;
end;
allerdings bekomme ich keine antwort vom server.
sieht mein Get-String falsch aus ? oder woran kanns liegen.

die sockets funktionieren auf jedenfall und internet ist auch vorhanden, ohne proxy

sirius 2. Mär 2010 12:17

Re: http GET Request per TSocket senden und Response empfang
 
http erwartet am Ende eine Leerzeile

jokerfacehro 2. Mär 2010 12:20

Re: http GET Request per TSocket senden und Response empfang
 
Delphi-Quellcode:
str:='GET /download/index.php HTTP/1.1'+#13#10+'Host: blumenhund.afischi.de'+#13#10+#13#10;
hat keinen erfolg gebracht


Edit:

Delphi-Quellcode:
str:='GET /download/index.php HTTP/1.1\r\nHost: blumenhund.afischi.de\r\n\r\n';
geht auch nicht

sirius 2. Mär 2010 12:31

Re: http GET Request per TSocket senden und Response empfang
 
Und die anderen Angaben, welche so in einen http-Header gehören
- Accept
- Accept-Language
- Accept-Encoding
- User-Agent
- Connection
Ich weis nicht, was und wie und warum davon notwendig ist.

Phoenix 2. Mär 2010 12:38

Re: http GET Request per TSocket senden und Response empfang
 
Also wenn mein Firefox einen request sendet, dann sieht der so aus:
Code:
GET /download/index.php HTTP/1.1
Host: blumenhund.afischi.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en-GB;q=0.7,de-DE;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

jokerfacehro 2. Mär 2010 12:48

Re: http GET Request per TSocket senden und Response empfang
 
hmm also mein header sieht so aus und des funzt immer noch net :D

Delphi-Quellcode:
str:='GET /download/index.php HTTP/1.1 \r\n\r\n'+
     'Host: blumenhund.afischi.de\r\n\r\n'+
     'Connection: close\r\n\r\n'+
     'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n\r\n'+
     'Accept-Encoding: gzip\r\n\r\n'+
     'Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n\r\n'+
     'Cache-Control: no \r\n\r\n'+
     'Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n\r\n';

Edit: deinen habe ich auch ausprobiert Phoenix, geht aber auch nicht.
Wenn ich auf nen anderen Port lausche bekomme ich gleich ne absage vom server, dass der server die verbindung abgelehnt hat, aber
so bekomme ich garnix.

sirius 2. Mär 2010 13:10

Re: http GET Request per TSocket senden und Response empfang
 
Also ich bekomme damit von der DP eine schöne Antwort

Edit:
Delphi-Quellcode:
s:='GET / HTTP/1.1 '+#13#10+
     'Host: delphipraxis.net'+#13#10+
     'Connection: close'+#13#10+
     'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'+#13#10+
     'Accept-Encoding: gzip'+#13#10+
     'Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7'+#13#10+
     'Cache-Control: no'+#13#10+
     'Accept-Language: de,en;q=0.7,en-us;q=0.3'+#13#10#13#10;

jokerfacehro 2. Mär 2010 14:35

Re: http GET Request per TSocket senden und Response empfang
 
ich lad mir grad den xampp und versuch das ganze mal aufm localhorst


Edit: aufm Xampp ausprobiert klappt auch nicht :/
das muss wohl irgendwo am socket liegen. komischerweise kann ich mit meinem eigenen server kommunizieren

das FD_READ wird in WndProc einfach nicht ausgelöst

sirius 2. Mär 2010 15:02

Re: http GET Request per TSocket senden und Response empfang
 
Delphi-Quellcode:
uses
  windows,
  winsock;

// aus WinSock2
type WSAevent=THandle;
function WSACreateEvent:WSAEvent;stdcall;
external 'ws2_32.dll' name 'WSACreateEvent';
function WSACloseEvent(hEvent:WSAevent):bool;stdcall;
external 'ws2_32.dll' name 'WSACloseEvent';
function WSAResetEvent(hEvent: WSAEvent):bool;stdcall;
external 'ws2_32.dll' name 'WSAResetEvent';
function WSAEventSelect(s:TSocket;hEventObject:WSAevent;lNetworkEvents:LongInt):Integer; stdcall;
external 'ws2_32.dll' name 'WSAEventSelect';
function WSAWaitForMultipleEvents(cEvents:DWord;
                                  lphEvents:Pointer;
                                  fWaitAll:bool;
                                  dwTimeOUT:DWord;
                                  fAlertable:bool):DWord;stdcall;
external 'ws2_32.dll' name 'WSAWaitForMultipleEvents';




var
  SockAddr1:TSockAddr= (sin_family:af_Inet;
                        sin_port:$5000; //=80
                        sin_addr:(S_addr:$C49F4B3E)); //=62.75.159.196


const WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;


procedure main;
var wsaData:TwsaData;
    SockEvent:WSAEvent;
    Socket1:TSocket;
    WSAresult:Integer;
    buf:array[0..511] of char;
    s:string;
begin
  WSAStartUp(MakeWord(2,0),WSAData);

  Socket1:=Socket(af_Inet,Sock_Stream,IPProto_TCP);
  Connect(Socket1,SockAddr1,sizeof(TSockAddr));
  SockEvent:=WSACreateEvent;
  WSAEventSelect(Socket1,SockEvent,FD_Read);

  s:='GET /download/index.php HTTP/1.1 '+#13#10+
     'Host: blumenhund.afischi.de'+#13#10+
     'Connection: close'+#13#10+
     'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'+#13#10+
     'Accept-Encoding: gzip'+#13#10+
     'Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7'+#13#10+
     'Cache-Control: no'+#13#10+
     'Accept-Language: de,en;q=0.7,en-us;q=0.3'+#13#10#13#10;
  send(Socket1,s[1],length(s),0);



  repeat
    WSAResult:=WSAWaitForMultipleEvents(1,@SockEvent,false,infinite,false);
    case WSAResult of
      WSA_WAIT_EVENT_0 : begin
        fillchar(buf,sizeof(buf),0);
        recv(Socket1,buf,512,0);
        write(buf);
      end;
      else
        break;
    end;
    WSAresetEvent(SockEvent);
  until false;


  WSACloseEvent(SockEvent);
  WSACleanUp;
end;

begin
  main;
end.
Macht. Müsste aber auch über Messages gehen.

jokerfacehro 2. Mär 2010 15:08

Re: http GET Request per TSocket senden und Response empfang
 
ich hab mal ne verbindung zu meinem server aufgebaut.

und der ankommende text beim server ist nicht der gleiche wie der abgesendete.
es kommen maximal 7 zeichen an und die sind "�"

andersrum, wenn ich vom server zu meinem client sende, kommt der klartext wunderbar an :gruebel:



Edit: hat sich gelöst, meine fresse :wall:

es lag daran:

Delphi-Quellcode:
send(Socket1,s,length(s),0);

//--->>>> so muss es sein

send(Socket1,s[1],length(s),0);

sirius 2. Mär 2010 15:11

Re: http GET Request per TSocket senden und Response empfang
 
ups, das sieht nach einem UniCode BOM aus. Verwende mal Ansistring!
Edit: Na dann...

jokerfacehro 2. Mär 2010 15:14

Re: http GET Request per TSocket senden und Response empfang
 
http get abfrage klappt jetzt auch wunderbar :)

shmia 2. Mär 2010 15:20

Re: http GET Request per TSocket senden und Response empfang
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du kannst Dir das Leben auch etwas leichter machen und mit dem Interface IXMLHTTPRequest arbeiten.
Funktioniert auch über Proxyserver und mit HTTPS!

Das Demo (VCL-Anwendung) im Anhang lässt sich relativ einfach in eine Konsolenanwendung umbauen.

jokerfacehro 2. Mär 2010 15:26

Re: http GET Request per TSocket senden und Response empfang
 
danke für die info, werd se mir ma anschaun, muss mir aber erstmal MSXML2_TLB besorgen

da ich aber das programm so klein wie möglich haben will, werd ich das wohl mit dem socket so machen.
klappt jetzt ja alles :)

shmia 2. Mär 2010 15:29

Re: http GET Request per TSocket senden und Response empfang
 
Zitat:

Zitat von jokerfacehro
... muss mir aber erstmal MSXML2_TLB besorgen

Musst du Dir nicht besorgen, sondern nur importieren.
1.) Datei -> alles schliesen
2.) Projekt -> Typbibliothek importieren...
3.) Auswählen: Microsoft XML (Version 4)
4.) Unit anlegen klicken

Bei Delphi 7 muss du ggf noch die Unit Variants in die Uses-Liste aufnehmen.

jokerfacehro 2. Mär 2010 15:31

Re: http GET Request per TSocket senden und Response empfang
 
da ich jede Version bis auf die 4er habe, muss ich mir die wohl holen um das zu testen :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz