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
[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:
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 = 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(); // NIE POTRZEBNE
        packet_send << data_send; // NIE POTRZEBNE
        cout << packet_send.getDataSize() << endl; // NIE POTRZEBNE
        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
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_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(); // NIE POTRZEBNE
        packet_send << data_send; // NIE POTRZEBNE
        cout << packet_send.getDataSize() << endl; // NIE POTRZEBNE
        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;
}
P-98931
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.
P-98986
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 :) ??
P-99022
DejaVu
» 2013-12-11 21:47:54
np. to:
C/C++
if( socketUDP.receive( data_receive, 100, received, local_host, port_receive ) == sf::Socket::Done )
P-99023
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.
P-99062
DejaVu
» 2013-12-12 18:10:45
Zapewne bind się w takim razie nie wykonuje.
P-99064
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"
P-99065
DejaVu
» 2013-12-12 20:21:37
No to napisz najprostszy możliwy przypadek testowy:
C/C++
wypiszStatus( socket.bind( 12345 ) );
sf::Packet xx;
xx << 123;
wypiszStatus( socket.send( xx ) );
P-99069
« 1 » 2 3
  Strona 1 z 3 Następna strona