H4X0R Napisano Listopad 14, 2019 Autor Zgłoś Udostępnij Napisano Listopad 14, 2019 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... Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Listopad 16, 2019 Zgłoś Udostępnij Napisano Listopad 16, 2019 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ć. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
H4X0R Napisano Listopad 16, 2019 Autor Zgłoś Udostępnij Napisano Listopad 16, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Listopad 16, 2019 Zgłoś Udostępnij Napisano Listopad 16, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
H4X0R Napisano Listopad 16, 2019 Autor Zgłoś Udostępnij Napisano Listopad 16, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Listopad 17, 2019 Zgłoś Udostępnij Napisano Listopad 17, 2019 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
H4X0R Napisano Listopad 17, 2019 Autor Zgłoś Udostępnij Napisano Listopad 17, 2019 Wreszcie dziala wielkie dzieki moze analiza twojeg kodu pozwoli mi zie zorientowac w czym byl blad. W kazdym razie z twoim kodem tez mialem problem, na szczescie juz go rozwiazalem ( wiem ze cos zrobilem sam hehe :D ) Jeszcze raz wielkie dzieki. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.