[Delphi] WinSock i HTTP

0

Witam, mam problem z wysłaniem prostego zapytania GET do serwera przy użyciu win socketów.

Oto mój kod:

uses
  Windows, WinSock, dialogs;

var
  wsa: WSAData;
  ErrorCode: Integer;
  klient: Integer;
  socket_adres: sockaddr_in;
  zapytanie: String;
  wyslano: Integer;

begin
  ErrorCode:=WSAStartup(MakeWord(2, 0), wsa);
  if (ErrorCode = SOCKET_ERROR) then ShowMessage('WSAStartup failed');

  klient:= socket(AF_INET, SOCK_STREAM, 0);  
  if (klient = INVALID_SOCKET) then ShowMessage('socket() failed');

  socket_adres.sin_family:= AF_INET;
  socket_adres.sin_addr.S_addr:= inet_addr('74.125.43.103'); //google.pl
  socket_adres.sin_port:= htons(80);

  ErrorCode:= connect(klient, socket_adres, SizeOf(socket_adres));   
  if (ErrorCode = SOCKET_ERROR) then ShowMessage('connect() failed');

  ErrorCode:= WSAAsyncSelect(klient, 0, WM_USER, FD_READ or FD_CONNECT or FD_ACCEPT);
  if (ErrorCode <> 0) then ShowMessage('WSAAsyncSelect() failed');

  zapytanie:=
    'GET /index.html HTTP/1.1' + #13#10 +
    'Host: google.pl' + #13#10;

  wyslano:= send(klient, zapytanie, Length(zapytanie), 0);
  if (wyslano < 0) then ShowMessage('Nie wysłano...');
end;

Wyrzuca mi ShowMessage('WSAAsyncSelect() failed') :-(

Bardzo proszę o korektę kodu / poradę :-)

0

A nie tak:

zapytanie:= 'google.pl/index.html'

Albo spróbuj to: http://synapse.ararat.cz/doku.php/public:howto:httpgetpage

0

@Machina: znienawidzą Ciebie haterzy jak mnie,
bo śmiałeś polecić Synapse, a nie choćby Indy ;)

0
olesio napisał(a)

@Machina: znienawidzą Ciebie haterzy jak mnie,
bo śmiałeś polecić Synapse, a nie choćby Indy ;)

Czemu? Synapse jest ok, indy też.

0

Ja wiem, ale już kolejny hater w innym temacie po raz kolejny, czepił się,
że nie poleciłem znowu Synapse. A ja nikogo do ów pakietu nie zmuszam.
Po prostu mam zainstalowane również Indy, ale go już nie używam i Jeśli
ktoś sobie z pakietem Indy nie radzi, nie wykombinował nic samodzielnie
oraz nie ma innych odpowiedzi pomocnych, to pokazuję jak to można też
zrobić alternatywnie, korzystając z Synapse, a kod wcześniej sprawdzam
w tym pakiecie. Jednak nie wszyscy moga to zrozumieć i zamiast pomóc
to krytykują. Wiem, można się wcale nie przejmowac, ale po co piszą ;/

0

Jak kożystałem z indy to zawsze były jakieś problemy. Z synapse nie, dlatego polecam. Wiadomo, każdy ma swoje upodobania.

A ludzie ślepo wierzą w jedno rozwiązanie, a nie spróbowali nic innego.

0

Rozumiem Ciebie Machina, bo dokładnie miałem też problemy z Indy i
dlatego od dawna staram się korzystać z Synapse, które - póki co się
sprawdza doskonale. Jednak haterzy, nie są w stanie tego zrozumieć.

0

Na haterów nie ma co patrzeć. Dziwne, że nie potrafią docenić, a łapią się za kodowanie.
Kasa w tesco już czeka...

0

Kod sprawdzony dziala:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, WinSock, Dialogs, Messages;

var
  wsa : WSAData;
  ErrorCode : Integer;
  Adr: String = '209.85.149.105';
  Gniazdo : Integer;
  socket_info: sockaddr_in;
  Handle : THandle;
  Buffer : array[0..112] of char;
  Odebralem : array[0..1024] of char;

begin
  ErrorCode := WSAStartup(MAKEWORD(2,0),wsa);
  if (ErrorCode = SOCKET_ERROR) then
    MessageBox(0, 'Nie mozna wystartowac gniazda', 'WinSock', MB_OK);

  Gniazdo := Socket(AF_INET, SOCK_STREAM, 0);
  socket_info.sin_family := AF_INET;
  socket_info.sin_addr.S_addr := inet_addr(PChar(Adr));
  socket_info.sin_port := htons(80);

  ErrorCode := connect(Gniazdo, socket_info, SizeOf(socket_info));
  if (ErrorCode = SOCKET_ERROR) then
    MessageBox(0, 'Nie mozna podlaczyc', 'WinSocks', MB_OK);

  WSAAsyncSelect(Gniazdo,Handle,WM_USER, FD_READ or FD_CONNECT or FD_ACCEPT);
  Buffer := 'GET / HTTP/1.1'+#13#10+
    'TE: deflate,gzip;q=0.3'+#13#10+
    'Connection: TE, close'+#13#10+
    'Host: www.google.pl'+#13#10+
    'User-Agent: WinSock Delhi'+#13#10+#13#10;
  send(Gniazdo, Buffer, SizeOf(Buffer), 0);
  Recv(Gniazdo, Odebralem, SizeOf(Odebralem), 0);
end.

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1