Chcę wysłać zwykły GET do serwera jakiejś stronki np. pcworld.pl, ale coś mi nie wychodzi.
Tak samo z odbieraniem danych (jakieś krzaki mam)...
Ogólnie to mało jest w necie info (na Polskich stronkach) o socketach.
Na gotowym komponencie socketów nie chcę nic robić, bo to banalne to wysyłanie zapytań i odbieranie danych... chcę się nauczyć winsocka, na początek samego clienta...
Na razie wykodziłem coś takiego:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock, StdCtrls, ComCtrls;
const
wm_polaczenie = WM_USER + 22;
type
TForm1 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure polaczenie(var Msg: TMessage); message wm_polaczenie;
procedure OdebraneDane;
public
{ Public declarations }
end;
var
Form1: TForm1;
//wsa
wsa: WSAData;
//klient
klient: Integer;
socket_adres: sockaddr_in;
ErrorCode: Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ver: DWORD;
zapytanie: String;
wyslano: Integer;
begin
//WSAData
ver:= MakeWord(2, 2);
ErrorCode:= WSAStartup(ver, wsa); //WSAStartup()
if (ErrorCode = SOCKET_ERROR) then ShowMessage('Funkcja WSAStartup failed');
//Klient
klient:= socket(AF_INET, SOCK_STREAM, 0); //Socket()
if (klient = INVALID_SOCKET) then ShowMessage('Funkcja socket() failed');
//dane
socket_adres.sin_family:= AF_INET;
socket_adres.sin_addr.S_addr:= inet_addr('194.69.207.226'); //pcworld.pl
socket_adres.sin_port:= htons(80);
ErrorCode:= connect(klient, socket_adres, SizeOf(socket_adres)); //Connect()
if (ErrorCode = SOCKET_ERROR) then ShowMessage('Funkcja connect() failed');
//wsaAsyncSelect()
ErrorCode:= WSAAsyncSelect(klient, handle, wm_polaczenie, FD_READ or FD_CONNECT or FD_ACCEPT);
if (ErrorCode <> 0) then ShowMessage('WSAAsyncSelect() failed');
zapytanie:=
'GET /tematdnia/ HTTP/1.1' + #13#10 +
'Host: www.pcworld.pl' + #13#10 +
'User-Agent: Mozilla/5.0' + #13#10 +
'Accept: text/html' + #13#10 +
// 'Accept-Encoding:' + #13#10 +
'Keep-Alive: 115' + #13#10 +
'Connection: keep-alive' + #13#10 + #13#10;
wyslano:= send(klient, zapytanie, Length(zapytanie), 0);
if (wyslano < 0) then ShowMessage('Nie wysłano...');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closesocket(klient);
WSACleanup;
end;
procedure TForm1.OdebraneDane;
var
buffer: array[1..4096] of Char;
begin
recv(klient, buffer, 4096, 0);
Form1.RichEdit1.Lines.Add('----------');
Form1.RichEdit1.Text:= Form1.RichEdit1.Text + #13#10 + buffer;
end;
procedure TForm1.polaczenie(var Msg: TMessage);
begin
//LParam ma FD_READ, FD_WRITE etc?
//WParam to socket?
case WSAGetSelectEvent(Msg.LParam) of
FD_READ:
begin
OdebraneDane;
end;
FD_WRITE: RichEdit1.Lines.Add('write');
FD_CLOSE: RichEdit1.Lines.Add('close');
end;
end;
end.
Jeśli ktoś może to niech wklei to do delphi i sprawdzi lub poprawi.
Komponenty: Button i RichEdit (nazwy domyślne, standardowe).
Nie wiem, czy dobrze komunikaty obsługuję, nie wiem, czy w dobry sposób wysyłam dane. Proszę mnie poprawić jakby co.
A w snifferze nie widzę, by program wysyłał GET... (wysyła jakby coś innego?)
Będę bardzo wdzięczny za pomoc