[BCB] Przesyłanie struktur przez TClientSocket

0

Witam,

Mam pewien problem, myślałem, że poradze sobie sam ale nie daje rady. Chodzi o to że stworzyłem sobie 2 strukturki

struct SWyslij
{
int Ile;
String Msg;
}Wyslij;

struct SOdbierz
{
int Ile;
String Msg;
}Odbierz;

No i na formie ustawiłem TClientSocket i TServerSocket chodzi mi o to żeby gdy na dwóch kompach są jest uruchomiony program żeby można było przesyłać te strukturki...

robie to za pomocą SendBuf(&Wyslij,sizeof(Wyslij));
no a odbieram za pomocą ReceiveBuf(&Odbierz,sizeof(Odbierz));

i problem jest w tym że gdy wypełnie strukture Wyslij danymi to po przesłaniu zmienna Ile jest taka jak powinna a zmienna Msg sie nie chce przesłać...przechodzą tylko jakieś krzaczki :/

Nie wiem czy wszystko wyjaśniłem dokladnie... ale może ktoś zna rozwiązanie tego problemu?

0

poniewaz String w C++ builder to nic innego jak synonim dla typu Ansistring a to jest klasa i przesylajac to w ten sposobv przesylasz obiekt AnsiString ale nie to co zawiera bo zawartosc jest dynamiczna i dostepna tylko za jego posrednictwem dlatego tez musisz ustalic rozmiar tekstu jaki przesylasz w strukturze:

dlatego zamiast

 String msg;

zastosuj np char Msg[256];

 albo o wiekszym rozmiarze w zaleznosci z ilu znakow Msg maksymalnie bedzie sie skladac to juz lezy w Twoich rekach
0

Dzięki :) To działa...niby takie proste a na to nie wpadłem [sciana]

Ale pojawił mi się inny problem :/ Chodzi o wysyłanie tekstu za pomocą SendText... bo gdy wysyłam tekst (np: "Hello") z bardzo dużą częstotliwością to nieraz przy odbieraniu jest tak że zamiast odbierać po kolei "Hello", "hello" itd to nieraz je łączy razem, wygląda to tak jak by nie nadąrzał wysyłać :D I tutaj jest moje pytanie jak zrobić żeby program czekał aż przesyłka zostanie wysłana i dopiero wtedy wysyłać następną?

0

Dla polaczen nieblokujaych czyli tych w Twoim wypadku odbywa sie to za posrednictwem zdarzenia OnRead dzieki niemu klient-serwer jest poinformowany ze czekaja na niego dane do odczytania po odczytania ta zasade mozesz wykorzystac i wysylac kolejny tekst dopiero wtedy gdy w zdarzeniu Onread odczytasz np inny tekst "ODEBRANE" wyslane przez serwer:
czyli:

  1. Krok wysylasz "tekst"
  2. Serwer otrzymuje tekstw zdarzeniu OnRead i wysyla potwierdzenie "ODEBRANE"
  3. klient odbiera tekst w zdarzeniun OnRead i sprawdza czy to jest tekst "ODEBRANE" jesli tak patrz punkt 1 i tak w kolko az do jakiegos warunku np w OnRead dasz sobie jakas zmienna ktora bedzie inkrementowana przy kazdym wywolaniu z tekstem "ODEBRANE" i dzieki temu Twoja aplikacja bedzie wiedziala kiedy przestac

Innym sposobem jest utworzenie polaczenia blokujacego tylko wtedy wysylanie musisz najlepij umiescic w nowym watku poniewaz kazde wywolanie SendText lub innej metody wysylajacej bedzie powodowalo czekanie programu do momentu az serwer nie odbierze danych dlatego umieszczenie wysylania w osobnym watku bedzie dobrym rozwiazaniem bo nie bedziesz tym samym blokowal calej aplikacji gdy bedziesz chcial cos wyslac

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