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

[SFML] Przekazywanie połączeń do vectora/kontenera

Ostatnio zmodyfikowano 2013-04-15 19:20
Autor Wiadomość
pekfos
» 2013-02-14 21:31:04
W następnym odcinku:
Robię tak:
-> Zapisuje kod
-> Kompiluje <<<<< Tu coś szwankuje, jakiś błąd jest
-> Uruchamiam
Oczekuję zwykłej odpowiedzi.


A na poważnie: Jaka może być "zwykła" odpowiedź, jeśli nie dajesz kodu, w którym jest błąd?
P-76306
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-15 09:15:59
Nie naigrawaj się... Podałem szczeczgółowy opis zadań które wykonują te 2 programy. Może dlatego nie podałem kodu że jak myślałem dużo osób na tym forum (zwłaszcza administratorzy) mają wprawe w pisaniu kodu i chyba zrozumią to co pisze zwłaszcza że jest to SZCZEGÓŁÓWE. Wszyściutkie kroki które są w kodzie źródłowym są opisane tutaj. Chciałbym podać kod no ale ofc. przekompilowałem kod (nic nie zmieniając) który wcześniej jako tako działał tak jak mówiłem, i teraz za każdym razem dostaje piękny komunikat: "Failed to set socket option TCP_NODELAY ; all your packet will be buffered" no ale to już nie na ten temat.
P-76324
xevuel
» 2013-02-15 15:31:12
Może dlatego nie podałem kodu że jak myślałem dużo osób na tym forum (zwłaszcza administratorzy) mają wprawe w pisaniu kodu i chyba zrozumią to co pisze zwłaszcza że jest to SZCZEGÓŁÓWE.
To nie jest Hello World, żeby można było jasno określić co wariuje. W swoim kodzie mogłeś popełnić pierdyliard błędów, których nikt z nas nigdy nie popełnił, a Ty piszesz o jakiejś "wprawie". Zresztą, jesteś na forum już wystarczająco dużo czasu żeby wiedzieć takie rzeczy...

Napiszę jasno: podaj kod który zachowuje się tak jak mówiłeś albo temat zostanie zamknięty, tym bardziej że odbiega od treści pierwszego posta.
P-76347
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-15 16:07:03
Pierw chciałbym skomentować 1 wyraz
pierdyliard
 - Nie no przy tym prawie zdechłem :P
Dobra ale daje wam aktualny kod w którym też jest błąd taki jak pisałem 2 posty wyżej (Failed to set socket...)
Proszszsz:
Client
C/C++
#include "main.h"
#include "player.h"

wge::GameWindow * app;

const unsigned short PORT = 13782;

void fMainFunc()
{
    GamePlayer mPlayer;
    mPlayer.mPos.mX = 15;
    mPlayer.mPos.mY = 15;
    mPlayer.mClient.mAddress = sf::IPAddress::LocalHost;
    mPlayer.mClient.mSocket.SetBlocking( false );
   
    wge::TextureManager * iManager = new wge::TextureManager;
    sf::Image pImage = iManager->GetTexture( "Grafika/player/player.bmp" );
    sf::Sprite pSprite( pImage );
    pSprite.SetPosition( mPlayer.mPos.mX, mPlayer.mPos.mY );
   
    if( mPlayer.mClient.mSocket.Connect( PORT, mPlayer.mClient.mAddress ) != sf::Socket::Done )
    {
        return;
    }
    else
    {
        while( app->mWindow.IsOpened() )
        {
            system( "cls" );
            while( app->mWindow.GetEvent( app->mEvent ) )
            {
                if( app->mEvent.Type == sf::Event::Closed ) app->mWindow.Close();
               
            }
           
            sf::Packet package;
            if( mPlayer.mClient.mSocket.Receive( package ) == sf::Socket::Done )
            {
                package >> mPlayer.mName;
                package >> mPlayer.mMaxHp >> mPlayer.mHp;
                package >> mPlayer.mMaxMp >> mPlayer.mMp;
                package >> mPlayer.mLevel;
                package >> mPlayer.mPos.mX >> mPlayer.mPos.mY;
               
            }
            std::string cmd = "CMD_NOTHING";
            const sf::Input & in = app->mWindow.GetInput();
            if( in.IsKeyDown( sf::Key::Down ) ) cmd = "CMD_GODOWN";
            else if( in.IsKeyDown( sf::Key::Up ) ) cmd = "CMD_GOUP";
            else if( in.IsKeyDown( sf::Key::Left ) ) cmd = "CMD_GOLEFT";
            else if( in.IsKeyDown( sf::Key::Right ) ) cmd = "CMD_GORIGHT";
           
            package.Clear();
            package << cmd;
            cout << cmd << endl;
            mPlayer.mClient.mSocket.Send( package );
           
           
            app->Clear( sf::Color( 255, 255, 255 ) );
           
            pSprite.SetPosition( mPlayer.mPos.mX, mPlayer.mPos.mY );
           
            app->Draw( pSprite );
            app->Update();
        }
    }
   
    delete iManager;
}

int main()
{
    app = new wge::GameWindow( sf::VideoMode( 800, 600, 32 ), "Client" );
   
    app->AddSection( "fMainFunc", fMainFunc );
    app->HandleSection( "fMainFunc" );
   
    delete app;
   
    return 0;
}

Serwer:
C/C++
#include "main.h"
#include "player.h"
#include "client.h"

using namespace std;

const unsigned short PORT = 13782;

const int MAX_CLIENT = 5;

void Shout( string );

typedef vector < GamePlayer > PlayerList;

int main()
{
    PlayerList players;
   
   
    //THE PROGRAM CODE
   
    sf::SocketTCP Listener;
   
    if( !Listener.Listen( PORT ) )
    {
        Shout( "Blad przy nasluchiwaniu!" );
        return - 1;
    }
   
    Listener.SetBlocking( false );
    while( true )
    {
        if( players.size() < MAX_CLIENT )
        {
           
           
            GameClient tmp; //<------------------------------------------------------ TU
            if( Listener.Accept( tmp.mSocket, & tmp.mAddress ) == sf::Socket::Done )
            {
                cout << "Poloczono clienta: " << tmp.mAddress << endl;
                GamePlayer tmpPlayer;
                tmpPlayer.mClient = tmp;
                tmpPlayer.mClient.mSocket.SetBlocking( false );
                players.push_back( tmpPlayer );
            }
           
        }
        if( players.size() > 0 ) for( int i = 0; i < players.size() - 1; i++ )
        {
            sf::SocketTCP tmpSocket = players[ i ].mClient.mSocket;
            sf::Packet package;
            package << players[ i ].mName;
            package << players[ i ].mMaxHp << players[ i ].mHp;
            package << players[ i ].mMaxMp << players[ i ].mMp;
            package << players[ i ].mLevel;
            package << players[ i ].mPos.mX << players[ i ].mPos.mY;
            int iResult = tmpSocket.Send( package );
            if( iResult == sf::Socket::Done )
            {
            }
            else if( iResult == sf::Socket::Error )
            {
                cout << "Blad! Wysylanie danych" << endl;
            }
           
            package.Clear();
            if( tmpSocket.Receive( package ) == sf::Socket::Done )
            {
                std::string command;
                package >> command;
                cout << command << endl;
                if( command == "CMD_GOUP" )
                {
                    players[ i ].mPos.mY--;
                }
                else if( command == "CMD_GODOWN" )
                {
                    players[ i ].mPos.mY++;
                }
                else if( command == "CMD_GOLEFT" )
                {
                    players[ i ].mPos.mX--;
                }
                else if( command == "CMD_GORIGHT" )
                {
                    players[ i ].mPos.mX++;
                   
                }
            }
           
           
        }
    }
   
   
   
    return 0;
}
void Shout( string str )
{
    cout << str << endl;
    getch();
}
Co do clienta to mam swój silnik 2d i tam widać jak go wykorzystuje. Po nazwach funkcji chyba można się rozczytać o co chodzi. Teraz to nawet client sie nie włącza, a tak jak pisałe @UPx2 tylko przekompilowalem kod (może coś pozmieniałem? szukam już z 4h błędu i nie umiem znaleźć). To co do kodu to chciałbym wiedzieć:
-Jak wy się zapatrujecie na pisownie mojego kodu (co źle, co poprawić)
-Co do problemu czyli czemu może tak być
-(opcjonalnie) jeśli się wam chce to możecie też powiedzieć dlaczego wyskakuje ten Failed to set socket option TCP_NODELAY ; all your TCP packets will be buffered. A i właśnie wyniuchałem że ten błąd SFML wypisuje przy funkcji Create (jesli sie cos nie powiodlo). Wydaje mi się że to jest gdzieś w kodzie serwera (w komentarzu w kodzie napisałem gdzie) bo klasa GameClient ma sf::IPAddress i sf::SocketTCP i w konstruktorze sf::SocketTCP jest właśnie wywołanie funkcji Create w której jest wyświetlany błąd
P-76350
pekfos
» 2013-02-15 16:20:16
Skompiluj program, uruchom go kilkanaście razy i sprawdzaj czy za każdym razem dzieje się to samo.
P-76351
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-15 16:34:57
Ok, już kilka razy sprawdzalem. Jest tak: Jeśli w cliencie przy sprawdzaniu czy sie połączyło jest:
if(!Client.Connect(PORT, <serwer>)) to w serwerze jest tylko napis "Połączono clienta <adres>" a włącza się lecz nie otrzymuje żadnej wiadomości. Zaś kiedy w cliencie jest if(Client.Connect(PORT, <serwer>)!=sf::Socket::Done) to wyświetla się tamto Failed.. i zaraz po tym "Połączono clienta..." ale cały Client (program) sie zamyka. Na razie wszystko robie na localhost bo nie chce mi sie odpalac hamachi, a dopiero jak uda się wszystko to bd hostował na Hamachi.
P-76352
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-15 20:59:05
Macie może jakieś pomysły?
P-76383
hincu
» 2013-04-15 19:20:07
wywal wszedzie linijki gdzie ustawiasz sockety na false, po co to robisz skoro tworzysz serwer wieloklientowy?
P-80614
1 « 2 »
Poprzednia strona Strona 2 z 2