Problem z dynamiką i znakiem " . " w winsock

0

Witam
Jestem początkujący jeżeli chodzi o Delphi, postanowiłem napisać prostą aplikację za pomocą której będę mógł resetować modem Thomson TCM 420 którego używa się w większości kablówek. bez potrzeby uzywania www. Aplikacja działa na komponencie winsock dołączanym dynamicznie mam jednak z nia 2 problemy.

  1. Zresetowanie modemu następuje dopiero gdy 2 razy kliknę w button, dlaczego nie działa gdy klikne raz?

  2. Dlaczego w niektórych miejscach mogę normalnie wstawić " . " (kropka) a w innych muszę jako hex bo inaczej aplikacja nic nie wysyła? przykład: New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A')); jeżeli mam "HTTP/1.1 to aplikacja niczego nie wysyła a więc kropkę musiałem zapisac jako hex. Oto cały kod.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, ComCtrls, ExtCtrls, OleCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure NewRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  New : TClientSocket;
  Dane : String;
implementation

{$R *.dfm}
Function Hex(strData:string): string;
var sresult:string; sfinal:string; hexc:cardinal; i:integer;
begin
i:=1;
while i<=length(strData) do
begin
hexc := strtoint('$' + copy(strData,i,2));
sresult :=  inttostr(hexc);
sresult := chr(strtoint(sresult));
sfinal := sfinal + sresult;
i:=i+2;
end;
result := sfinal
end;


procedure TForm1.NewRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.lines.add(Dane);
Memo1.SelLength := length(Memo1.Text);
Memo1.SelStart := length(Memo1.Text);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
New := TClientSocket.Create(self);
New.Address := ('192.168.100.1');
New.Port := 80;


end;

procedure TForm1.Button1Click(Sender: TObject);
begin
New.Active :=True;

IF New.Active = True then
New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A'));
New.Socket.SendText('Host: 192.168.100.1' + hex('0A'));
New.Socket.SendText('User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1' + hex('0A'));
New.Socket.SendText('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + hex('0A'));
New.Socket.SendText('Accept-Language: pl,en-us;q=0.7,en;q=0.3' + hex('0A'));
New.Socket.SendText('Accept-Encoding: gzip, deflate' + hex('0A'));
New.Socket.SendText('Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7' + hex('0A'));
New.Socket.SendText('Connection: keep-alive' + hex('0A'));
New.Socket.SendText('Referer: http://192.168.100.1/set_scan_page.asp' + hex('0A'));
New.Socket.SendText('Content-Type: application/x-www-form-urlencoded' + hex('0A'));
New.Socket.SendText('Content-Length: 20' + hex('0A')  + hex('0A'));
New.Socket.SendText('CmInfoDsFreq1=&CmInfoUsId1=' + hex('0A'));
Button1.Click;
end;

end.
0
  1. Dlaczego w niektórych miejscach mogę normalnie wstawić " . " (kropka) a w innych muszę jako hex bo inaczej aplikacja nic nie wysyła? przykład: New.Socket.SendText('POST /goform/set_scan_page HTTP/1' + hex('00') + ('1') + hex('0A')); jeżeli mam "HTTP/1.1 to aplikacja niczego nie wysyła a więc kropkę musiałem zapisac jako hex.

Bo jesteś geniuszem i uważasz że to z tego wynika.

hexc := strtoint('$' + copy(strData,i,2));
sresult :=  inttostr(hexc);
sresult := chr(strtoint(sresult));

Genialny kod!!!

  1. Zresetowanie modemu następuje dopiero gdy 2 razy kliknę w button, dlaczego nie działa gdy klikne raz?

A ja się dziwię że za drugim razem działa, bo nigdzie nie widzę wywołania procedury podłączenia.

Moja rada: Zacznij od podstaw, bo twój kod to jedna wielka herezja.

0

Spodziewałem się tego typu odpowiedzi i dlatego napisałem że jestem początkujący, nie wiedziałem że to forum tylko dla zaawansowanych wszak w regulaminie nie jest o tym napisane.

1

Spodziewałem się tego typu odpowiedzi i dlatego napisałem że jestem początkujący, nie wiedziałem że to forum tylko dla zaawansowanych wszak w regulaminie nie jest o tym napisane.

  1. Masz forum newbie, tam się pyta o podstawy.
  2. Skoro nic nie umiesz to powiedziałem ci żebyś poczytał tutoriale, bo to że jesteś początkującym wcale nie zwalnia cię z wysiłku który musisz włożyć w naukę niektórych rzeczy (właściwie to zobowiązuje to poważniejszego traktowania rad dawanych przez doświadczonych użytkowników).

Ogarnij podstawy, potem zajmij się bardziej zaawansowanymi programami.

0

Do kodu "wkradł" się błąd, oczywiście linijki z "Button1.Click;" nie powinno być.

0

Pierwszy problem udało mi się rozwiązać, okazało się że winę ponosiła jedna linijka kodu.

New.Address := ('192.168.100.1'); należało zmienić na New.Host := ('192.168.100.1');

Problem drugi nadal pozostaje nierozwiązany i zapewne ponownie zaleje mnie fala krytyki ale nie zniechęca mnie to i nadal będę próbował rozwiązać problem, nawet gdybym miał spędzić nad tym całą noc.

0

i zapewne ponownie zaleje mnie fala krytyki

Jaka fala krytyki? Fala dobrych rad, żebyś nauczył się programować naprawdę.
Twój kod nie ma większego sensu, i domyślam się że w ogóle nie działa. Ale spoko, naprawiaj te 'błędy' zamiast posłuchać naszych rad i programować po ludzku.

0

Kod działa, chodziło o to aby resetować modem Thomson TCM 420 bez potrzeby uruchamiania przeglądarki, używa się tego modemu między innymi w kablówce Vectra i Petrus, zresztą jak ktoś ma internet w którejś z tych kablówek to może sobie sprawdzić. Nie rozumiem dlaczego sugerujesz iż kłamie odnośnie do tego kodu? Pisałbym posty w sprawie pomocy nad kodem który miałby nigdy nie zadziałać? jaki to ma sens? Napisałeś też abym zaczął od podstaw a ja uważam że to są podstawy bo przecież nie próbuję pisać gier, serwerów IRC czy aplikacji bazodanowych itd to tylko prosty "Resetter" którego jedynym zadaniem jest zresetowanie wyżej wymienionego modemu, poza tym tak naprawdę to dopiero moje pierwsze kroki w Delphi i w ogóle w programowaniu, nie jest powiedziane że się do tego nadaje, czas pokaże.

0

Nie rozumiem dlaczego sugerujesz iż kłamie odnośnie do tego kodu? Pisałbym posty w sprawie pomocy nad kodem który miałby nigdy nie zadziałać? jaki to ma sens?

Tobie się może wydawać że działa, albo ja się mylę co do jego aż tak strasznej niepoprawności, ale widząc ifa w buttonclicku widać że nic nie umiesz.

Napisałeś też abym zaczął od podstaw a ja uważam że to są podstawy bo przecież nie próbuję pisać gier, serwerów IRC czy aplikacji bazodanowych itd to tylko prosty "Resetter" którego jedynym zadaniem jest zresetowanie wyżej wymienionego modemu, poza tym tak naprawdę to dopiero moje pierwsze kroki w Delphi i w ogóle w programowaniu, nie jest powiedziane że się do tego nadaje, czas pokaże.

No jasne, to jest bardzo proste tylko że dla ciebie to i tak jest za trudne. Bazujesz się pewnie na jakimś gotowcu który lekko przerabiasz czy coś. Nie rozumiesz co kod znaczy, tylko usiłujesz go skopiować i zaadaptować nie rozumiejąc jego działania. Nie czytasz tutoriali o podstawach i o tym co robi co (może coś o tym wiesz, ale nie jest to wiedza wystarczająca do ogarnięcia kodu). Nie znasz biblioteki którą stosujesz (wiesz jak się nazywa?).
Programowanie to nie jest zabawa "może jak przestawię to tutaj to zacznie działać". Widać ty usiłujesz tak się bawić. Jeżeli nawet uda ci się ukończyć ten program to wreszcie dojdziesz do miejsca gdzie utkniesz ze względu na nieznajomość mechanizmów.
Nie wiem czy chcesz programować zawodowo/profesjonalnie, ale jeżeli tak to droga nie prowadzi przez przerabianie gotowców tylko skrupulatne czytanie tutoriali i pisanie kalkulatorów, notatników, paintów. Widać taki banalny 'resetter' który ma wysłać jeden request HTTP jest dla ciebie trudny w takim stopniu ze błądzisz po forach.

Poziom twojej programistycznej wiedzy prezentuje ten kod:

New.Active :=True;
IF New.Active = True then

Moja rada: daruj sobie przepisywanie gotowców i napisz coś samemu. Wiem że newbi oczekuje że będzie zaraz OS pisać ale niestety, to tak się nie prezentuje.

1

Bazujesz się pewnie na jakimś gotowcu który lekko przerabiasz czy coś. Nie rozumiesz co kod znaczy, tylko usiłujesz go skopiować i zaadaptować nie rozumiejąc jego działania. Nie czytasz tutoriali o podstawach i o tym co robi co (może coś o tym wiesz, ale nie jest to wiedza wystarczająca do ogarnięcia kodu). Nie znasz biblioteki którą stosujesz (wiesz jak się nazywa?).
Programowanie to nie jest zabawa "może jak przestawię to tutaj to zacznie działać". Widać ty usiłujesz tak się bawić. Jeżeli nawet uda ci się ukończyć ten program to wreszcie dojdziesz do miejsca gdzie utkniesz ze względu na nieznajomość mechanizmów

Masz rację posłużyłem się snifferem aby zobaczyć co musi zostać wysłane aby zresetować modem, zajrzałem też w źródło strony modemu, skorzystałem tez z Delphi 7 a nie jestem jego autorem, skorzystałem z komputera którego podzespoły nie zostały wyprodukowane przeze mnie, baa mało tego użyłem energii elektrycznej której nie wytworzyłem. Mógłbym tak wymieniać w nieskończoność jak patron programistów o nicku -123 treści wiele ale nic na temat, przeczytałem kilka postów które napisałeś ale nic zupełnie z nich nie wynika, próbujesz się kreować na wielkiego programistę pomimo że tak naprawdę nie umieściłeś ani linijki własnego kodu (pewnie z obawy przed krytyką tych którzy naprawdę potrafią programować) podkreślasz że "kodzisz" od 5 lat po to aby następnie poradzić jednemu z użytkowników

No jasne, możesz napisać skomplikowany system snapshotowania pamięci albo...
UŻYĆ PLIKÓW?!
innemu użytkownikowi napisałeś
Ja podpowiem: Wywalając kontrolkę.

Jestem pod wrażeniem ogromu twojej wiedzy z zakresu programowania :) W końcu programujesz od 5 lat także wiesz co piszesz. Problem jest taki ze owszem sporo piszesz ale to wszystko jest takie hmm "jałowe" w dodatku zazwyczaj ma z tematem tyle wspólnego co Hitler z pokojową nagrodą nobla. Podsumowując Twoje wnioski są warte tyle co przemyślenia schizofrenika który na domiar złego zapomniał o lekach. W sumie nie powinienem się dziwić zawsze znajdzie się ktoś kto będzie chciał za wszelką cenę zdyskredytować zupełnie nieznane sobie osoby tylko po to aby samemu "zaplusować" w oczach innych, pewnie ktoś to kupi i uzna cie za naprawdę świetnego programistę szkoda że jesteś tylko programistą-teoretykiem. Mi można wiele zarzucić jak np brak brak odpowiedniej wiedzy i doświadczenia do tego aby napisać jakąś wartościową aplikację z tym że ja się do tego przyznaje i zdaje sobie sprawę ze swoich wad, po prostu mam dystans do samego siebie czego tobie zabrakło. Powtórzę to co napisałem wcześniej dla mnie to jak na razie ZABAWA i nie spinam się tak jak ty a jedynie próbuję znaleźć odpowiedź na nurtujące mnie pytania a ten post to tylko REAKCJA na twoją AKCJE. Na szczęście są na tym forum naprawdę dobrzy programiści i nie omieszkali pomóc wysyłając PW :)

Jeszcze małe sprostowanie. Nie jestem autorem funkcji "Hex" której użyłem w kodzie, pozostała część kodu jest moja, użyłem ClientSocket zamiast np IdHTTP z prostych powodów.

  1. ClientSocket w zupełności do tego wystarczy
    2.To moje pierwsze kroki w Delphi więc na idHTTP przyjdzie jeszcze czas o ile nie zabraknie zapału, umiejętności, motywacji itd.

Pewnie wiele osób dziwi się że użyłem kilka razy słowa "zabawa" traktuję to jako zabawę ponieważ nie zajmuje się programowaniem zawodowo, nie miałem z nim styczności w szkole i jest dla mnie hobby. Może w przyszłości osiągnę poziom odpowiedni do tego aby nazwać się programistą (jeżeli nie to trudno) ale jak na razie jest jak jest. "Nie od razu Rzym zbudowano" lub jak kto woli "Nie od razu Kraków zbudowano" (wersja lokalna)
Na tym kończę i pozdrawiam wszystkich którzy pomogli za pomocą PW.

0

Mógłbym tak wymieniać w nieskończoność jak patron programistów o nicku -123 treści wiele ale nic na temat, przeczytałem kilka postów które napisałeś ale nic zupełnie z nich nie wynika, próbujesz się kreować na wielkiego programistę pomimo że tak naprawdę nie umieściłeś ani linijki własnego kodu

No ba, powinienem za was pisać kod, podstawa. Gotowców nie daję, dlatego rzadko daję jakikolwiek kod.

(pewnie z obawy przed krytyką tych którzy naprawdę potrafią programować) podkreślasz że "kodzisz" od 5 lat

Czyli stwierdzasz że nie umiem programować tylko dlatego bo nie rzucam tu i tam gotowcami. Może powinienem tutaj wrzucić np. moją klasę do obsługi plików EXE? Albo mój szyfrator relokacji? Wtedy może byś uwierzył że coś umiem, tylko po co mi to? Mojej wiedzy programistycznej nie muszę wam udowadniać. I to że jakiemuś początkującemu wydaje się że nic nie umiem bo nie postuję własnego kodu co 3 post, naprawdę mnie nie interesuje...

po to aby następnie poradzić jednemu z użytkowników

Jakie pytanie taka odpowiedź, chciałbym żeby pojawiało się więcej pytań godnych porządnej odpowiedzi. Niestety, prawie wszystkie wątki proszą się o odpowiedź 'szukaj w google' albo 'ogarnij podstawy' ewentualnie 'ogarnij debugger'.

Problem jest taki ze owszem sporo piszesz ale to wszystko jest takie hmm "jałowe" w dodatku zazwyczaj ma z tematem tyle wspólnego co Hitler z pokojową nagrodą nobla.

O bardzo ciekawe jaki to offtopic umieszam. Jałowe? No tak, bo większość pytań również jest jałowa.

W sumie nie powinienem się dziwić zawsze znajdzie się ktoś kto będzie chciał za wszelką cenę zdyskredytować zupełnie nieznane sobie osoby tylko po to aby samemu "zaplusować" w oczach innych, pewnie ktoś to kupi i uzna cie za naprawdę świetnego programistę szkoda że jesteś tylko programistą-teoretykiem.

I znowu, stwierdzasz że nie umiem programować tylko i wyłącznie dlatego że nie rzucam tu i tam kodem. Żeby rozwiązać problem, rzadko kiedy należy podać kod (no chyba że ktoś oczekuje gotowca ale w takich sprawach nie pomagam). Nie pokazuję jaki to jestem dobry, żeby siebie wypromować tylko po to żeby zademonstrować do czego się dochodzi jak się szuka samemu odpowiedzi na pytania. Wszystko w googlach jest, nawet na moim poziomie (który już chyba pod podstawy nie podchodzi). Większość pytających po prostu nie wie nic i usiłuje zrobić coś, więc mówię im żeby najpierw nauczyli się podstaw, bo tak się robi. Ja tak zrobiłem, i uważam że wyszedłem na tym dobrze.

. Mi można wiele zarzucić jak np brak brak odpowiedniej wiedzy i doświadczenia do tego aby napisać jakąś wartościową aplikację z tym że ja się do tego przyznaje i zdaje sobie sprawę ze swoich wad, po prostu mam dystans do samego siebie czego tobie zabrakło.

Ale czy my mówimy o mnie czy o tobie? Bo mi się wydaję że bardziej o tobie. Wiem że również najlepszy nie jestem, są osoby których umiejętności są lepsze od moich. Tylko jakie to ma znaczenie? Moja wiedza w porównaniu z twoją jest zdecydowanie większa więc uważam że powinieneś z niej skorzystać. I tak wiem, że mam to do siebie że się chwalę, cóż, ideałem nie jestem. Tylko że za przechwałkami kryje się jednak wiedza, której co prawda nie używam na tym forum, bo to forum zazwyczaj ma banalne pytania.

Na szczęście są na tym forum naprawdę dobrzy programiści i nie omieszkali pomóc wysyłając PW :)

Zgaduję że dobrzy bo wysłali gotowca.

Jeszcze małe sprostowanie. Nie jestem autorem funkcji "Hex" której użyłem w kodzie, pozostała część kodu jest moja, użyłem ClientSocket zamiast np IdHTTP z prostych powodów.

Kolejny gotowiec, tylko że mogłeś napisać po prostu (Uwaga uwaga gotowiec!): chr($0A).

Może w przyszłości osiągnę poziom odpowiedni do tego aby nazwać się programistą (jeżeli nie to trudno) ale jak na razie jest jak jest. "Nie od razu Rzym zbudowano" lub jak kto woli "Nie od razu Kraków zbudowano" (wersja lokalna)

Oczywiście mam nadzieję że 'wyrośniesz' na uświadomionego programistę, który rozumie działanie kodu a nie zasady wklejania gotowców.

I pozdrawiam Ciebie mimo iż ty nie byłeś łaskawy tego zrobić dla mnie mimo moich chęci że nauczysz się rozwiązywać problemy (chociażby czytając o podstawach) a nie wklejać gotowce.

0

Jakie pytanie taka odpowiedź, chciałbym żeby pojawiało się więcej pytań godnych porządnej odpowiedzi. Niestety, prawie wszystkie wątki proszą się o odpowiedź 'szukaj w google' albo 'ogarnij podstawy' ewentualnie 'ogarnij debugger'.
Pamiętaj o tym że w 95% przypadków masz do czynienia z osobami dla których programowanie to tzw "czarna magia" z racji tego że nie mieli z nim do czynienia wcześniej, poza tym nie każdy potrafi napisać z czym ma dokładnie problem, czasami owszem pytania pewnie są banalne, banalne dla Was dla początkujących każdy taki banalny problem stanowi nie lada problem a więc może zamiast się wyśmiewać napisz bardziej konkretnie zamiast ogólników typu "zacznij od podstaw" dla każdego owe podstawy mogą oznaczać coś zupełnie innego, gdybym ja był doświadczonym programistą to napisałbym od czego zaczynałem. Proponowanie ogarnięcia debuggera początkującemu "programiście" tez nie jest zbyt fair.

Moja wiedza w porównaniu z twoją jest zdecydowanie większa
Dziwne gdyby tak nie było bo przecież jak sam stwierdziłeś w jednym z postów programujesz od 5 lat, pytanie brzmi dlaczego porównujesz swoja wiedzę z wiedzą kogoś kto dopiero zaczyna i jest kompletnym laikiem? Nie wiem czy w ten sposób próbujesz się dowartościować, być może jest to po prostu kwestia polskiej mentalności.
Zgaduję że dobrzy bo wysłali gotowca.
Nikt mi nie wysłał ani jednej linijki kodu, po prostu zostałem że tak to ujmę "naprowadzony" w sensie ktoś mi napisał czego powinienem unikać w pisaniu kodu i jak rozwiązywać ewentualne problemy, problemy których nie mają programiści (póki co się do nich nie zaliczam)
mogłeś napisać po prostu (Uwaga uwaga gotowiec!)
Owszem funkcja "Hex" nie jest mojego autorstwa o czym wspomniałem w poprzednim poście, jeżeli natomiast gotowcem nazywasz użycie winsock to chyba jednak drobna przesada. Co do pozdrowień to nie podziękuję ponieważ nie są szczere i przy pierwszej okazji będziesz próbował wbić mi przysłowiowy nóż w plecy. Odpowiem na jedno z Twoich pytań (zapomniałem o tym wcześniej) Nie, nie zamierzam nigdy zająć się zawodowo programowaniem i traktuje próby programowania tylko i wyłącznie jako hobby bo to jednak bardzo ciekawe (moje skromne zdanie) Na koniec zadam pytanie i prosiłbym tym razem o odpowiedź pozbawioną złośliwości i jadu. Chcesz mnie z niewiadomych przyczyn zniechęcić i za wszelką cenę próbujesz dać mi do zrozumienia abym zaniechał pisania czegokolwiek czy uważasz że przy odpowiedniej motywacji, determinacji jak i wielu miesiącach spędzonych na nauce byłbym napisać jakąś w miarę wartościową aplikację której kod jak to określiłeś nie byłby herezją?

0

@nowiceusz: nie zrażaj się @-123 jak już wspominałem Tobie w odpowiedzi na u1, gdzie uzyskałeś odpowiedź. Jednak zrozum nas też. Ja lubię pomagać i czasem później dostaje mi się za podsyłanie gotowców lub zbytnich ułatwien mimo że miałem to zaniechać. Sorry, ale jak widac jestem niekonsekwentny. Ale musisz nas też @nowiceusz zrozumieć. W dziale nie przeznaczonym do podstaw dostajemy n-ty pytanie o banalne podstawy i widać, że wprawdzie coś tam sam kombinowałeś, ale mało skutecznie. Wygooglował byś chociaż http://piechnat.pl/index.php/files/highlight/tools/simpletcp/Client.dpr albo jakieś RFC to byś dowiedział się jak z opowiedzi na u1, że nagłowek HTTP powinien być zakończony pustą linią i znakiem CRLF. Widzisz, niektórzy takie posty, które irytują @-123 po prostu ignorują, a inni się właśnie irytują. I nie chce tutaj nikogo bronić, ale z kolejnymi dniami pobytu na tym forum często się im nie dziwie. A prośba czy sugestia mniej lub bardziej dosadna w stylu ogarnj podstawy oznacza że przed napisaniem jakiegokolwiek programu przydało by się poczytac jakiś kurs. Bo nie znając żadnego języka pogramowania w podstawowym stopniu i branie się za kodzenie czegokolwiek niestety skutkuje bładzeniem po omacku. Najważniejsze, że i tak sobie poradziłeś.

0

Oczywiście rozumiem Waszą irytację i zdaję sobie sprawę że wbrew pozorom nie jest łatwym zadaniem pomóc komuś kto dopiero zaczyna jeżeli samemu jest się doświadczonym programistą chociażby dlatego że nie każdy potrafi sprecyzować o co tak naprawdę mu chodzi, znajomy ma szkołę jazdy i też często trafiają mu się kursanci którzy od razu najchętniej wystartowaliby w rajdzie Paris-Dakar, tutaj jest podobnie. Ja nie oczekuję tego aby ktoś za mnie pisał kod lub poprawiał istniejący i naprawdę nie bawi mnie pisanie aplikacji z "klocków" (przerabianie cudzego kodu) moim celem nie są tez kłótnie z forumowiczami tutaj piszącymi niezależnie od tego czy są doświadczeni czy początkujący, na jakiś zaniecham zadawania jakichkolwiek pytań i nieco więcej poczytam na temat Delphi, dokumentacji protokołów RFC które mogą okazać się dla mnie przydatne w przyszłości itd.

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