[SFML 2.0] Wysyłanie i odbieranie pakietów
Ostatnio zmodyfikowano 2013-01-14 06:37
Wasilek Temat założony przez niniejszego użytkownika |
[SFML 2.0] Wysyłanie i odbieranie pakietów » 2013-01-13 16:52:02 W trakcie pracy wpadłem na kolejny problem ... a dokładniej gdy klient wysyła wiadomość do serwera to jest wszystko ok, lecz gdy serwer chce już odesłać tą wiadomość z powrotem to ... wiadomość nie dociera :( Serwer std::vector < sf::TcpSocket *> clients; sf::SocketSelector selector;
cout << "Polaczono z nowym klientem" << endl; clients.push_back( client ); selector.add( * client );
for( std::vector < sf::TcpSocket *>::iterator it = clients.begin(); it != clients.end(); ++it ) { sf::TcpSocket & client = ** it; if( selector.isReady( client ) ) { sf::Packet packet; if( client.receive( packet ) == sf::Socket::Done ) { packet >> x; packet.clear(); cout << x << endl; sf::Packet packetup; packetup << x; for( std::vector < sf::TcpSocket *>::iterator it = clients.begin(); it != clients.end(); ++it ) { sf::TcpSocket & odbiorca = ** it; if( odbiorca.send( packetup ) == sf::Socket::Done ) { cout << "Czymaj :D" << endl; } } packetup.clear(); } } }
Klient if( selector.wait( Timeout ) ) { if( selector.isReady( socket ) ) { cout << "dostalem !" << endl; sf::Packet packet; socket.receive( packet ); packet >> downx; packet.clear(); } }
|
|
DejaVu |
» 2013-01-13 18:38:57 Może źle piszesz aplikację klienta? Patrzyłeś jak wygląda komunikacja w tutorialach SFML-a? |
|
Wasilek Temat założony przez niniejszego użytkownika |
» 2013-01-13 18:43:34 No ewentualnie mogę pokazać jak wygląda cały klient
#include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <iostream> #include <ctime> #include <conio.h> using namespace std;
sf::RenderWindow okno( sf::VideoMode( 1, 1, 16 ), "Klient" ); sf::Event zdarzenie;
int main() { bool exit = false; char przycisk; string downx; string sendx; string wiadomosc; vector < string > tekst; string nick; sf::TcpSocket socket; sf::Packet Received; sf::SocketSelector selector; sf::Time Timeout = sf::seconds( 0.02 ); sf::Packet ToSend; socket.connect( "25.170.61.242", 12000 ); cout << "Polaczono z " << socket.getRemoteAddress() << endl; cout << "Podaj swoj nick -> "; cin >> nick; do { if( selector.wait( Timeout ) ) { if( selector.isReady( socket ) ) { cout << "dostalem !" << endl; sf::Packet packet; socket.receive( packet ); packet >> downx; packet.clear(); int a; if( tekst.size() < 21 ) tekst.push_back( downx ); else { for( unsigned int i = 0; i < tekst.size(); i++ ) { if( tekst[ i ].length() == 0 ) { a = i; break; } else { if( i + 1 == tekst.size() ) { tekst.erase( tekst.begin() ); a = i; } } } } tekst[ a ] = downx; cout << "Polaczono z " << socket.getRemoteAddress() << endl; for( unsigned int i = 0; i < tekst.size(); i++ ) { cout << tekst[ i ] << endl; } cout << wiadomosc << endl; } } while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::TextEntered ) { przycisk = static_cast < char >( zdarzenie.text.unicode ); if( static_cast < int >( przycisk ) == 8 ) { if( wiadomosc.length() != 0 ) { wiadomosc.erase( wiadomosc.length() - 1 ); } } else if( static_cast < int >( przycisk ) == 13 ) { if( wiadomosc.length() != 0 ) { sendx += nick + " say: " + wiadomosc; ToSend << sendx; socket.send( ToSend ); ToSend.clear(); sendx.clear(); wiadomosc.clear(); cout << " Wiadomosc wyslana" << endl; } } else if( static_cast < int >( przycisk ) == 27 ) { exit = true; } else { wiadomosc += static_cast < char >( przycisk ); } system( "cls" ); cout << "Polaczono z " << socket.getRemoteAddress() << endl; cout << "Twoj nick to -> " << nick << endl; for( unsigned int i = 0; i < tekst.size(); i++ ) { cout << tekst[ i ] << endl; } cout << wiadomosc << endl; } } } while( exit != true ); return 0; }
I korzystam właśnie z tutoriali na stronie SFML'a |
|
DejaVu |
» 2013-01-13 19:03:18 |
|
Wasilek Temat założony przez niniejszego użytkownika |
» 2013-01-13 19:21:49 W takim razie mam wtedy problem z "płynnością" działania aplikacji - pętla musi być cały czas wykonywana, a funkcja od odbierania danych zatrzyma pętle.
Chyba, że ktoś zna jakiś sposób aby pakiety były odczytywane tylko wtedy gdy zostaną przysłane ? |
|
Wasilek Temat założony przez niniejszego użytkownika |
» 2013-01-14 00:14:30 A więc kilka spraw, które trzeba uregulować ... " Tak się składa, że selector stosowany dla serwera, a nie dla klienta." - dla klienta też się stosuje. A więc aby wszystko działało musiałem troszkę zmienić kod ... ale tylko troszkę xD (szkoda, ze zajęło mi to cały dzień ... :P )
#include <SFML/Network.hpp> #include <iostream> #include <conio.h> using namespace std;
int main() { string downx; sf::TcpSocket socket; sf::Time Timeout = sf::seconds( 0.02 ); sf::SocketSelector selector; socket.connect( "25.170.61.242", 12000 ); selector.add( socket ); do { if( selector.wait( Timeout ) ) { sf::Packet packet; if( socket.receive( packet ) == sf::Socket::Done ) { packet >> downx; packet.clear(); } } } while( exit != true ); return 0; }
|
|
DejaVu |
» 2013-01-14 06:37:17 No to skoro temat rozwiązany to zamykam :) |
|
« 1 » |