CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez mckri » poniedziałek, 13 lutego 2012, 23:53

Witam.
Mam problem z komunikacją pomiędzy ClientSocket oraz ServerSocket. Obie aplikacje widzą się poprawnie.
Problem jest w tym, że przy przesyłaniu wiadomości tekstowych widać po obu stronach (w zalezności która przesłała) tzw. 'krzaki'. Oba programy napisane są w Builder 2009. W starym Builderze 5/6 tego problemu nie było, jednak tam domyslnym typem zmiennych był AnsiString. Domyslam się, że w nowym środowisku chodzi o typ zmiennych (wide?/ansi?/char?), jednak tutaj wypróbowałem chyba juz wszystkie kombinacje a i tak pojawiają się te 'krzaki'.

Po stronie serwera:
-odebranie danych od klienta
Kod: Zaznacz cały
Memo1->Lines->Add(Socket->ReceiveText().Trim());

-wysłanie danych do klienta
Kod: Zaznacz cały
for(int x = 0; x < ServerSocket1->Socket->ActiveConnections; x++)
  {
     ServerSocket1->Socket->Connections[x]->SendText(Memo2->Text.Trim());
  }


Po stronie klienta:
-odebranie danych z serwera:
Kod: Zaznacz cały
Memo1->Lines->Add(Socket->ReceiveText().Trim());


-wysłanie danych do serwera:
Kod: Zaznacz cały
ClientSocket1->Socket->SendText(Memo2->Text.Trim());


Wie ktoś jak poprawnie przesyłac tekst przy wykorzystaniu tych komponentów w środowisku Builder 2009/2010?

PS. komponenty client/server socket można zainstalować na podstawie tej instrukcji http://support.codegear.com/article/36470

Widok krzaków w obu aplikachach:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez Cyfrowy Baron » wtorek, 14 lutego 2012, 15:54

Spróbuj tak:

KOD cpp:     UKRYJ  
for(int x = 0; x < ServerSocket1->Socket->ActiveConnections; x++)
  {
   ServerSocket1->Socket->Connections[x]->SendText( AnsiString( Memo2->Text ).Trim() );
  }


lub ze zmienną typu AnsiString:


KOD cpp:     UKRYJ  
for(int x = 0; x < ServerSocket1->Socket->ActiveConnections; x++)
  {
   AnsiString sendText = Memo2->Text;
   ServerSocket1->Socket->Connections[x]->SendText( sendText.Trim() );
  }


Podobnie postąp z klientem. Sockety nie obsługują typu UnicodeString, a klasa TMemo w C++Builder 9 i wyższym operuje właśnie na UnicodeString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez mckri » wtorek, 14 lutego 2012, 23:59

Próbowałem już w ten sposób. 'Krzaki' nadal wystepują, tyle ża są innej postaci - zamiast 'chińszczyzny' są znaki '?'.
Jakby co, przesyłam kod źródłowy do wglądu.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez polymorphism » środa, 15 lutego 2012, 10:40

Według dokumentacji SendText powinien być wywoływany ze zdarzeń OnWrite, OnClientWrite lub OnSocketEvent. Ty wysyłasz tekst "z buttona", i jeśli sockety działają w trybie asynchronicznym, może być tak, że to wywołanie nie wysyła nic lub tylko fragment tekstu. Sprawdź jaką wartość zwraca SendText.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez Cyfrowy Baron » środa, 15 lutego 2012, 18:16

polymorphism napisał(a):Według dokumentacji SendText powinien być wywoływany ze zdarzeń OnWrite, OnClientWrite lub OnSocketEvent.


Swego czasu w środowisku C++Builder 4 używałem socketów i wysyłałem tekst z buttona, i nie było z tym żadnego problemu.

Sprawdź czy ten kod też wywołuje błąd:

KOD cpp:     UKRYJ  
for(int x = 0; x < ServerSocket1->Socket->ActiveConnections; x++)
{
   AnsiString sendText = "Przykładowy tekst";
   ServerSocket1->Socket->Connections[x]->SendText( sendText.Trim() );
}


W tym kodzie nie ma zmiennej UnicodeString, więc teoretycznie nie powinno być żadnego problemu. Jeżeli problem występuje, to oznacz niezgodność Socket'ów ze środowiskiem. Do są już dość przestarzałe biblioteki i w nowszych wersjach środowiska dostępne są nowsze odpowiedniki.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez mckri » środa, 15 lutego 2012, 22:46

Przyszło mi rozwiązać problem samemu...
Odbiór wiadomości:
KOD cpp:     UKRYJ  
int iBufSize = Socket->ReceiveLength();
   char *Buf = new char [iBufSize + 1];
   Socket->ReceiveBuf(Buf,iBufSize);
   Msg=Buf;
   Memo1->Lines->Add(Msg.Trim());
 

Wysyłanie wiadomości:
KOD cpp:     UKRYJ  
AnsiString Msg = Memo2->Text.Trim();
          ServerSocket1->Socket->Connections[x]->SendBuf(Msg.c_str(), Msg.Length());
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez polymorphism » środa, 15 lutego 2012, 23:29

Pamięć Buf zwalniasz?

I jeszcze taka mała poprawka:
KOD cpp:     UKRYJ  
...
int cb = Socket->ReceiveBuf(Buf, iBufSize);
if(cb > 0)
{
    buf[cb] = 0;
    Msg = Buf;
    ...
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
mckri
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez mckri » czwartek, 16 lutego 2012, 01:00

No właśnie czegoś mi brakowało :)
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: 'Krzaki' w komunikacji tekstowej ClientSocket - ServerSocket

Nowy postprzez polymorphism » czwartek, 16 lutego 2012, 10:44

Tu masz wersję racjonalniejszą, bez alokacji na stercie:
KOD cpp:     UKRYJ  
int toRead = Socket->ReceiveLength();
char Buf[1024];
int cb;

while(toRead > 0 && (cb = Socket->ReceiveBuf(Buf, min(toRead, sizeof(Buf)))) > 0)
{
        Buf[cb] = 0;
        Msg += Buf;
        toRead -= cb;
}

Memo1->Lines->Add(Msg.Trim());
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość