Skocz do zawartości

komunikat odbioru polaczenia??


H4X0R

Recommended Posts

nie wiem czy mnie dobrze zrozumiecie ale chodzi o to ze mam taki program internetowy ktory przesyla z jednego richedita do drugiego(klient - server)
wlasciwie wszystko jest dobrze tylko nie moge znalesc komunikatu ktory jest wysylany kiedy wiadomosc dochodzi do klienta. bo jak umieszcze to w wm_timer to co jakis czas bedzie sprawdzal czy jest jakas wiadomosc a ja bym chcial wiedziec od razu bez przeciazania programu??

Juz wlasciwie wiem jak nalezy to zrobic ale ciagle nie dziala probowalem uzyc
wsaasyncselect ale to nie dziala tzn wykonuje ta funkcje tworze w niej komunikat WM_USER + 1 i FD_READ ale gdy z servera wysylam wiadomosc funkcja send client w petli komunikatow wogole nie przechodzi do WM_USER + 1 nie mam pojecia czemu jesli ktos moze niech mi to wytlumaczy lub napisze kawalek kodu...

Link do komentarza
Udostępnij na innych stronach

Wydaje mi się że musiałeś gdzieś zrobić jakiś błąd. Szkoda że nie dałeś fragmentu kodu. Jak masz już socketa w trybie asynchronicznym czyli:

WSAAsyncSelect(socket,uchwyt,WM_USER,FD_CONNECT|FD_READ|FD_WRITE);

Parametry:
1- nasz socket
2- uchwyt okna programu
3- komunikat wewnątrz którego chcesz odbierać informacje od socketa (w tym wypadku WM_USER ale może być dowolny)
4- flagi mówiące o jakich zdarzeniach chcemy być informowani

To dalej dajesz:


case WM_USER:

   switch(WSAGETSELECTEVENT(lParam))
   {
      //coś przyszło
      case FD_READ:
      //tu odbierasz to co przyszło
      break;

      //łączenie z serwerem
      case FD_CONNECT:
      //Tu próba łączenia z serwerem
      break;
   }
break;

I powinno działać. Oczywiście przykład ten dotyczy klienta. W serwerze zamiast FD_CONNECT (do łączenia) musisz obsłużyć FD_ACCEPT (do akceptowania połączenia).

Jeżeli to nie działa to zapodaj kod źródłowy (fragmenty), to coś się pomyśli bo tak bez kodu to troche trudno coś doradzić.

Link do komentarza
Udostępnij na innych stronach

Niestety nie dziala wiec zostaja fragmenty najpierv czesci SERVERA

//...
// petla komunikatow bo pewnie tu jest blad
//
LRESULT CALLBACK MainWndProc(HWND hwnd,
                                                         UINT message,
                                                         WPARAM wParam,
                                                         LPARAM lParam)
{
        switch(message)
        {
        case WM_USER:
                switch(WSAGETSELECTEVENT(lParam)) 
                {
                case FD_WRITE:
                        send(m_socket, buf, 1024, 0);
                        break;
                case FD_ACCEPT:
                        MessageBox(NULL, "UDALO SIE", "INF", NULL);
                        break;
                case FD_READ:
                        break;
                }
                break;
        case WM_CREATE:
                //...
                break;
        case WM_COMMAND:
                hwnd = (HWND)lParam;
                if((hwnd == hwndWys) && (HIWORD(wParam) == BN_CLICKED))
                {
                        send(m_socket, buf, 1024, 0);
                }
                // tworzenie socketa i nawiazywanie polaczenia
                if((hwnd == hwndButton) && (HIWORD(wParam) == BN_CLICKED))
                {
                        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
                        if ( iResult != NO_ERROR )
                        {
                                MessageBox(NULL, "ERROR", "ERROR", NULL);
                        }
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

                        if ( m_socket == INVALID_SOCKET )
                        {
             MessageBox(NULL, "ERROR", "ERROR", NULL);
             WSACleanup();
                        }

                        sockaddr_in service;

            service.sin_family = AF_INET;
            service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
            service.sin_port = htons( 27015 );

                        if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) 
                        {
             MessageBox(NULL, "ERROR", "ERROR", NULL);
             closesocket(m_socket);
                        }

                        if ( listen( m_socket, 1 ) == SOCKET_ERROR )
               MessageBox(NULL, "ERROR", "ERROR", NULL);

                        MessageBox(NULL, "CZEKANIE NA POLACZENIE", "ERROR", NULL);

      while (1)  
          {
      AcceptSocket = SOCKET_ERROR;
      while ( AcceptSocket == SOCKET_ERROR ) {
          AcceptSocket = accept( m_socket, NULL, NULL );
      }
      MessageBox(NULL, "POLACZONO", "ERROR", NULL);
      m_socket = AcceptSocket; 
      break;
      }

                }

WSAAsyncSelect(m_socket, hwnd, WM_USER, FD_ACCEPT | FD_READ | FD_WRITE);

                break;

i to chyba tyle waznego teraz kod klienta

LRESULT CALLBACK MainWndProc(HWND hwnd,
                                                         UINT message,
                                                         WPARAM wParam,
                                                         LPARAM lParam)
{
        switch(message)
        {
        case WM_CREATE:
                //...
                break;
        case WM_COMMAND:
                hwnd = (HWND)lParam;
                if((hwnd == hwndButton) && (HIWORD(wParam) == BN_CLICKED))
                {
                        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
                        if ( iResult != NO_ERROR )
                        {
                                MessageBox(NULL, "Błąd przy starcie WSA", "ERROR", NULL);
                        }

                        m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

                        if ( m_socket == INVALID_SOCKET )
                        {
                                MessageBox(NULL, "Błąd w gnieździe", "ERROR", NULL);
                                WSACleanup();
                        }

                        sockaddr_in clientService;

            clientService.sin_family = AF_INET;
            clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
            clientService.sin_port = htons( 27015 );

                        if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
                        {
                                MessageBox(NULL, "Nie udało się połączyć", "ERROR", NULL);
                                WSACleanup();
                        }
                        WSAAsyncSelect(m_socket, hwnd, WM_USER, FD_CONNECT | FD_READ | FD_WRITE);
                }
                break;
        case WM_USER:
                switch(WSAGETSELECTEVENT(lParam))
                {
                        case FD_READ:
                                recv(m_socket, buf, 1024, 0);
                            NewLine(buf, hwndRich) ; // wypisanie kazdej nowej wiadomosci w nowym wierszu
                                break;
                        case FD_CONNECT:
                                break;
                        case FD_WRITE:
                                break;
                }
                break;

i to chyba wszystko mam nadzieje ze pomozesz bo sie juz z tym mecze od kilku dni i na kazdym forum jest jak to zrobic ale u mnie to nie dziala :D mam nadzieje ze o niczym nie zapomnialem

Link do komentarza
Udostępnij na innych stronach

Przejrzałem to tak pobieżnie i funkcja send serwera powinna chyba zamiast m_socket mieć AcceptSocket. Poza ty funkcje accept zamiast w pętli while dałbym w FD_ACCEPT. To tyle na razie. Dziś niedziela i święto (dwa w jednym (dzień przeciwłupierzowy :D )) i nie bardzo chce mi się analizować ten kod dokładnie, jeżeli te drobne uwagi nie pomogą to jutro po południu przejże ten kod dokładniej i może napisze coś więcej.

Link do komentarza
Udostępnij na innych stronach

Wiesz wydaje mi sie ze funkcja send itd nie ma na to wplywa w kazdtm razie sprobowalem i nie zmienia to dzialania programu...
Po drugie funkcji accept nie moge wlozyc do FD_ACCEPT skoro program wogole nie chce przejesc do wykonywania WM_USER => FD_ACCEPT wiec wtedy nie byloby polaczenia
Po trzecie tu cos jest zle chyba z komunikatem bo wczoraj wsadzilem recv()
w WM_TIMER i co kilka sekund odpbieralem te wiadomosci ale wtedy byly inne problemy np z wypisywaniem a wiec send i recv dzialaja polaczenie tez jest...
Czekam na pomoc i dzieki

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...