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

[C++] Proste sieciowe rpg. Złe odbieraniem wiadomości przez recv()

Ostatnio zmodyfikowano 2015-01-07 14:15
Autor Wiadomość
idyzerr
Temat założony przez niniejszego użytkownika
[C++] Proste sieciowe rpg. Złe odbieraniem wiadomości przez recv()
» 2015-01-07 10:44:50
Witam, od jakiegoś czasu piszę sobie sieciowego rpg'a. Problem mam następujący i opiszę go w punktach, będzie przejrzyście.
1. W menu wybieram "2" i przechodzę do tworzenia postaci.
2. Podaje imię, serwer sprawdza czy taka postać już jest, jeśli nie, to tworzy plik z nazwą postaci.
3. Znajdujemy się menu. Chcę znowu stworzyć bohatera więc daje "2". wpisuje nowe imię bohatera, serwer tworzy go i odsyła odpowiednia wiadomość klientowi, czy taka postać już jest czy nie. U mnie jest to "*" jeśli jest, a jak nie ma to "**". I tu jest ten problem. Za pierwszym razem klient odebrał "**" czyli utworzono nowego bohatera, za drugim razem zamiast odebrać "**" odbiera imię bohatera którego wprowadzałem jako pierwszego... jest to dziwna sytuacja dla mnie i nie wiem gdzie jest błąd. Siedzę już dość długo nad tym i nie widzę rozwiązania ; /

SERWER:

C/C++
while( 1 ) {
   
    if( GAME_STATUS == 0 ) {
        memset( inputBuffer, 0, 64 );
        recv( context->clSocket, inputBuffer, 64, 0 );
        cout << "Komenda: " << inputBuffer << endl;
        command = inputBuffer; // LOGGING
       
        if( command == "1" ) {
            memset( inputBuffer, 0, 64 );
            recv( context->clSocket, inputBuffer, 64, 0 );
            characterName = inputBuffer;
            memset( inputBuffer, 0, 64 );
            recv( context->clSocket, inputBuffer, 64, 0 );
            password = inputBuffer;
            cout << "Gracz : " << characterName << " zalogowany :" << password;
        } else if( command == "2" ) { // NEW CHARACTER
            STATUS = true;
            while( STATUS ) {
                char tab[ 64 ];
                memset( tab, 0, 64 );
                memset( inputBuffer, 0, 64 );
                recv( context->clSocket, inputBuffer, 64, 0 );
                characterName = inputBuffer;
                ifstream file;
                string path;
                path = "characters\\" + characterName;
                cout << path << endl;
                file.open( path.c_str() );
                if( file.is_open() ) {
                    testMessage1();
                    file.close();
                    memset( tab, '*', 1 );
                   
                } else {
                    STATUS = false;
                    testMessage2();
                    ofstream characterFile;
                    characterFile.open( path.c_str() );
                    memset( tab, '*', 2 );
                   
                    characterFile.close();
                }
                cout << "\nwysylam" << tab;
                send( context->clSocket, tab, 64, 0 );
            }

KLIENT:

C/C++
while( 1 ) {
    if( GAME_STATUS == 0 ) {
        system( "cls" );
        cout << "jestem w MENU\n" << "recvBuff: " << recvBuff;
        loginScreen();
        memset( sendBuff, 0, 64 );
        cin >> sendBuff;
        command = sendBuff;
       
        if( send( clientSocket, sendBuff, 64, 0 ) < 0 ) {
            cout << "Blad wysylania komendy\n";
        }
       
        if( command == "1" ) { // LOGING
           
            memset( sendBuff, 0, 64 );
            cin >> sendBuff;
            command = sendBuff;
           
            if( send( clientSocket, sendBuff, 64, 0 ) < 0 ) {
                cout << "Blad wysylania komendy\n";
            }
           
            memset( sendBuff, 0, 64 );
            cin >> sendBuff;
            command = sendBuff;
           
            if( send( clientSocket, sendBuff, 64, 0 ) < 0 ) {
                cout << "Blad wysylania komendy\n";
            }
        } else if( command == "2" ) { // NEW CHARACTER
            STATUS = true;
            cout << "jestem w NOWA POSTAC\n";
            while( STATUS ) {
                system( "cls" );
                cout << "recvBuff: " << recvBuff;
                cout << "Podaj imie bohatera: ";
                memset( characterName, 0, 64 );
                cin >> characterName;
                if( send( clientSocket, characterName, 64, 0 ) < 0 ) {
                    cout << "Blad wysylania komendy\n";
                }
               
                recv( clientSocket, recvBuff, 64, 0 );
                recvBuffString = recvBuff;
                memset( recvBuff, 0, 64 );
                system( "pause" );
                if( recvBuffString == "**" ) {
                    testMessage2();
                    cout << recvBuffString << endl;
                    system( "pause" );
                    STATUS = false;
                } else {
                    system( "cls" );
                    testMessage1();
                    cout << recvBuffString << endl;
                    cout << "Taka postac juz istnieje!\n\n";
                    system( "pause" );
                }
            }
P-124379
pekfos
» 2015-01-07 11:22:44
Podaj wyniki działania klienta i serwera
P-124380
darko202
» 2015-01-07 14:15:03
1.
czytając Twój komentarz (duży projekt) i patrząc na kod wydaje mi się że popełniasz podstawowy błąd nie dzieląc kodu na mniejsze jednostki.
Przez Co kod staje się coraz bardziej złożony.

Mam nadzieję, że nie dojdziesz do momentu, który już w życiu u innego programisty  (widziałem procedura/funkcja 4000 linii) i stworzysz mniejsze jednostki programowe.

od kiedy optymalizować - zalecenie - cała procedura/funkcja  powinna zmieścić się na ekranie.    

Dla mnie, aż się prosi abyś rozdzielił :
A. proces komunikacji (klas
B. proces tworzenia komunikatu
C. procesy gry (np. opcja Tworzenia postaci)
D. proces otwierania zamykania pliku


2.
trudno jest odpowiedzieć ponieważ (nie widać deklaracji użytych zmiennych), ale
podejrzany wydało mi się fragment
 memset( sendBuff, 0, 64 );
 cin >> sendBuff;
 command = sendBuff; // jak działa ?
który w wielu miejscach użyłeś

http://www.cplusplus.com​/reference/cstring/memset/
 strcpy(string, "Hello");
 memset( string, '\0', sizeof(string) );

http://www.tutorialspoint.com​/ansi_c/c_memset.htm
  char str[] = "almost every programmer should know memset!";
  memset (str,'-',6);

 w serwer użyłeś  memset( tab, '*', 2 ); czyli 2 przypadek
ale wtedy jeśli użyłeś ww. fragmentu analogicznie dla zmiennej tab
to co stało się w linii podobnej do
command = sendBuff; 
Spróbuj to zdebugować

piszę jeśli bo jakoś trudno się mi odnaleźć w kodzie o czym wspomniałem w p1

w sumie to jest ta sama rada jak @pekfos

P-124391
« 1 »
  Strona 1 z 1