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? |
|
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. |
|
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. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-15 16:07:03 Pierw chciałbym skomentować 1 wyraz - 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 #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: #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; 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; 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 |
|
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. |
|
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. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-15 20:59:05 Macie może jakieś pomysły? |
|
hincu |
» 2013-04-15 19:20:07 wywal wszedzie linijki gdzie ustawiasz sockety na false, po co to robisz skoro tworzysz serwer wieloklientowy? |
|
1 « 2 » |