domin568 Temat założony przez niniejszego użytkownika |
[SFML 2.1 Network] Problem z działaniem komunikatora UDP » 2013-12-10 20:03:32 Witam, napisałem prostą aplikacje client-server. Polega ona na wysyłaniu wiadomości z clienta do servera i vice versa. Jednak kiedy chce poprostu wysłać jakąś wiadomość to otrzymuję komunikat "Unsuccesfull data send" (który sam zaprogramowałem żeby się pokazywał przy nieudanym wysyłaniu wiadomości), dzieje się tak w przypadku clienta i servera, czyli wymiana informacji jest niemożliwa, nic nie działa ;/ Jednak odkryłem zależność że jeżeli usunę w jednej stronie (client albo server) wątek który odbiera wiadomości to ta strona wysyła wiadomości dobrze i przechodzą one do drugiej strony ( czyli jeżeli client nie ma wątku odbierania wiadomości to z sukcesem wyśle wiadomość do servera ). Nie mogę zrozumieć dlaczego w obu aplikacjach nie mogą być wątki odbioru daty. W chacie używającym TCP mi się to udało i działało. Bardzo proszę o ewentualną pomoc, bo sam naprawdę już nic nie zdziałam bo materiałów na ten temat jest bardzo mało. Kod : SERVER: #include "stdafx.h" #include <SFML/Network.hpp> #include <iostream> using namespace std; sf::Packet packet_send; sf::Packet packet_receive; char data_send[ 100 ]; char data_receive[ 100 ]; sf::UdpSocket socketUDP; sf::IpAddress local_host = sf::IpAddress::LocalHost; unsigned short port_receive = 54001; unsigned short port_send = 54000; void receive_data() { std::size_t received; bool wyjscie = false; while( wyjscie != true ) { if( socketUDP.receive( data_receive, 100, received, local_host, port_receive ) == sf::Socket::Done ) { cout << "Receive data" << endl; packet_receive >> data_receive; cout << data_receive << endl; } } } int _tmain( int argc, _TCHAR * argv[] ) { cout << "Server" << endl; if( socketUDP.bind( port_receive ) == sf::Socket::Done ) { cout << "Binded for port : " << "54001" << endl; } sf::Thread receive_data( & receive_data ); receive_data.launch(); while( true ) { cin.getline( data_send, 100 ); packet_send.clear(); packet_send << data_send; cout << packet_send.getDataSize() << endl; if( socketUDP.send( data_send, 100, local_host, port_send ) == sf::Socket::Done ) { cout << "Succesfull send data" << endl; } else { cout << "Unsuccesfull data send" << endl; } } return 0; }
CLIENT #include "stdafx.h" #include <SFML/Network.hpp> #include <iostream> using namespace std; sf::Packet packet_send; sf::Packet packet_receive; char data_send[ 100 ]; char data_receive[ 100 ]; sf::UdpSocket socketUDP; sf::IpAddress local_host = sf::IpAddress::LocalHost; unsigned short port_send = 54001; unsigned short port_receive = 54000; void receive_data() { std::size_t received; bool wyjscie = false; while( wyjscie != true ) { if( socketUDP.receive( data_receive, 100, received, local_host, port_receive ) == sf::Socket::Done ) { cout << "Receive data" << endl; packet_receive >> data_receive; cout << data_receive << endl; } } } int _tmain( int argc, _TCHAR * argv[] ) { cout << "Client" << endl; if( socketUDP.bind( port_receive ) == sf::Socket::Done ) { cout << "Binded for port : " << "54000" << endl; } sf::Thread receive_data( & receive_data ); receive_data.launch(); while( true ) { cin.getline( data_send, 100 ); packet_send.clear(); packet_send << data_send; cout << packet_send.getDataSize() << endl; if( socketUDP.send( data_send, 100, local_host, port_send ) == sf::Socket::Done ) { cout << "Succesfull send data" << endl; } else { cout << "Unsuccesfull data send" << endl; } } return 0; }
|
|
DejaVu |
» 2013-12-11 16:38:31 Napisz komunikację sieciową w oparciu albo o pakiety albo o 'płaskie dane'. Skoro wysyłasz trochę danych binarnie i trochę danych w postaci pakietu to nie masz żadnej gwarancji co w jakiej kolejności przyjdzie i tym samym nie masz żadnej gwarancji, że cokolwiek uda się odczytać, bo dane mogą przyjść w odwrotnej kolejności. |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-11 21:46:30 Wcześniej aplikacja była napisana z wykorzystaniem pakietów jednak problem byl ten sam. Myślałem ze to w jakiś sposób wina pakietów i zmieniłem na taka postać i jak widać okazała sie wersja finalną. Co masz na myśli mówiąc płaskie dane :) ?? |
|
DejaVu |
» 2013-12-11 21:47:54 np. to: if( socketUDP.receive( data_receive, 100, received, local_host, port_receive ) == sf::Socket::Done )
|
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-12 17:40:23 Tylko problem tkwi że one w ogóle nie wychodzą z aplikacji, czyli z send() jest zwracany fałsz, czyli coś się dzieje z wysyłaniem, ale kompletnie nie wiem o co chodzi. |
|
DejaVu |
» 2013-12-12 18:10:45 Zapewne bind się w takim razie nie wykonuje. |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-12 18:21:40 No właśnie binduje się mam wiadomość "Binded for port : " << "54000" |
|
DejaVu |
» 2013-12-12 20:21:37 No to napisz najprostszy możliwy przypadek testowy: wypiszStatus( socket.bind( 12345 ) ); sf::Packet xx; xx << 123; wypiszStatus( socket.send( xx ) );
|
|
« 1 » 2 3 |