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

[SFML 2.1 Network] Problem z działaniem komunikatora UDP

Ostatnio zmodyfikowano 2013-12-18 21:47
Autor Wiadomość
domin568
Temat założony przez niniejszego użytkownika
» 2013-12-13 16:17:20
Najprostszy przykład działa tzn :
C/C++
#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;
unsigned short port_send = 54001;
sf::Mutex mutex;

int _tmain( int argc, _TCHAR * argv[] )
{
    cout << "Client" << endl;
   
    if( socketUDP.bind( 54000 ) == sf::Socket::Done )
    {
        cout << "Binded for port : " << "54000" << endl;
       
    }
   
   
    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;
}
Jak widać usunąłem tylko wątek odbioru. Wiadomość się wysyła, i jest przyjmowana na drugiej aplikacji, no jednak już na clienta nie można nic wysłać bo nie ma wątku odbioru, no a to ma być komunikator :P. Wszystko w tym psuje ten wątek, próbwałem napisać to w C++ z użyciem biblioteki thread, ale tam ten wątek nie działa tak jak w sfml (tzn nie działa współbieżnie) albo nie umiem tego tak zrobić. Macie jakieś pomysły :) ??
P-99108
DejaVu
» 2013-12-14 02:55:17
1. Klient powinien używać portu automatycznego.
2. Serwer powinien używać portu z góry określonego (np. 12345).
3. Klient powinien wysyłać na konkretny port serwera (12345).
4. Serwer powinien wysyłać dane na taki port, na jakim przyszły dane do odebrania.
5. Upewnij się, że wątki do odbierania danych się uruchomiły (wypisz wiadomość przed rozpoczęciem pętli i po jej zakończeniu w kodzie odpowiedzialnym za odbieranie danych w tle).
P-99161
domin568
Temat założony przez niniejszego użytkownika
» 2013-12-17 20:12:26
Co to znaczy port automatyczny ? sf::Socket::AnyPort ? Problem jest nadal, bo wszystko niszczy ten wątek odbioru, jeżeli go nie ma to nawet wysyłając donikąd dane pisze że z sukcesem zostały wysłane, a jak jest wątek to nie przejdzie za nic ... Nie jest to wina tylko i wyłącznie dlatego że jest to wątek, tylko instrukcji do odbierania (receive) bo jak ją usunę to przejdzie - tak jak tutaj na dole.
C/C++
void receive_data()
{
    std::size_t received;
    bool wyjscie = false;
    while( wyjscie != true )
    {
       
       
    }
}
 To jest problem po stronie aplikacji nie po stronie przesyłu danych.
Tutaj wklejam cały kod według wskazówek DejaVu :
SERVER :
C/C++
#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 = 54001;

void receive_data()
{
    std::size_t received;
    bool wyjscie = false;
    while( wyjscie != true )
    {
       
        if( socketUDP.receive( data_receive, 100, received, local_host, port ) == 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 ) == sf::Socket::Done )
    {
        cout << "Binded for port : " << "54001" << endl;
       
    }
   
    sf::Thread watek_odbioru( & receive_data );
    watek_odbioru.launch();
    while( true )
    {
        cin.getline( data_send, 100 );
        packet_send.clear(); // NIE POTRZEBNE
        packet_send << data_send; // NIE POTRZEBNE
        cout << packet_send.getDataSize() << endl; // NIE POTRZEBNE
        if( socketUDP.send( data_send, 100, local_host, port ) == sf::Socket::Done )
        {
            cout << "Succesfull send data" << endl; // :)
        }
        else
        {
            cout << "Unsuccesfull data send" << endl; // Ciągle to mnie dręczy :/
        }
       
    }
    return 0;
}
CLIENT :
C/C++
#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 = 54001;
sf::Mutex mutex;
void receive_data()
{
    cout << "AAA" << endl; // WYŚWIETLA SIĘ
    std::size_t received;
    bool wyjscie = false;
    while( wyjscie != true )
    {
        cout << "AAAAA" << endl; // wyświetla się
        if( socketUDP.receive( data_receive, 100, received, local_host, port ) == 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( sf::Socket::AnyPort ) == sf::Socket::Done )
    {
        cout << "Binded for AnyPort" << endl;
       
    }
    sf::Thread thread_receive( & receive_data );
    thread_receive.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 ) == sf::Socket::Done )
        {
            cout << "Succesfull send data" << endl;
        }
        else
        {
            cout << "Unsuccesfull data send" << endl;
        }
       
    }
    return 0;
}
Liczę na pomoc :)
P-99513
DejaVu
» 2013-12-17 20:38:50
Źle wysyłasz sf::Packet-y... czytałeś kurs SFML-a dot. komunikacji sieciowej??
P-99519
domin568
Temat założony przez niniejszego użytkownika
» 2013-12-17 20:42:22
Ale przecież ja nie wysyłam w pakiecie, wysyłam w "płaskich danych" jak to napisałeś wcześniej
C/C++
if( socketUDP.send( data_send, 100, local_host, port_send ) == sf::Socket::Done )
Odkryłem że jeżeli w wątku odbierającym dane zmienie adres IP z local hosta to działa tzn.

C/C++
sf::IpAddress ip = "95.168.26.108";
unsigned short jakis_port = 50000;
void receive_data()
{
    std::size_t received;
    bool wyjscie = false;
    while( wyjscie != true )
    {
       
        if( socketUDP.receive( data_receive, 100, received, ip, jakis_port ) == sf::Socket::Done )
        {
            cout << "Receive data" << endl;
            packet_receive >> data_receive;
            cout << data_receive << endl;
        }
    }
}
P-99521
DejaVu
» 2013-12-17 20:45:09
To po co wklejasz kod, który nie ma najmniejszego znaczenia? Minimalizuj przykłady.

C/C++
socketUDP.receive( data_receive, 100, received, local_host, port ) == sf::Socket::Done )
Jesteś pewien, że ostatnie dwa argumenty nie są modyfikowane przez metodę receive?

/edit:
http://www.sfml-dev.org​/documentation/2.1​/classsf_1_1UdpSocket.php#ade9ca0f7ed7919136917b0b997a9833a

Czytaj: ostatnie dwa argumenty odczytują 'nadawcę'.
P-99524
domin568
Temat założony przez niniejszego użytkownika
» 2013-12-17 22:12:07
IP nadawcy czyli local-host (127.0.0.1) bo narazie aplikacja działa na jednym komputerze, port 54001, ale nie jestem pewien czy to jest dobrze ten port bo coś mówiłeś o porcie automatycznym nie wiem co masz na myśli :D. Może jest to winą tego ze adresy ip servera i clienta sa takie same, to może to blokuje (jeżeli zmienię ip servera to wysyłanie działa) .
P-99539
DejaVu
» 2013-12-17 22:31:36
Czemu nie dostosujesz się do tego co napisałem na temat sf::Socket::AnyPort, tylko dalej z uporem 'wymyślasz' własny 'lepszy' sposób odbierania danych... Sam robisz sobie przez to problemy i jeszcze się dziwisz, że nie działa. Tym bardziej, że nadpisujesz sobie co i rusz wartości local_host i port przy odczycie danych.
P-99542
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona