CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB] Sockety - asynchroniczny odbiór

[BCB] Sockety - asynchroniczny odbiór

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

[BCB] Sockety - asynchroniczny odbiór

Nowy postprzez Jawor » piątek, 25 marca 2011, 16:55

Witam,

Piszę coś w rodzaju komunikatora w oparciu o środowisko Borland C++ Builder 6.
Do komunikacji wykorzystuję WinSock2 (niestety wymagania projektu nie zezwalają na użycie wbudowanych kontrolek BCB do obsługi socketów).

Do rzeczy... Mam problem z klientem, a dokładniej z asynchronicznym odbiorem wiadomości.

Zaplanowałem sobie to tak:
- aplikacja ma dwie "formy"
- pierwsza forma (główna) łączy z serwerem (to działa ok) i wywołuje asynchroniczne odbieranie wiadomości (po kliknięciu w button)
- uchwytem do odbioru tych wiadomości jest forma druga
Nie mogę sobie tylko poradzić z odczytem wiadomości wysyłanej do tego drugiego okienka.

Unit1
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND okno = Form2->Handle; // uchwyt do drugiego okna ktore ma odbierac wiadomosci
 
    // kod laczenia z serwerem
    // pomijam go bo tu wszystko działa poprawnie
 
    // po wywołaniu connect() następuje
    WSAAsyncSelect(ConnectSocket,okno,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);
}
 


Forma druga, odbierająca wiadomości - unit2 (uchwyt okno)
KOD cpp:     UKRYJ  
 
// funkcja wirtualna łapiąca wiadomości
void __fastcall TForm2::WndProc(TMessage &Message)
{
 
        switch(Message.Msg)
        {
                case WM_USER:
                        Form2->Label1->Caption="zlapana";
                break;
        }
 
        TForm::WndProc(Message);
 
}
 
// konstruktor
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
 
    Form2->Label1->Caption="start";
 
    // właściwie tutaj nie wiem czy coś trzeba dawać
    // próbowałem poniższe konstrukcje lecz bezskutecznie :/
 
    //MSG Msg;
 
    //GetMessage(&Msg, this, WM_USER, WM_USER+4);
 
    //TranslateMessage(&Msg);
    //DispatchMessage(&Msg);
 
}
 


Jak normalnie uruchamiam program to po kliknięciu buttona zawieszają się obie formy.

Przy debbugowaniu linia po lini:
1. wywoływany jest konstruktor Form1
2. wywoływany jest konstruktor Form2, ale nie wywołuje kodu znajdującego się w nim tylko przechodzi do punktu 3.
3. kilkanaście lub nawet kilkadziesiąt razy wywoływana jest funkcja Form2::WndCmd - ani razu nie jest spełniony case WM_USER
4. pojawiają się okna (na przemiennie z wywoływaniem WndCmd)
5. klikam przycisk z Form1
6. łączy się z serwerem
7. wysyła "powitalną" wiadomość
8. wywołuje: WSAAsyncSelect()
9. przechodzi do WndCmd i tym razem spełniany jest case WM_USER
10. teraz nie ma już kontroli nad formami

Byłbym wdzięczny za jakiekolwiek naprowadzenie mnie na rozwiązanie tego problemu.
Avatar użytkownika
Jawor
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): piątek, 25 marca 2011, 16:46
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: brak kompilatora
Gadu Gadu: 0
    Windows 7Opera

Re: [BCB] Sockety - asynchroniczny odbiór

Nowy postprzez polymorphism » piątek, 25 marca 2011, 19:34

Drobna uwaga.
KOD cpp:     UKRYJ  
(...)

switch(Message.Msg)
{
case WM_USER:
        Form2->Label1->Caption = "zlapana";
        return; //<---
}

Jeśli obsłużyłeś komunikat, nie wysyłaj go do domyślnej obsługi okna (no chyba, że wiesz co robisz).

____
P.S. dlaczego tryb asynchroniczny?
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: [BCB] Sockety - asynchroniczny odbiór

Nowy postprzez Jawor » piątek, 25 marca 2011, 21:03

Ok, dziękuję bardzo. Teraz okno się nie zacina i wygląda, że działa ok :)
Jutro przetestuję dokładnie.

Tryb asynchroniczny z tego powodu, że nie miałem pomysłu jak odbierać wiadomości w blokującym.
Jedyne rozwiązanie, które znalazłem to takie, żeby puścić recv w while(1), tyle że taka pętla mi zawiesza "formę" (nawet jak puściłem na osobnym wątku).

Tryb blokujący wykorzystuję na serwerze, który jest "konsolowy", a tam nie mam problemu z while(1).
Avatar użytkownika
Jawor
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): piątek, 25 marca 2011, 16:46
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: brak kompilatora
Gadu Gadu: 0
    Windows 7Opera

Re: [BCB] Sockety - asynchroniczny odbiór

Nowy postprzez polymorphism » piątek, 25 marca 2011, 21:25

Zawsze możesz użyć wątków. Tryb asynchroniczny pod paroma względami może być niewygodny w użyciu. No ale to Ty piszesz, więc rób jak uważasz.
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 2 gości