Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ : Palvelin ohjelma ?

Sivun loppuun

kpzpt [16.01.2011 16:28:07]

#

Palvelin ohjelma !

Minulla on yhä tämä minun lautapelisivustoni rakenteilla, sivusto on tarkoitus rakentaa Javalla selaimeen.

Minua on moni moittinut Javan käytöstä palvelin ohjelmissani, ja olen nyt sitten harkitsemassa C++ käyttöjä palvelin ohjelmaani.

Tässä olisi linkki jonka olen löytänyt, puuttuuko siintä jotain tärkeätä TCP säätöä, vai voinko jo tämän perusteella rakentaa perus STRING palvelimen, jossa pelata lautapelejä ?

linkki -> http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

Linkissä on multi TCP client-server ohjelma koodia, jota ajattelin käyttää kun rakennan palvelin ohjelmaani, en ihan ole täysin hylännyt Javan käyttöjä, mutta, varmaankin parempi ottaa kattavampi tietotaso palvelinohjelma mahdollisuuksiin.

Kuinka tuon esimerkkien, TCP ja THREAD koodit, ovatko siis riittäviä, jotta voin syöttää sinne STRING käsittely koodit ?

------

Metabolix [16.01.2011 16:31:52]

#

Minusta kukaan ei ole moittinut sinua siitä, että käytät Javaa, vaan siitä, että käytät sitä huonosti. Ja koska saat koodisi solmuun Javallakin, älä missään tapauksessa yritä vaihtaa C++:aan, koska se on monin verroin vaikeampi kieli. Javassa virheestä saa hyvinkin tarkat tiedot; C++:ssa virheestä seuraa ohjelman kaatuminen ilman mitään tietoa virheen sijainnista.

kpzpt [16.01.2011 16:43:56]

#

Öh!

Olen kirjoittanut muutaman ei ihan finished C++ pelin 90 luvun loppu vuosina WATCOM C++ ja muutaman vielä Visual Studio C++ avulla ;)
MSX,C64,AMIGA ja DOS aikoihin tuo jämähtely oli ongelma, ei enää WIN2000 lähtein !

Mutta TCP ja THREAD rutiinit ovat valloittamatta !

Onko tuo linkin esimerkki tarpeeksi kattava palvelin ohjelman liittämiseen, esimerkin koodin ympärille ?
Tai tarkemmin kysyttynä puuttuuko TCP taikka THREAD asetuksista jotain ?

linkki -> http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

-----

Grez [16.01.2011 18:29:42]

#

kpzpt kirjoitti:

MSX,C64,AMIGA ja DOS aikoihin tuo jämähtely oli ongelma, ei enää WIN2000 lähtein !

Ymmärsit nyt hieman väärin mitä Metabolix tarkoitti. Siis kysehän ei ollut suinkaan koko järjestelmän kaatumisesta, joka tosiaan olisi ollut suurempi ongelma mainitsemissasi käyttiksissä ja jopa 9x Windowseissa.

Lihavointi omani:

Metabolix kirjoitti:

Javassa virheestä saa hyvinkin tarkat tiedot; C++:ssa virheestä seuraa ohjelman kaatuminen ilman mitään tietoa virheen sijainnista.

Eli siinä missä Javassa saat poikkeuksen ja stack tracen, niin C++ -ohjelman tapauksessa hyvin usein tulee "Ohjelma on suorittanut laittoman toiminnon ja se lopetetaan" ilmoitus, joka ei välttämättä kerro paljon mitään.

kpzpt [16.01.2011 18:58:25]

#

Vielä kerran kysymys !

Onko tuo linkin esimerkki tarpeeksi kattava palvelin ohjelman liittämiseen, esimerkin koodin ympärille ?
Tai tarkemmin kysyttynä puuttuuko TCP taikka THREAD asetuksista jotain ?

Palvelin ohjelma on vain char[] käsittelyjä, joita siirrellään threadien avulla !

linkki -> http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

Edit. Vielä yksi kysymys, kun tuo yksi funktio on määritelty threadiksi, niin, voiko sieltä kutsua globaali muuttujia pää looppiin, en kuitenkaan tarvitse threadien välistä kommunikointia ?

-----

Metabolix [16.01.2011 19:28:57]

#

kpzpt kirjoitti:

Tai tarkemmin kysyttynä puuttuuko TCP taikka THREAD asetuksista jotain ?

En ymmärrä kysymystä, ja tuskin ymmärtää kukaan muukaan. Millaisia asetuksia haluat sinne, ja mitä sieltä sinusta voisi puuttua?

kpzpt kirjoitti:

Palvelin ohjelma on vain char[] käsittelyjä, joita siirrellään threadien avulla !

Et kai aio suorittaa pelilogiikkaa siinä appletissa? Kai ymmärrät, että jos logiikka on appletissa, pelaajat voivat ehkä huijata hyvinkin helposti?

kpzpt kirjoitti:

voiko sieltä kutsua globaali muuttujia pää looppiin

... mitä voiko? Jos yritit kysyä, voiko säikeessä lukea globaaleja muuttujia, niin vastaus on kyllä. Jos niitä muuttujia on tarkoitus muuttaa, sinun pitää huolehtia synkronoinnista eli lukituksista.

kpzpt [16.01.2011 19:56:06]

#

Ilkeilyä taas !

Et ymmärrä kysymystäni, eikä tuskin kukaan muukaan, no putkassa ollaan, heh !

En omaa tietoa taitoa C++ TCP rutiineihin, enkä C++ THREAD rutiineihin, ovatko nuo asetukset joita tuossa linkissä on, niin, riittäviä siihen että kaikki sitten toimii, vai puuttuuko noista asetuksista vielä jotain jota olisi hyvä asettaa palvelin ohjelmaan, joka käsittelee char[] jonoja joita sitten siirtelee eri THREADeissa asiakkaitten ja palvelimen välillä.

En myöskään rakenna ohjelmaani, missään nimessä, niin typerästi että mahdollisuuksia päällekkäisyyksiin voisi tapahtua, vaikka globaali muuttujia jälleen kerran suosinkin.

------

Kyllä pelilogiikka suoritetaan asiakkaitten appleteissa, en koe että tämä on ongelma, tällä tavalla lähes kaikki netin java sivustot toimivatkin ?
Ainoastaan pelien tallentamisen kohdalla serveriin, täytyy tarkistaa että tallenne on asiallinen, lähinnä tallenteen pituus, joka minulla max. < 1k !

Periaattessahan en koskaan voi saada täyttä varmuutta että tallenne on asiallinen, joku voi editoida applettia ja lähettää tietoa jossa on omia nappuloita lisättynä, eteenkin tulevissa sotalautapeleissäni, tallenteen pituuden pitäminen kurissa on ainoa mitä voi tehdä, suoranaisten koodaus virheitten etsimisen lisäksi pelitallenne paketeista !

Mutta, täytyy vielä miettiä, mahdollisuus että "kriittiset" kohdat ovat palvelimessa on tietenkin minullakin olemassa ;)
Olet siis sitä mieltä että en voi luottaa siihen että kukaan ei kräkkää applettiani, heh !

------

Metabolix [16.01.2011 20:13:26]

#

kpzpt kirjoitti:

Ilkeilyä taas !

Ei ole ilkeilyä vaan ihan tosiasia kysymyksesi tasosta.

"Ajattelin leipoa jotain. Ostin hiivaa, jauhoja ja sokeria, tarvitsenko muuta?" Tähän voi jokainen leivonnasta vähän tietävä todeta, että kyllä noista aineksista voi leipää tehdä muttei kovin hyvin suklaatorttua.

Eli kyllä, jos tuollainen esimerkin palvelinsysteemi on pelillesi sopiva, niin kyllä se sitten riittää. Jos se ei jostain syystä sovi suunnitelmiisi, niin sitten se ei varmaankaan riitä.

kpzpt [16.01.2011 20:16:02]

#

Hmmh!

Ei minun kysymykseni ihan noin huono ollut...

Minä pyrin kirjoittamaan tyhmään sävyyn, olemalla eräänlainen "tyhmä hyvä", kun esitän kysymyksiäni, jos pyrin kirjaamaan älykkääseen ja kehittyneeseen sävyyn, niin, kirjoittelu menee yleensä siihen että alkaa jossain vaiheessa olla loukkaava, ja sitten myöhemmin on huono olla asian takia, minä kirjoitan "tyhmä hyvänä" kun esitän kysymyksiäni netissä, huono olo jää sitten jonkun toisen riesaksi joka säännöllisesti ylittelee muita kirjoittelemalla ?

Eli, TCP ja THREAD kohtien inittejä ja kulkuja ei tarvitse enää säädellä tuosta, kun tarkoitus lisätä char[] jonojen käsittelyjä ympärille, kiitos ?

linkki -> http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

------

groovyb [16.01.2011 21:32:36]

#

Mikset käy vaikka kirjastossa ja opettele asiaa. Ei palvelinsoftia rakennella foorumilla. Foorumilla vastatataan suoriin kysymyksiin, ei opeteta säikeistyksen ja tcp:n alkeita. Ei kenelläkään riitä aika ja mielenkiinto moiseen,ainakin näin voisin uskoa. Lue oppaita, niitä on netti pullollaan. Enkä ymmärtänyt kysymystäsi. Voit taulukoita muokata missä tykkäät.

kpzpt [16.01.2011 21:38:30]

#

Jeh!

Olet oikeassa, mutta, kun tällä hetkellä olen ilman välitöntä mahdollisuutta keskustella kenenkään henkilön kanssa palvelin ohjelmastani kasvotusten, niin, kun nyt sitten on vaihtoehtona että tärisen täällä kotona jonkun opuksen kanssa, taikka sitten kerään netistä muutaman sosiaalisen lauseen palvelun kehittely vaiheeseeni, niin, olen valinnut tämän jälkimmäisen.

Olen jo oppinut käyttämään googlea, mutta, on myös mukava varmistaa henkilökohtaisesti jossain joiltain, se mitä aikoo.

Myöskin, niin, tähän että ei kenelläkään riitä aika ja mielenkiinto moiseen, niin, minulla on suomen ihan ensimmäinen sotalautapelisivusto valmistumassa, koen että tähän projektiin voi ottaa muutaman typerän kysymyksen valmistus prosessiin, jopa näinkin arvostetusta sivustosta mitä ohjelmointiputka on.

Vaihtoehtona että yksin googlailen ja rakennan koko homman, taikka sitten kerään muutaman kysymyksen foorumeilta, vastauksineensa, päätin varmistaa tällä foorumilla nämä kohdat jotka laitan ohjelmiini, niin, palvelimiin, kuin myös itse peleihin.

Myöskin kun olen nyt sitten varmaankin sellainen itsenäinen pelikehittelijä, niin, minulla on omasta mielestäni parempi rakentaa tällä "tyhmä hyvä" sävyllä, nämä kysymykseni, en voi ajatellakkaan että yrittäisin korkealta akateemiselta sävyltä lähteä kysymään palvelun rakenteluja, eihän minulla tuollaista sävyä edes ole ja jos olisi ja käyttäisin niin olisin kyllä aika houkka.

------

Teuro [16.01.2011 22:03:34]

#

kpzpt kirjoitti:

Myöskin kun olen nyt sitten varmaankin sellainen itsenäinen pelikehittelijä, niin, minulla on omasta mielestäni parempi rakentaa tällä "tyhmä hyvä" sävyllä, nämä kysymykseni, en voi ajatellakkaan että yrittäisin korkealta akateemiselta sävyltä lähteä kysymään palvelun rakenteluja, eihän minulla tuollaista sävyä edes ole ja jos olisi ja käyttäisin niin olisin kyllä aika houkka.

Tarkoittaako yllä oleva lainaus sitä, että olet kykenevä tekemään parempia kysymyksia, mutta tahallasi teet hankalasti ymmärrettäviä ja aloittelijamaisia kysymyksiä? Tällaisessa lähestymistavassa en näe sinulle tulevan mitääb hyötyä, joten voit varmasti kysyä aivan sillä tasolla, jolla olet nyt.

kpzpt [16.01.2011 22:13:14]

#

Edelliseen !

Olen netti aloittelija, aloitin foorumeilla joskus 2005, ja nyt vasta kirjoittelen ensimmäisiä pitkiä keskusteluja, olen myös ilman mitään koulupohjaa, olen tehdas ja varasto ja kauppa työntekijä, jätin kauppaoppilaitoksen, aikuislukion ja AmiEdun kesken aikanaan, nyt olen rakentamassa pelipalvelua peleilleni.

Olen kirjoitus alkeissani vaikka syntynyt 70 luvulla, en osaa rakentaa aivan niin laadukasta äidinkieltä, mitä useimmat täälläkin, myöskin tämä peliohjelmointi on haastava aihe esittää kysymyksiä ja rutinoituneet hieman hymähtävätkin tälläisiä lauseita ja asian esitys tapoja joita minulla vielä on, mutta, luotan että kehityn kunhan foormuilen, olen asiastani varma.

------

Grez [16.01.2011 22:28:09]

#

kpzpt kirjoitti:

en osaa rakentaa aivan niin laadukasta äidinkieltä

Mielestäni olennaisempaa olisikin miettiä tuleeko asia selväksi ja kysymys tai kommentti ymmärretyksi, kuin että onko se äidinkielellisesti laadukasta.

kpzpt [16.01.2011 22:36:42]

#

Jeh !

Minä panostan kysymyksieni laatuun ja selkeyteen enemmän vastaisuudessa ja tulevissa kysymyksissä, mutta, ilmeisesti sitten tuo esimerkkini, joka on kovin samankaltainen myös muitten löytämieni tutoriaalien kanssa, on ihan kelpo TCP multi client-server koodi, koetan ensi viikolla rakentaa Java koodin rinnalle myös pienen C++ koodin , kiitos !

------

groovyb [16.01.2011 23:23:09]

#

ei sun itseesi tarvitse näitä asioita ottaa. Mutta ei koodaaminen ole koodinpätkien copypastettamista. Sun pitäisi opetella nuo asiat. Jos otat vaan koodin pätkiä säikeistämisestä ja ynnäät ne sun globaaleihin muuttujiin, voin olla lähes varma että pääset deadlockien ja muiden säikeistämiseen liittyvien ongelmien pariin tietämättä mistä on kyse..

Opettele säikeistäminen tutoriaaleista, sen jälkeen siirry tcp puoleen. Hyviä oppaita on paljon, jossa asiat opetetaan. Sen jälkeen voit käyttää oppimaasi hyödyksi. Copy pastella et pääse kuin tasolle n, jonka jälkeen eteenpäin pääseminen voi olla yllättävän hankalaa koska et ole itse suunnittelut softaasi mukautumaan siihen mitä sen oikeasti pitäisi tehdä.

Cornix [16.01.2011 23:23:17]

#

kpzpt kirjoitti:

Jeh !
- - ihan kelpo TCP multi client-server koodi, koetan ensi viikolla rakentaa Java koodin rinnalle myös pienen C++ koodin , kiitos !

Minäkin suosittelisin ennemmin kirjoittamaan palvelimenkin sillä Javalla, mikäli sen ajaminen vain palvelinkoneella on mahdollista. Kuten ketjussa aiemmin mainittiin ongelmana ei ole itse kieli, vaan se, kuinka sitä käyttää. C++:n kanssa on harrastelijapohjalta vain helpompi tyriä homma.

Lue siis Javalla toteutettujen TCP-palvelimien lähdekoodia. On parempi matkia niitä kuin käyttää aikaa pyörän uudelleenkeksimiseen.

edit: ...Ja on parempi tosiaan sisäistää se itse asia kuin vain sokeasti kopioida muiden esimerkkejä.

jalski [17.01.2011 18:39:45]

#

Itsekään en lähtisi ensimmäisenä ohjelmointikieltä vaihtamaan. Javalla tuo on varmaan joustavampi ja helpompi toteuttaa muutenkin.

Tuon laittamasi linkin kaltainen Client/Server esimerkki on helppo ja melko samanlainen toteuttaa melkein millä ohjelmointikielellä tahansa. Oikeat ongelma kohdat todennäköisesti kuitenkin tulevat olemaan tietojen hallinnassa sekä välityksessä useamman asiakkaan ja palvelinohjelman välillä.

Pelisi ovat varmaankin vuoropohjaisia kaksin pelejä? Oletko jo ratkaissut miten toteutat pelaajien parituksen ja miten palvelinohjelma hoitaa pelisiirtojen ja tapahtumien välityksen pelaajien välillä?

Ajattelin pitkästä aikaa virkistää muistiani ja toteuttaa seuraavaksi jotain Infernolle Limbolla. Ajatuksena oli joku yksinkertainen verkkopeli, kuten kahden pelaajan laivan upotus. Teen tuohon yksinkertaisen serverin, mikä toimii välittäjänä kahden asiakkaan eli pelaajan välillä.

kpzpt [17.01.2011 20:08:51]

#

Java sittenkin !

Hienoa että joku oli Javan kannalla, olen itsekkin sitä mieltä että Javan kanssa palvelin ohjelman rakentaminen on todella helpompaa, Java on selkeä ja helppo seurata, niin kirjoittaessa koodia kuin myös mahdollisia virhekohtia etsiessä.

On se tietenkin runsain mitoin hitaampaa, kuten myös moni on jo maininnutkin, kun siinä on kaikkia yli lyönti tarkistuksia, myöskin Java float laskut taitavat olla nopeampia mitä int laskut ?

----

@jalski
Minulla on tarkoitus rakentaa sotalautapelejä, joita olen suunnitellut MSX vuosistani lähtein, jostain 1987, aina viime vuosiin.

Ensimmäisenä rakennan WW2 sotalautapelisarjan jonka suunnittelin PC DOS 5.0 kera, Turbo Pascalissa ensin, joskus 1990-93, peli on LIVE peli kahden pelaajan välillä, mahdollisesti myöhemmin kunhan kaikki kohdat koodista on turvallisesti selkärangassa, niin, vielä 4 ja 6 ja 8 pelaajan mega peli skenaarioita.

Pelisarja on tarkoitus julkaista kokonaan ennen heinäkuuta, ja ekat demot maaliskuussa.

Peli kulkee eräänlaisessa filmissä jonne sitten vain lisätään pelaajien tekemät siirrot, ruudun päivitys lukee kohtia tästä filmistä jonka sitten voi pelin jälkeen tallentaa kokonaan palvelimeen, myöskin pelit voi tallentaa "kesken" "filmin", rakennan kaikki pelini tämän kaltaiseen filmiin, jota sitten voi käsitellä myöhemminkin.

Minullakin on LaivanUpotus rakenteilla, rakennan sen samantyylin mukaan mitä nuo muutkin pelidemot mitä minulla jo on graafisena Appletissani -> http://temp4322.dy.fi/PeliAppletti.html

------

jalski [18.01.2011 12:11:45]

#

kpzpt kirjoitti:

Peli kulkee eräänlaisessa filmissä jonne sitten vain lisätään pelaajien tekemät siirrot, ruudun päivitys lukee kohtia tästä filmistä jonka sitten voi pelin jälkeen tallentaa kokonaan palvelimeen, myöskin pelit voi tallentaa "kesken" "filmin", rakennan kaikki pelini tämän kaltaiseen filmiin, jota sitten voi käsitellä myöhemminkin.

Itse ajattelin toteuttaa laivan upotuksen serverin Limbolla seuraavasti:

- synkronointiin ja tiedonvälitykseen säikeiden välillä käytetään kanavia, muita varsinaisia lukituksia ei tarvita.

- pelivuorojen jako ja peli tarkistukset toteutetaan kanavien ja perinteisen lambda-muuttujan yhdistelmällä.

eli, lambda muuttujahan toimii siten, että se voi saada arvon 1 tai -1, riippuen siitä kumman pelaajan vuoro on kyseessä. Kun pelilaudalla (taulukossa) tyhjä peliruutu merkitään 0:lla, ensimmäinen pelaaja 1:llä ja toinen pelaaja -1:llä, niin pitäisi olla selvää miten tätä voi hyödyntää: riippumatta siitä, kumman pelaajan vuoro on kyseessä, niin on helppo selvittää onko pelinappula vuorossa olevan pelaajan. Eli, kun kerrotaan pelinappulan arvo lambdalla ja tuloksen ollessa positiivinen on pelinappula vuorossa olevan pelaajan, jos taas tulos on negatiivinen niin kyseessä on vastustajan pelinappula.

Pelikomennot ovat yksinkertaisia merkkijonoja, esim.

"bye" lähtee managerin komentokanavaan, kun asiakas sulkee yhteyden.

pelisiirtoviesti on muotoa: "M x y"
nimen asetusviesti: "N nimi"


SERVERI:

pääohjelma (init):

- hoitaa kehitysvaiheessa debug-tiedon tulostamisen (viestit ja tapahtumat) graafiseen Tk-ikkunaan.

- käynnistää listenthreadin taustalle kuuntelemaan yhteydenottoja

- käynnistää managerthreadin taustalle hoitamaan kaiken pelitapahtumien välityksen ja kirjanpidon.


listenthread:

- kuuntelee yhteydenottoja, hyväksyy kaksi yhtäaikaista yhteyttä kerrallaan.

- käynnistää workerthreadin palvelemaan asiakasta.


workerthread:

- vastaanottaa dataa taustalla

- Yksinkertainen parseri, millä vastaanotetusta datasta selvitetään komento.

- saatu komento lähetetään edelleen managerthreadille käsiteltäväksi.


managerthread:

- hoitaa kaiken kirjanpidon, pelisiirtojen ja tapahtumien välityksen asiakkaille.


Sivun alkuun

Vastaus

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

Tietoa sivustosta