Klient POP3 - Dzwiny wynik porownania AnsiString

0

Witam!
Mam następujący fragment kodu:

...

    POP3Socket->Socket->SendText("USER "+frm_options->edt_pop3_login->Text+"\r\n");
    POP3Socket->Socket->SendText("PASS "+frm_options->edt_pop3_haslo->Text+"\r\n");

    if (POP3Socket->Socket->ReceiveText().SubString(1,3) == "+OK")
    {
      sb_statusBar->SimpleText = "Logowanie poprawne.";
      return 0;
    }
    else
    {
      sb_statusBar->SimpleText = "Logowanie nie powiodlo sie!";
      return -1;
    }

...

Problem polega na tym iż porównanie:

POP3Socket->Socket->ReceiveText().SubString(1,3) == "+OK"

Zawsze zwraca false ;/ Znając życie robię jakiś głupi błąd lub po prostu nie znam zasad funkcjonowania POP3 ;-)

Gdy sprawdzam w Debugerze to oba stringi są równe, jednak mimo tego wykonywana jest sekcja else.

0

a jesteś pewny, że ta linijka ma wyglądać tak:

 if (POP3Socket->Socket->ReceiveText().SubString(1,3) 

a nie tak:

if (POP3Socket->Socket->ReceiveText().SubString(0,3) 

Najprościej podstaw sobie to co zwraca SubString(1,3) pod zmienną znakową i sprawdź co się tam rzeczywiście znajduje.

0

Już próbowałem tak robić i niestety bez skutku. Sprawdzałem właśnie w debugerze wartość zmiennej do której to podstawiłem i wyszło że w środku jest "+OK" :-/ Dziwna sprawa.

0

rozumiem, że funkcja ReceiveText() zwraca AnsiStringa (cokolwiek to jest)
może po prostu operator== jest niepoprawny dla takiej operacji ?
albo może AnsiString posiada funkcję c_str(), która zwraca wskaźnik do const chara i wtedy można te dwie rzeczy porównać ?

0

A czy ty powinieneś w ogóle tak to robić?
Nie! Popatrz do helpa na temat AnsiString i użyj czegoś lepszego do analizy zawartości.
Zamiast subString użyj find/search lub coś w podobny deseń.

0

Wiem już na czym polega błąd - tak jak podejrzewałem nie na samym porównaniu ale na nieznajomości socketów ;-)

Jak dałem sleepa na 1s. przed wykonaniem if-a to zadziałało poprawnie. Po prostu w momencie porównania wartość zwracana funkcji ReceiveText() była jeszcze pusta - a w trybie debugera widziałem już wartość poprawną.

@up -> Zgadza się - funkja ReceiveText() zwraca AnsiString i AnsiString posiada c_str(), którego już próbowałem użyć.

Dzięki za poświęcony czas!

EDIT:

MarekR22 napisał(a)

A czy ty powinieneś w ogóle tak to robić?

Skoro typ AnsiString oferuje mi wyciągnięcie z siebie podciągu to dlaczego mam z tego nie korzystać? Co w tym złego?

1
  1. Soket pewnie zgłasza event po odebraniu danych, użyj tego zamiast sleep
  2. wyciąganie podstringu jest kosztowne, bo tworzysz nowy obiekt tymczasowy. Odnalezienie poszukiwanego ciągu w odebranych danych będzie o wiele bardziej eleganckie i uniwersalne (nie wiem jaką masz specyfikację przesyłania danych).
  3. unikaj "magic numbers".
0

Dzięki MarekR22 -> teraz o wiele jaśniej napisałeś i już rozumiem Twoje argumenty [browar] na pewno postaram się zastosować do praktycznych uwag :-)

Co do tego sleepa to w ten sposób odkryłem gdzie jest błąd - oczywiście nie zamierzam używać go w tej aplikacji. Zrobię tak już o tym napisałeś - umieszczę w OnRead switcha sterującego. Myślisz że to dobre rozwiązanie?
Mam na myśli zdefiniowanie kilku stałych określających na jakim etapie wykonania jest program i przy każdym OnRead switchem sterować gdzie przekierować program. Dobrze kombinuję?

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