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();
}Aihe on jo aika vanha, joten et voi enää vastata siihen.