Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Wysyłanie i odbieranie pakietów

Ostatnio zmodyfikowano 2013-01-14 06:37
Autor Wiadomość
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
C/C++
// ...
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; // Tutaj dziala dobrze
            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; // cout sie wyswietla
                }
            }
            packetup.clear();
        }
    }
}
// ...

Klient
C/C++
if( selector.wait( Timeout ) )
{ // I tutaj juz nie dziala :<
    if( selector.isReady( socket ) )
    {
        cout << "dostalem !" << endl;
        sf::Packet packet;
        socket.receive( packet );
        packet >> downx;
        packet.clear();
        // ...
    }
}
P-73817
DejaVu
» 2013-01-13 18:38:57
Może źle piszesz aplikację klienta? Patrzyłeś jak wygląda komunikacja w tutorialach SFML-a?
P-73824
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
C/C++
/// KLIENT ///




#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <iostream>
#include <ctime>
#include <conio.h>
using namespace std;

/** zmienne globalne **/

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;
   
    /// Polaczenie sieciowe
   
    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;
   
    /// [Polaczenie sieciowe
   
    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;
                ///system("cls");
                cout << "Polaczono z " << socket.getRemoteAddress() << endl;
                for( unsigned int i = 0; i < tekst.size(); i++ )
                {
                    cout << tekst[ i ] << endl;
                }
                cout << wiadomosc << endl;
            }
        }
       
       
        /// Obsluga zdarzen
        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;
            }
        }
        /// [Obsluga zdarzen]
    }
    while( exit != true );
   
    return 0;
}

I korzystam właśnie z tutoriali na stronie SFML'a
P-73826
DejaVu
» 2013-01-13 19:03:18
http://www.sfml-dev.org/tutorials/1.3/network-selector.php

Tak się składa, że selector stosowany dla serwera, a nie dla klienta.


Obsługa wysyłania/odbierania danych przy pomocy pakietów:
http://www.sfml-dev.org/tutorials/1.6/network-packets.php
P-73830
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 ?
P-73834
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 )

C/C++
/// KLIENT ///

#include <SFML/Network.hpp>
#include <iostream>
#include <conio.h>
using namespace std;

/** zmienne globalne **/

int main()
{
    string downx;
    /// Polaczenie sieciowe
    sf::TcpSocket socket;
    sf::Time Timeout = sf::seconds( 0.02 ); // Czas jak kto chce :P
    sf::SocketSelector selector; // Selector musi być
    socket.connect( "25.170.61.242", 12000 ); // Socket musi być podłączone
    selector.add( socket ); // I teraz dopiero dodajemy "socket" do selectora
    /// [Polaczenie sieciowe
   
    do
    {
        if( selector.wait( Timeout ) ) // I takie cos (tak samo jak w serwerze) wystarcza aby przesyłanie pakietów nie zaburzało pracy programu
        {
            sf::Packet packet;
            if( socket.receive( packet ) == sf::Socket::Done )
            {
                packet >> downx;
                packet.clear();
            }
        }
    }
    while( exit != true );
   
    return 0; // Wyszczupliłem kod do tego co tylko musi być :) Mam nadzieję, że komuś się przyda ^^
}

P-73891
DejaVu
» 2013-01-14 06:37:17
No to skoro temat rozwiązany to zamykam :)
P-73895
« 1 »
  Strona 1 z 1