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

SFML Problem z wysyłaniem pakietów przez UDP

Ostatnio zmodyfikowano 2013-03-16 10:33
Autor Wiadomość
anonim
Temat założony przez niniejszego użytkownika
SFML Problem z wysyłaniem pakietów przez UDP
» 2013-03-13 18:04:35
Cześć
Pisze sobie komunikator internetowy, odbieranie pakietów działa, ale nie działa ich wysyłanie:

fragment funkcji main:
C/C++
sf::SocketUDP Socket;
Socket.SetBlocking( false );
unsigned short Port = 4567;

if( !Socket.Bind( Port ) )
{
    std::cout << "Brak polaczenia!!!\n";
}
else
     std::cout << "Polaczenie skuteczne\n";

fragment kodu odpowiedzialny za wysylanie pakietu:

      
C/C++
if( buttonWyslij.wasClicked( mysz.x, mysz.y ) ) //obsluga przycisku - jeśli przycisk wysłać kliknięty to wysyłamy
{
    sf::Packet ToSend;
    std::string str =( std::string ) tekstEdit.text.GetText(); //tekst do wyslania (z pola tekstowego)
    std::cout << str << "\n";
    ToSend << str;
    Socket.Send( ToSend, klientAddress, Port ); //wyslanie, klientAddress to numer IP komputera do którego wysyłam
    labelChat.text.SetText(( std::string ) labelChat.text.GetText() + "<Ty> " + str + "\n" ); //ustawienie tekstu w oknie czatu
}

fragment kodu odpowiedzialny za odbieranie pakietu:
C/C++
sf::Packet Received;
std::string odp;
if( Socket.Receive( Received, klientAddress, Port ) != sf::Socket::Done )
{
    //std::cout << "Brak Odbioru!!!\n";
}
Received >> odp;
if( !Received )
{
    // std::cout << "Nie widze danych!!!\n";
}
else
     labelChat.text.SetText(( std::string ) labelChat.text.GetText() + "<Drugi Uzytkownik> " + odp + "\n" );


Odpaliłem program na 2 kompach i nie działa, ale kiedy z drugiego komputera wysyłałem innym programem dane na pierwszy komputer, to odbierał on dane prawidłowo
Co jest źle?
P-78239
Admixior
» 2013-03-14 23:02:10
Sprawdź zaporę (czy masz odblokowany komp), adres ip (w sfml możesz podawać nazwę kompa jak jesteś wewnątrz sieci) oraz czy nie masz ukrywania kompa w sieci.

Jeżeli powyższe jest nie prawidłowe to:
ale kiedy z drugiego komputera wysyłałem innym programem dane na pierwszy komputer, to odbierał on dane prawidłowo
Masz na myśli swoim programem zrobionym w SFML?

Czy na obu komputera używasz tego samego programu(portu)? i wysyłasz pod odpowiedni? (najlepiej pokaż uzupełnianie klasy klientAdres.


//Z jakiej wersji SFML korzystasz?
P-78395
hincu
» 2013-03-15 11:40:48
spradzaj to na localhoscie czy dziala... jesli zadziala na localhoscie to w sieci tez bedzie dzialac, nie wysyla bo nie masz stalego ip
P-78411
anonim
Temat założony przez niniejszego użytkownika
» 2013-03-16 10:33:30
@Admixior
Wysyłam na ten sam port, SFML 1.6


Zauważyłem coś co może być rozwiązaniem problemu, załóżmy, że mamy taki kod:
C/C++
#include <iostream>
#include <SFML/Network.hpp>
#include <string>

int main()
{
    sf::IPAddress localAdress = sf::IPAddress::GetLocalAddress();
    sf::SocketUDP Socket;
    Socket.SetBlocking( false );
    unsigned short Port = 4567;
    if( !Socket.Bind( Port ) )
    {
        std::cout << "Brak poloczenia z portem!!!\n";
    }
    else
         std::cout << "Poloczenie z portem skuteczne\n";
   
    std::string odp;
    for(;; )
    {
        std::string nap = "Test";
        sf::Packet ToSend;
        ToSend << nap;
        Socket.Send( ToSend, localAdress, Port );
        sf::Packet Received;
        std::string odp;
        if( Socket.Receive( Received, localAdress, Port ) != sf::Socket::Done )
        {
            //std::cout << "Brak Odbioru!!!\n";
        }
        Received >> odp;
        if( !Received )
        {
            //std::cout << "Nie widze danych!!! " << frameTimer << "\n";
        }
        else
        {
            //labelChat.text.SetText((std::string)labelChat.text.GetText() + "<Drugi Uzytkownik> " + odp + "\n");
            std::cout << odp << "\n";
        }
    }
}

To teraz wszystko działa,

ale jeśli zmienię kolejność - najpierw spróbuje odebrać a potem wysłać, to program nie odbiera


Pętla w której się zmieniło:
C/C++
for(;; )
{
    sf::Packet Received;
    std::string odp;
    if( Socket.Receive( Received, localAdress, Port ) != sf::Socket::Done )
    {
        //std::cout << "Brak Odbioru!!!\n";
    }
    Received >> odp;
    if( !Received )
    {
        //std::cout << "Nie widze danych!!! " << frameTimer << "\n";
    }
    else
    {
        //labelChat.text.SetText((std::string)labelChat.text.GetText() + "<Drugi Uzytkownik> " + odp + "\n");
        std::cout << odp << "\n";
    }
    std::string nap = "Test";
    sf::Packet ToSend;
    ToSend << nap;
    Socket.Send( ToSend, localAdress, Port );
}

Dlaczego nie można tego robić w takiej kolejności (najpierw nasłuchiwać, a potem wysyłać)?
P-78512
« 1 »
  Strona 1 z 1