Wysyłanie danych za pomocą Winsock.

0

Witam,
Od razu na wstępie chciałbym powiedzieć , że dopiero się uczę i proszę o wyrozumiałość.
Chciałbym wysyłać dane za pomocą Winsock, lecz niestety nie wiem jak to dokładnie zrobić, próbowałem na wiele sposobów, ale i tak nie wysyłało mi danych, albo wysyłało a zle.

Wcześniej bawiłem sie z kodem , który znalazłem w internecie i mi działa.
Zrobiłem działające wysyłanie GET'em danych przez ten kod, lecz musze dodatkowo podpiąć moduły "

 SynaCode;
 httpSen;"

A one waża o pare kB za dużo :D Chciałbym zrobić jak najmniejszy plik, dlatego postanowiłem próbować użyc WInsock
I teraz moje pytanie, czy ktoś może mi pomóc zmodyfikować mój kod na Winsock,ewentualnie dać podpowiedz ?

procedure SendData;
begin
  func.httpToStream('http://www.domena.pl/add.php'+(
                //general data
                    'owoc='+aktualnyOwoc+
                    '&warzywo='+aktualneWarzywo         
                    ),nil);
end;

Aktualne funkcje, do teogo potrzebne :

function StreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0);
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;

function httpToStream(URL : string; const SomeStream : TStream): string;
var
  SynHttp : THttpSend;
begin
  Result:='';
  SynHttp := THttpSend.Create;
  try
    SynHttp.HTTPMethod('GET', EncodeUrl(Url));
      if SomeStream <> nil then
      begin
        SynHttp.Document.SaveToStream(SomeStream);
        SomeStream.Position := 0;
      end
      else
        result:=StreamToString(SynHttp.Document);
  finally
    SynHttp.Free;
  end;
end;

Proszę o pomoc

0

@olesio , dziękuję.
A jakiś przykład z użyciem wysłania danych mógłbyś podać?
Tak jak ja to miałem powyżej zrobione GET'em ?

0

Na pewno nie teraz, bo nie mam dostępu do swojego kodu. ale zobacz snifferem co wysyłasz z pod Synapse i pod SimpleTcp wyślij to samo. Żaden problem, masz przecież przykład na stronie autora dla GETa.

0

Nie idzie mi :<

2

Ech, odpisałem już Tobie na Twoją wiadomośc prywatną. Najłatwiej napisać "nie idzie mi" i czekać na gotowca :/ Smutne to, że nie chciało Ci się dłużej pokombinować samodzielnie. Poniżej kod, który może się kiedyś przyda innym. Posłałem go w odpowiedzi. Na przyszłość ludziki, piszcie na PW w ważnych sprawach, na odpowiedzi z kodem raczej jest już założony wątek na forum. Poniższy fragment to najważniejsze wycinki z kodu mojego downloadera z ipla.tv. Wiem, że funkcje do wyciągania samego hosta jak i inne rzeczy z pewnością da się napisać inaczej oraz lepiej, ale ja to pisałem dość dawno, nie zastanawiając się za bardzo nad tym. Dla mnie (może i niestety) ważny był końcowy efekt, że całość działa prawidłowo. Pytający może na końcu wykazać trochę ambicji i poprawić oraz może udoskonalić całość po swojemu.

//...
uses
  simpletcp;
 
const
  WWW_Prefix = 'www.';
  Default_Http_Port = 80;
  Http_Prefix = 'http://';
  OperaUserAgent = 'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.01';
 
function GetOnlyHostName(Url : string; OnlyDomain, LeaveWWWPrefix : boolean) : string;
var
  I, Cnt : integer;
  AddWWWPrefix : boolean;
begin
  Url := AnsiLowerCase(Url);
  if Pos(Http_Prefix, Url) = 1 then
  begin
    Delete(Url, 1, Length(Http_Prefix));
  end;
  if not OnlyDomain then
  begin
    if not LeaveWWWPrefix then
    begin
      AddWWWPrefix := Pos(WWW_Prefix, Url) = 1;
      if AddWwwPrefix then
      begin
        Delete(Url, 1, Length(WWW_Prefix));
      end;
    end;
    I := Pos('/', Url);
    if (I > 0) then
    begin
      I := I - 1;
    end
    else
    begin
      I := Length(Url);
    end;
    Result := Copy(Url, 1, I);
  end
  else
  begin
    if not LeaveWWWPrefix then
    begin
      AddWWWPrefix := Pos(WWW_Prefix, Url) = 1;
      if AddWWWPrefix then
      begin
        Delete(Url, 1, Length(WWW_Prefix));
      end;
    end;
    I := Pos('/', Url);
    if (I > 0) then
    begin
      I := I - 1;
    end
    else
    begin
      I := Length(Url);
    end;
    Url := Copy(Url, 1, I);
    Cnt := 0;
    for I := Length(Url) downto 1 do
    begin
      if Url[I] = '.' then
      begin
        Cnt := Cnt + 1;
        if Url[I - 1] = '.' then
        begin
          Url[I - 1] := '\';
        end;
      end;
      if Cnt > 1 then
      begin
        Break;
      end;
    end;
    Delete(Url, 1, I);
    repeat
      Cnt := Pos('\', Url);
      if Cnt > 0 then
      begin
        Delete(Url, Cnt, 1);
      end;
    until Cnt = 0;
    Result := Url;
  end;
end;
 
function PostTextToWeb(Url, DataToPost : string; DomainOnly : boolean) : string;
var
  Clnt : TTcpClient;
  SlashPos : integer;
  OnlyHost, S : string;
begin
  Result := '';
  OnlyHost := GetOnlyHostName(Url, DomainOnly, not DomainOnly);
  if Pos(Http_Prefix, Url) = 1 then
  begin
    Delete(Url, 1, Length(Http_Prefix));
  end;
  SlashPos := Pos('/', Url);
  if SlashPos > 0 then
  begin
    Url := Copy(Url, SlashPos, MaxInt);
  end;
  Clnt := TTcpClient.Create(OnlyHost, Default_Http_Port);
  Clnt.WriteLn('POST ' + Url + ' HTTP/1.0' + CRLF + 'Host: ' + OnlyHost + CRLF +
    'User-Agent: ' + OperaUserAgent + CRLF +
    'Content-Type: application/x-www-form-urlencoded' + CRLF +
    'Content-Length: ' + IntToStr(Length(DataToPost)) + CRLF + CRLF + DataToPost);
  repeat
    Clnt.ReadLn(S);
  until S = '';
  while Clnt.ReadLn(S) do
  begin
    Result := Result + S + CRLF;
  end;
  Delete(Result, Length(Result) - 1, Length(CRLF));
end.
0

Ok,dzięki. Myślę , że teraz sobie na spokojnie poradzę.

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