Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Keskusteluohjelma SDL_Net:llä

Resiina [28.06.2007 22:09:10]

#

Olen tässä yrittänyt koodata jonkinlaista kahden hengen välistä keskusteluohjelmaa, jossa käytetään SDL_Net:iä. Ongelmana on vain enää se, että en tiedä tarkalleen kuinka noita socketteja ja muita verkkoon liittyviä juttuja käytetään.

Kun kutsutaan funktiota SDLNet_TCP_Recv(socket, data, 1024), niin kopioiko se socketin sisällön dataan vai siirtää?


Tässä nyt sitten koko homman koodi:

if (tapahtuma.key.keysym.sym == SDLK_b) // painetaan päävalikossa B:tä, jolloin siirrytään ResiChatiin
{
      SDL_WM_SetCaption("Turhat Softat 2.9 :: ResiChat", NULL);
      SDL_EnableUNICODE(SDL_ENABLE);
      SDLNet_Init();
      IPaddress ip;
      TCPsocket socket;
      TCPsocket srv_socket; // joku tämmönenki kuulemma pitäisi olla jos itse toimii palvelimena
      string input = " ";
      char data[1024] = { 0 };
      string nick;
      bool painettu = false;
      vector<string> chat; // koko keskustelu
      vector<string> toisen_tekstit; // toisen osapuolen lähettämät tekstit
      SDL_Surface *txt = NULL; // tällä sitten tulostetaan keskustelu näytölle

      SDL_FreeSurface(teksti[1]);
      teksti[1] = TTF_RenderText_Solid(fontti, "Syötä haluamasi nimimerkki", TekstiVari);

      while (true)
      {
            LoopAlku(); // SDL_PollEvent, SDL_GetMouseState, piirretään tausta jne.
            if (tapahtuma.type == SDL_KEYDOWN)
            {
                 painettu = true;
                 if (tapahtuma.key.keysym.unicode == (Uint16)' ')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'0' && tapahtuma.key.keysym.unicode <= (Uint16)'9')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'A' && tapahtuma.key.keysym.unicode <= (Uint16)'Z')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'a' && tapahtuma.key.keysym.unicode <= (Uint16)'z')
                      input += (char)tapahtuma.key.keysym.unicode;
                 if (tapahtuma.key.keysym.sym == SDLK_PERIOD)
                      input += ".";
                 if (tapahtuma.key.keysym.sym == SDLK_MINUS)
                      input += "-";
                 if (tapahtuma.key.keysym.sym == SDLK_BACKSPACE && input.length() > 1)
                      input.erase(input.length() - 1);
                 if (tapahtuma.key.keysym.sym == SDLK_RETURN && input.length() > 1)
                 {
                      input = lyhennamerkkijonoaalusta(input, 1);
                      nick = input;
                      input = " ";
                      break;
                 }
            }
            else if (tapahtuma.type == SDL_KEYUP)
                 painettu = false;
            SDL_FreeSurface(teksti[0]);
            teksti[0] = TTF_RenderText_Solid(fontti, input.c_str(), TekstiVari2);
            PiirraKuva(teksti[0], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-5);
            PiirraKuva(teksti[1], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-10-teksti[1]->h);
            if (napit & SDL_BUTTON(1) && HiiriYlla(2, KUVA_KORKEUS-40, lopetusnappi))
            {
                 SDL_Delay(200);
                 goto loppu;
            }
            PiirraKuva(lopetusnappi, naytto, 2, KUVA_KORKEUS-40);
            LoopLoppu(1); // SDL_Flip(naytto) jne.
            if (painettu) SDL_Delay(100);
      }
      SDL_FreeSurface(teksti[1]);
      teksti[1] = TTF_RenderText_Solid(fontti, "Syötä IP, johon haluat yhdistää (F1 = toimi palvelimena)", TekstiVari);
      while (true)
      {
            LoopAlku();
            if (tapahtuma.type == SDL_KEYDOWN)
            {
                 painettu = true;
                 if (tapahtuma.key.keysym.unicode == (Uint16)' ')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'0' && tapahtuma.key.keysym.unicode <= (Uint16)'9')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'A' && tapahtuma.key.keysym.unicode <= (Uint16)'Z')
                      input += (char)tapahtuma.key.keysym.unicode;
                 else if (tapahtuma.key.keysym.unicode >= (Uint16)'a' && tapahtuma.key.keysym.unicode <= (Uint16)'z')
                      input += (char)tapahtuma.key.keysym.unicode;
                 if (tapahtuma.key.keysym.sym == SDLK_PERIOD)
                      input += ".";
                 if (tapahtuma.key.keysym.sym == SDLK_MINUS)
                      input += "-";
                 if (tapahtuma.key.keysym.sym == SDLK_BACKSPACE && input.length() > 1)
                      input.erase(input.length() - 1);
                 if (tapahtuma.key.keysym.sym == SDLK_RETURN && input.length() > 1)
                 {
                      input = lyhennamerkkijonoaalusta(input, 1);
                      if (SDLNet_ResolveHost(&ip, input.c_str(), 4321) == -1 || SDLNet_TCP_Open(&ip) == NULL)
                          input = " Yhteyden muodostaminen epäonnistui";
                      else
                      {
                          socket = SDLNet_TCP_Accept(SDLNet_TCP_Open(&ip));
                          input = " ";
                          break;
                      }
                 }
                 if (tapahtuma.key.keysym.sym == SDLK_F1)
                 {
                      kirjoitaA("log.txt", "* Keskustelu aloitettu: server *\n\n");
                      SDL_WM_SetCaption("Turhat Softat 2.9 :: ResiChat \\ Toimitaan palvelimena", NULL);
                      SDLNet_ResolveHost(&ip, NULL, 4321);
                      socket = SDLNet_TCP_Open(&ip);
                      input = " ";
                      while (true)
                      {
                            LoopAlku();
                            SDLNet_TCP_Recv(socket, data, 1024); // socket tyhjenee, kun sieltä otetaan dataa?
                            if (string(data) != toisen_tekstit[toisen_tekstit.size()-1]) // jos ei tyhjene niin tämä on sen varalta, tosin ohjelma kaatuu kun tätä käyttää
                            {
                                chat.push_back(string(data));
                                toisen_tekstit.push_back(string(data));
                                kirjoitaA("log.txt", string((string)data+"\n").c_str());
                            }
                            if (tapahtuma.type == SDL_KEYDOWN)
                            {
                                painettu = true;
                                if (tapahtuma.key.keysym.unicode == (Uint16)' ')
                                   input += (char)tapahtuma.key.keysym.unicode;
                                else if (tapahtuma.key.keysym.unicode >= (Uint16)'0' && tapahtuma.key.keysym.unicode <= (Uint16)'9')
                                   input += (char)tapahtuma.key.keysym.unicode;
                                else if (tapahtuma.key.keysym.unicode >= (Uint16)'A' && tapahtuma.key.keysym.unicode <= (Uint16)'Z')
                                   input += (char)tapahtuma.key.keysym.unicode;
                                else if (tapahtuma.key.keysym.unicode >= (Uint16)'a' && tapahtuma.key.keysym.unicode <= (Uint16)'z')
                                   input += (char)tapahtuma.key.keysym.unicode;
                                if (tapahtuma.key.keysym.sym == SDLK_PERIOD)
                                   input += ".";
                                if (tapahtuma.key.keysym.sym == SDLK_MINUS)
                                   input += "-";
                                if (tapahtuma.key.keysym.sym == SDLK_BACKSPACE && input.length() > 1)
                                   input.erase(input.length() - 1);
                                if (tapahtuma.key.keysym.sym == SDLK_RETURN && input.length() > 1)
                                {
                                   input = lyhennamerkkijonoaalusta(input, 1);
                                   SDLNet_TCP_Send(socket, string("<"+nick+"> "+input).c_str(), nick.length()+input.length()+1); // lähetetään data. onko tämäkään oikein?
                                   chat.push_back("<"+nick+"> "+input);
                                   kirjoitaA("log.txt", string("<"+nick+"> "+input+"\n").c_str());
                                   input = " ";
                                }
                            }
                            else if (tapahtuma.type == SDL_KEYUP)
                                painettu = false;
                            SDL_FreeSurface(teksti[0]);
                            teksti[0] = TTF_RenderText_Solid(fontti, input.c_str(), TekstiVari2);
                            PiirraKuva(teksti[0], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-5);
                            for (int ind = chat.size()-1, h = KUVA_KORKEUS-lopetusnappi->h-teksti[0]->h-15; ind > -1; ind--, h -= teksti[0]->h/2) // piirretään koko keskustelu ruudulle
                            {
                                SDL_FreeSurface(txt);
                                txt = TTF_RenderText_Solid(fontti, chat[ind].c_str(), TekstiVari);
                                PiirraKuva(txt, naytto, 10, h);
                            }
                            if (napit & SDL_BUTTON(1) && HiiriYlla(2, KUVA_KORKEUS-40, lopetusnappi))
                            {
                                kirjoitaA("log.txt", "\n* Keskustelu lopetettu *\n");
                                SDL_Delay(200);
                                goto loppu;
                            }
                            PiirraKuva(lopetusnappi, naytto, 2, KUVA_KORKEUS-40);
                            LoopLoppu(1);
                            if (painettu) SDL_Delay(100);
                      }
                 }
            }
            else if (tapahtuma.type == SDL_KEYUP)
               painettu = false;
            SDL_FreeSurface(teksti[0]);
            teksti[0] = TTF_RenderText_Solid(fontti, input.c_str(), TekstiVari2);
            PiirraKuva(teksti[0], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-5);
            PiirraKuva(teksti[1], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-10-teksti[1]->h);
            if (napit & SDL_BUTTON(1) && HiiriYlla(2, KUVA_KORKEUS-40, lopetusnappi))
            {
               SDL_Delay(200);
               goto loppu;
            }
            PiirraKuva(lopetusnappi, naytto, 2, KUVA_KORKEUS-40);
            LoopLoppu(1);
            if (painettu) SDL_Delay(100);
      }
      SDL_WM_SetCaption("Turhat Softat 2.9 :: ResiChat \\ Yhteydessä palvelimeen", NULL);
      kirjoitaA("log.txt", "* Keskustelu aloitettu: client *\n\n");
      while (true)
      {
            LoopAlku();
            SDLNet_TCP_Recv(socket, data, 1024);
            if (string(data) != toisen_tekstit[chat.size()-1])
            {
               chat.push_back(string(data));
               toisen_tekstit.push_back(string(data));
               kirjoitaA("log.txt", string((string)data+"\n").c_str());
            }
            if (tapahtuma.type == SDL_KEYDOWN)
            {
               painettu = true;
               if (tapahtuma.key.keysym.unicode == (Uint16)' ')
                  input += (char)tapahtuma.key.keysym.unicode;
               else if (tapahtuma.key.keysym.unicode >= (Uint16)'0' && tapahtuma.key.keysym.unicode <= (Uint16)'9')
                  input += (char)tapahtuma.key.keysym.unicode;
               else if (tapahtuma.key.keysym.unicode >= (Uint16)'A' && tapahtuma.key.keysym.unicode <= (Uint16)'Z')
                  input += (char)tapahtuma.key.keysym.unicode;
               else if (tapahtuma.key.keysym.unicode >= (Uint16)'a' && tapahtuma.key.keysym.unicode <= (Uint16)'z')
                  input += (char)tapahtuma.key.keysym.unicode;
               if (tapahtuma.key.keysym.sym == SDLK_PERIOD)
                  input += ".";
               if (tapahtuma.key.keysym.sym == SDLK_MINUS)
                  input += "-";
               if (tapahtuma.key.keysym.sym == SDLK_BACKSPACE && input.length() > 1)
                  input.erase(input.length() - 1);
               if (tapahtuma.key.keysym.sym == SDLK_RETURN && input.length() > 1)
               {
                  input = lyhennamerkkijonoaalusta(input, 1);
                  SDLNet_TCP_Send(socket, string("<"+nick+"> "+input).c_str(), nick.length()+input.length()+1); // lähetetään data. onko tämäkään oikein?
                  chat.push_back("<"+nick+"> "+input);
                  kirjoitaA("log.txt", string("<"+nick+"> "+input+"\n").c_str());
                  input = " ";
               }
            }
            else if (tapahtuma.type == SDL_KEYUP)
               painettu = false;
            SDL_FreeSurface(teksti[0]);
            teksti[0] = TTF_RenderText_Solid(fontti, input.c_str(), TekstiVari);
            PiirraKuva(teksti[0], naytto, lopetusnappi->w+5, KUVA_KORKEUS-teksti[0]->h-5);
            for (int ind = chat.size()-1, h = KUVA_KORKEUS-lopetusnappi->h-teksti[0]->h-15; ind > -1; ind--, h -= teksti[0]->h/2) // piirretään koko keskustelu ruudulle
            {
               SDL_FreeSurface(txt);
               txt = TTF_RenderText_Solid(fontti, chat[ind].c_str(), TekstiVari);
               PiirraKuva(txt, naytto, 10, h);
            }
            if (napit & SDL_BUTTON(1) && HiiriYlla(2, KUVA_KORKEUS-40, lopetusnappi))
            {
               kirjoitaA("log.txt", "\n* Keskustelu lopetettu *\n");
               SDL_Delay(200);
               break;
            }
            PiirraKuva(lopetusnappi, naytto, 2, KUVA_KORKEUS-40);
            LoopLoppu(1);
            if (painettu) SDL_Delay(100);
      }
      loppu:
      SDL_FreeSurface(txt);
      SDLNet_TCP_Close(socket);
      SDLNet_TCP_Close(srv_socket);
      SDL_EnableUNICODE(SDL_DISABLE);
      SDLNet_Quit();
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta