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

Komunikacja za pomocą UDP, serwer nie odpowiada. SFML

Ostatnio zmodyfikowano 2018-08-14 14:01
Autor Wiadomość
bleda
Temat założony przez niniejszego użytkownika
Komunikacja za pomocą UDP, serwer nie odpowiada. SFML
» 2018-08-10 13:43:25
Witam,  mamy taki sam program dla klienta i serwera (Serwer wysyla komunikaty tekstowe). Uruchamiam aplikacje ustawiam jako serwer, robie to samo z klientem. Niestety klient  nie łączy się z serwerem. Program jest krótki, wklejam więc go w całości.
C/C++
int main()
{
    sf::IpAddress ip = sf::IpAddress::getLocalAddress();
    sf::UdpSocket socket;
    char connectionType, mode;
    char bufor[ 2000 ];
    size_t received;
    std::map < unsigned short, sf::IpAddress > computerID;
    string text = "Polaczono";
   
    cout << ip << endl;
    cout << " Emter (s) for Server, Enter (c) for client " << endl;
    cin >> connectionType;
   
    unsigned short port;
    cout << "Podaj numer portu: ";
    cin >> port;
    socket.bind( port );
   
    if( connectionType == 's' )
    {
        do
        {
            sf::IpAddress rIp;
            unsigned short port;
            socket.receive( bufor, sizeof( bufor ), received, rIp, port );
            if( received > 0 )
                 computerID[ port ] = rIp;
           
        } while( true );
       
    } else
    {
        string sIP;
        cout << "Podaj adres serwera: ";
        char c;
        while( true )
        {
            c =( char ) getch();
            if( c == 13 ) break;
           
            sIP += c;
            cout << c;
        }
        cout << endl << sIP;
        sf::IpAddress sendIP( sIP );
        socket.send( text.c_str(), text.length() + 1, sendIP, 2000 );
    }
    bool done = false;
    while( !done )
    {
        if( connectionType == 's' )
        {
            getline( cin, text );
            std::map < unsigned short, sf::IpAddress >::iterator tempIterator;
            for( tempIterator = computerID.begin(); tempIterator != computerID.end(); tempIterator++ )
                 socket.send( text.c_str(), text.length() + 1, tempIterator->second, tempIterator->first );
           
        } else
        {
            sf::IpAddress tempIp;
            unsigned short tempPort;
            socket.receive( bufor, sizeof( bufor ), received, tempIp, tempPort );
            if( received > 0 )
                 cout << "Odebrana wiadomosc: " << bufor << endl;
           
        }
    }
}
 
P-172059
pekfos
» 2018-08-10 14:56:39
C/C++
do
{
    sf::IpAddress rIp;
    unsigned short port;
    socket.receive( bufor, sizeof( bufor ), received, rIp, port );
    if( received > 0 )
         computerID[ port ] = rIp;
   
} while( true );
Ta pętla jest nieskończona.

C/C++
string sIP;
cout << "Podaj adres serwera: ";
char c;
while( true )
{
    c =( char ) getch();
    if( c == 13 ) break;
   
    sIP += c;
    cout << c;
}
Um... std::getline()..?
To wypada ci po wczytywaniu numeru portu, więc strzelam że to się przyda » Kurs C++ / FAQstd::getline() mi nie działa! pytanie/odpowiedź
P-172060
bleda
Temat założony przez niniejszego użytkownika
» 2018-08-10 22:09:52
Dokładnie, wypada mi po wpisaniu portu po stronie klienta. Potem powininiem móc (po stronie serwera) wspisać zmienną znak dla przerwania pętli while. Serwer odmawia współpracy ;]  Usunąłem getline. Wstawiłem też warunek do pętli.
C/C++
if( connectionType == 's' )
{ char znak = 'b';
    do
    {
        sf::IpAddress rIp;
        unsigned short port;
        socket.receive( bufor, sizeof( bufor ), received, rIp, port );
        if( received > 0 )
             computerID[ port ] = rIp;
       
        cin >> znak;
    } while( znak != 'a' );
   

C/C++
} else
{
string sIP;
cout << "Podaj adres serwera: ";


cin >> sIP;
cout << endl << sIP;
sf::IpAddress sendIP( sIP );
socket.send( text.c_str(), text.length() + 1, sendIP, 2000 );
}
P-172064
bleda
Temat założony przez niniejszego użytkownika
» 2018-08-13 10:58:13
Kombinuję jak koń pod góre ;] Probuje zrobić to samo z kodem zamieszczonym w kursie. Metoda receive odmawia wspolpracy. Kod troszke przerobiony z kursu:
C/C++
using namespace std;
int main()
{
    sf::UdpSocket sock; // tworzymy gniazdo
    sf::IpAddress ip = sf::IpAddress::getLocalAddress();
    cout << ip << endl;
   
    const int datasize = 100; // rozmiar danych do wyslania/odebrania
    char data[ datasize ] = "..."; // dane
    char wybor;
    cout << "Enter (c) for client, (s) for serwer: " << endl;
    do
    {
        cin >> wybor;
        if(( wybor != 'c' ) &&( wybor != 's' ) ) cout << "Wybrales: " << wybor << endl << "Enter (c) for client, (s) for serwer: " << endl;
       
    } while(( wybor != 'c' ) &&( wybor != 's' ) );
   
    // wysylanie
    //unsigned short port = 56000; // port, na który chcesz wyslac dane ////////////////////////////////////////////////
   
    if( wybor == 's' )
    {
        unsigned int port = 56000;
        char stop;
        do
        {
            if( sock.send( data, datasize, ip, port ) != sf::Socket::Done )
            {
                cerr << "Nie mozna wysylac danych!\n";
                exit( 1 );
            }
            cout << "wyslano: " << data << endl;
            cout << "Enter (s) for stop: ";
            cin >> stop;
        } while( stop != 's' );
       
    }
   
    // odbieranie
   
    if( wybor == 'c' )
    {
        unsigned short port = 54000; // port, na którym chcesz odbierać dane
        unsigned short senderport = 56000; // port, z którego zostanły wysłane dane
        size_t received;
        sock.bind( port );
       
        cout << "Oczekuje na wiadomosc z IP: " << ip << endl;
        if( sock.receive( data, 100, received, ip, senderport ) != sf::Socket::Done )
        {
            cerr << "Nie mozna odebrac danych!" << endl;
            exit( 1 );
        }
        cout << "Odebrano bajtów: " << received << endl;
        cin >> wybor;
    }
}

Jak widać port w metodzie send jest taki sam jak w  receive. Metoda bind wskazuje nam port docelowy dla odbierania wiadomosci.Wszystko wiec jest w porządku o ile dobrze rozumiem.

Po kompilacji po stronie klienta mam takie coś :


Enter (c) for client, (s) for serwer:
c
Oczekuje na wiadomosc z IP:

Po stronie serwera :


Enter (c) for client, (s) for serwer:
s
wyslano: ...
Enter (s) for stop: 1
wyslano: ...
Enter (s) for stop: 1
wyslano: ...
Enter (s) for stop: 1
wyslano: ...
Enter (s) for stop: 1
wyslano: ...
Enter (s) for stop:



P-172082
bleda
Temat założony przez niniejszego użytkownika
» 2018-08-14 09:04:14
Ostatni przykład żywcem skopiowany z kursu. Dlaczego metoda receive nie dziala? Tzn na niej zawiesza się wykonywanie kodu. Będe wdzieczny za jakąkolwiek pomoc.
C/C++
int main()
{
    sf::UdpSocket sock, sock2; // tworzymy gniazdo
   
    const int datasize = 100; // rozmiar danych do wysłania/odebrania
    char data[ datasize ] = "...."; // dane
   
    // wysyłanie
    sf::IpAddress ipdo = sf::IpAddress::getLocalAddress();
    short unsigned int portdo = 5600; // port, na który chcesz wysłac dane
   
    if( sock.send( data, datasize, ipdo, portdo ) != sf::Socket::Done )
    {
        cerr << "Nie mozna wyslac danych!\n";
        exit( 1 );
    }
    else
    {
        cout << "wyslano  wiadomosc o tresci: " << data << endl;
    }
   
    // odbieranie
    sf::IpAddress ipod = sf::IpAddress::getLocalAddress();
    short unsigned int portod = 5600; // port, na którym chcesz odbierać dane
    short unsigned int senderport = 5400; // port, z którego zostanły wysłane dane
    unsigned int received;
    sock2.bind( portod );
    cout << "Metoda receive" << endl;
    if( sock2.receive( data, datasize, received, ipod, senderport ) != sf::Socket::Done )
    {
        cerr << "Nie mozna odebrac danych!\n";
        exit( 1 );
    }
    cout << "Odebrano bajtów: " << received << endl;
    return 0;
}


wyslano  wiadomosc o tresci: ....
Metoda receive
P-172091
pekfos
» 2018-08-14 13:10:50
C/C++
int main()
{
    sf::UdpSocket sock, sock2; // tworzymy gniazdo
   
    const int datasize = 100; // rozmiar danych do wysłania/odebrania
    char data[ datasize ] = "...."; // dane
   
    // odbieranie
    short unsigned int portdo = 5600; // port, na który chcesz wysłac dane
    sock2.bind( portdo );
   
    // wysyłanie
    sf::IpAddress ipdo( "127.0.0.1" );
   
    if( sock.send( data, datasize, ipdo, portdo ) != sf::Socket::Done )
    {
        cerr << "Nie mozna wyslac danych!\n";
        exit( 1 );
    }
    else
    {
        cout << "wyslano  wiadomosc o tresci: " << data << endl;
    }
   
    cout << "Metoda receive" << endl;
    unsigned int received;
    sf::IpAddress ipod;
    short unsigned int senderport; // port, z którego zostanły wysłane dane
    if( sock2.receive( data, datasize, received, ipod, senderport ) != sf::Socket::Done )
    {
        cerr << "Nie mozna odebrac danych!\n";
        exit( 1 );
    }
    cout << "Odebrano bajtów: " << received << endl;
    return 0;
}
P-172093
bleda
Temat założony przez niniejszego użytkownika
» 2018-08-14 14:01:09
Dziękuję Pekfos, dostrzegam jeden swój błąd ->
sf::IpAddress ipod = sf::IpAddress::getLocalAddress();
  Nie potrzebnie wprowadzam adres ale to raczej szczegół. Dlaczego getLocalAddress i użycie lokalnego Ip nie daje oczekiwanych efektów.
P-172094
« 1 »
  Strona 1 z 1