Page 6 of 8

Re: CoolBasic & netti = cbNetwork

Posted: Mon Sep 06, 2010 1:18 pm
by pikkuleipä
Kun otan clientillä yhteyden osoiteeseen "localhost": se onnistuu,
mutta jos osiote onkin IP: se ei toimi! Kiitos.

Re: CoolBasic & netti = cbNetwork

Posted: Mon Sep 06, 2010 3:02 pm
by esa94
pikkuleipä wrote:Kun otan clientillä yhteyden osoiteeseen "localhost": se onnistuu,
mutta jos osiote onkin IP: se ei toimi! Kiitos.
Ehkä ko. osoitteessa ei ole kuuntelevaa socketia auki?

Re: CoolBasic & netti = cbNetwork

Posted: Mon Sep 06, 2010 3:04 pm
by valscion
pikkuleipä wrote:Kun otan clientillä yhteyden osoiteeseen "localhost": se onnistuu,
mutta jos osiote onkin IP: se ei toimi! Kiitos.
Mitä luultavimmin palomuuri tai NAT-päällä oleva reititin aiheuttaa ongelman. Sinun tulee avata palomuuristasi tarpeellinen portti ohjelmasi toimimista varten ja mahdollisesti reitittää siitä reitittimestäsi kyseinen portti omalle koneellesi myös. Mutta millaistas virhettä sieltä tulee? Muistithan että palvelimen tulee olla auki ennen kuin siihen voi yhdistää?

Ja niin, jotta voisit tarkistaa oletko NATin takana, niin kerro meille minkä IP:n takana koneesi on. Seuraa näitä ohjeita:
  1. Paina Windows-näppäintä + R tai mene Käynnistä -> suorita.
  2. Kirjoita siihen "Suorita..." (tai "Run" jos englanniksi) ikkunaan cmd
  3. Kirjoita avautuvaan komentoriviin komento ipconfig. Se näyttää sinun internet-yhteytesi tiedot.
  4. Etsi sieltä kohta IP-osoite ja kerro meille mikä numerosarja sen perässä on. Siinä voi myös lukea IPv4-osoite.
Jos osoite on muotoa 192.168.jotain.jotain niin sinulla on NAT päällä. Tällöin kannattaa mennä tänne: http://portforward.com ja seurata ohjeita.

EDIT: Itse olen joskus pienenä nappulana saanut portit ohjattua käyttämällä tätä ohjetta Blockland-nimiseen peliin. Vaihdat vain portin oikeaksi, niin saman ohjeen tulisi toimia sinun ohjelmallasikin.

Re: CoolBasic & netti = cbNetwork

Posted: Thu Nov 11, 2010 10:47 pm
by Sami345
VesQ wrote:Jos osoite on muotoa 192.168.jotain.jotain niin sinulla on NAT päällä.
Tämä riippuu reitittimestä. Esimerkiksi minun reitittimessä lähiverkon osoitteet ovat 10.0.0.x.

Re: CoolBasic & netti = cbNetwork

Posted: Thu Jan 27, 2011 7:37 pm
by mika132
Eli yritin tehdä lukijaa joka lukee tietoa sivustani, mutta tämä nykyinen koodi antaa virheen ja se menee näin:

Code: Select all

Include "cbNetwork.cb"
FrameLimit 40
rtn = HTTPGet("http://pelila.com/racer_versio.txt")
this$ = _Net_GetString()
HTTPSaveContent("tmp.html")
AddText "Löytyi: " +this
DeleteFile "tmp.html"
DrawScreen
WaitKey

Errori on PeekByte failed

Re: CoolBasic & netti = cbNetwork

Posted: Thu Jan 27, 2011 7:41 pm
by Viltzu
mika132 wrote:Eli yritin tehdä lukijaa joka lukee tietoa sivustani, mutta tämä nykyinen koodi antaa virheen ja se menee näin:

Code: Select all

Include "cbNetwork.cb"
FrameLimit 40
rtn = HTTPGet("http://pelila.com/racer_versio.txt")
this$ = _Net_GetString()
HTTPSaveContent("tmp.html")
AddText "Löytyi: " +this
DeleteFile "tmp.html"
DrawScreen
WaitKey

Errori on PeekByte failed
http://vesq.org/filestorage/cbkk/GetHTTPString.CB (btw, tää on kolmas kerta ku sulle tuo linkki annetaa)
Käskinkö lukea ekan postin? Ja erityisesti sen kohdan missä puhutaan tutosta. Tarkoitin että lue se tutokin!

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 9:25 pm
by Viltzu
Ajattelinpa kertoa hieman miten on turvallista lähettää esimerkiksi pelistä pisteet nettilistaan.
Asian ydin on tietenkin hashaus. Bagardin koodaama MD5-funktio käy tähän tarkoitukseen hyvin. PHP:n puolella on sitten valmis funktio MD5:n luomiseen.

Tämä on yksinkertainen tapa saada pisteiden lähetys turvallisemmaksi ja vaikeammaksi huijata vääriä pisteitä.
Otetaan esimerkiksi, että CoolGuy sai 1337 pistettä pelissäsi, kun pisteet aiotaan lähettää nettiin laitamme mukaan vaikka nimestä ja pisteistä muodostetun MD5-hashin. Eli PHP vastaanottaisi 3 arvoa. Nimi, pisteet sekä hash.

Sovitaan, että nimi on asetettu muuttujaan Name$ sekä pisteet muuttujaan Points.
Käytetään Bagardin koodaamaa funktiota:

Code: Select all

Hash$ = MD5(Name$+Points) 
tämä loisi MD5:n merkkijonosta "CoolGuy1337".
Sitten lähetämme tiedot HTTPGetillä PHP:lle:

Code: Select all

HTTPGet("http://jea.com/pisteet.php?nimi="+Name$+"&pisteet="+Points+"&hash="+Hash$)
Tämä ei kuitenkaan ole vielä kovinkaan turvallinen, koska pelaaja voi helposti itse luoda hashin nimestään ja pisteistään ja selaimella tehdä tuon saman mitä me teemme nyt HTTPGetillä.
Jotta tuo ei onnistuisi niin helposti, voimme lisätä vielä hashattavaan merkkijonoon jotain merkkejä. Esimerksiksi

Code: Select all

Hash$ = MD5(Name$+Points+"qwe123")
Tämä riittänee ihan hyvin, mutta voit keksiä itse lisää säätöä. (Sisäkkäiset komennot voivat vaikeuttaa exen sörkkimistä.)


Mitä meidän pitää tehdä php:ssä, on hashata nimi+pisteet+salainen merkkijono ja tarkistaa sopiiko se CB:n puolella hashattuun.
Eli käytämme yksinkertaisesti $_GET:iä poimimaan kyseiset asiat.

Code: Select all

$hash = md5($_GET[nimi].$_GET[pisteet]."qwe123");
Jonka jälkeen vain tarkistamme onko hashit samat. (eli jos $hash == $_GET[hash])

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 9:59 pm
by TheDuck
Tämähän kaikki sitten lopulta murskaantuu kun killedwhale decompilee ohjelmasi ja tarkistaa hashin :P

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 10:04 pm
by DJ-Filbe
TheDuck wrote:Tämähän kaikki sitten lopulta murskaantuu kun killedwhale decompilee ohjelmasi ja tarkistaa hashin :P
Niin kuin kaikki muutkin cb-ohjelmat...

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 10:20 pm
by legend
TheDuck wrote:Tämähän kaikki sitten lopulta murskaantuu kun killedwhale decompilee ohjelmasi ja tarkistaa hashin :P
Hä, onko cb:stä decompleri??

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 11:25 pm
by Koodiapina
On.

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 05, 2011 11:51 pm
by Awaclus
Juu, decompiler löytyy. Sen on tehnyt KilledWhale eikä KW ole sitä afaik kenellekään missään vaiheessa jakanut.

Re: CoolBasic & netti = cbNetwork

Posted: Sun Feb 06, 2011 8:18 am
by DJ-Filbe
legend wrote:
TheDuck wrote:Tämähän kaikki sitten lopulta murskaantuu kun killedwhale decompilee ohjelmasi ja tarkistaa hashin :P
Hä, onko cb:stä decompleri??
Jep, KW on joskus sellaisen tehnyt.

Re: CoolBasic & netti = cbNetwork

Posted: Sun Feb 06, 2011 12:41 pm
by valscion
DJ-Filbe wrote:
legend wrote:
TheDuck wrote:Tämähän kaikki sitten lopulta murskaantuu kun killedwhale decompilee ohjelmasi ja tarkistaa hashin :P
Hä, onko cb:stä decompleri??
Jep, KW on joskus sellaisen tehnyt.
Niin on, mutta pyytäisin että silti pysyttäisiin aiheessa. KW ei kyllä jakele muiden ohjelmien koodeja ja jos hän käyttää decompileriaan, niin usein hän tekee sen vain huvikseen. Ei KW kuitenkaan nyt mikään ilkimys ole ja ala jakelemaan sitä salaista merkkijonoa kaikille muille - eli ihan huoleti voitte tehdä niitä ennätysilistoja nettiin Viltzun ohjeiden mukaan. Ei KW siitä mitään hyödy, jos katsoo sen salaisen merkkijonon, ei hän kuitenkaan mikään lapsellinen trolli/vandaali ole.

Re: CoolBasic & netti = cbNetwork

Posted: Sun May 08, 2011 8:28 pm
by Noun
Tervehdys, iloiset veikot.

Yritän virittää kasaan jonkinlaista monen pelaajan avaruusräiskintää. Clientin 1 alus lentelee servun ikkunassa oikein nätisti, mutta kun client 2 yhdistää, tämän alus vain möllöttää paikallaan. En keksi miten tämän voisi korjata, vika on kuitenkin varmaan tuossa servun koodin riviltä 37 lähtien olevassa pätkässä. Jelppiä?

Kippasin koodit ja kuvat liitteeksi. Kiitos jo etukäteen. :D

Re: CoolBasic & netti = cbNetwork

Posted: Sun May 08, 2011 11:24 pm
by valscion
Jepjep. Vähän jännät sisentelyt sulla, kieltämättä, teki bugin ettimisestä vähän hankalampaa. Löysinpä kuitenkin, vika oli siinä että käytit funktiota _Net_GetInt() palvelimen For...Each loopissa joka kierroksella. Tässä korjattu versio:

Code: Select all

Include "cbNetwork.cb"

SetWindow "Servuke"

SAFEEXIT OFF

Include "Globals.cb"

    rtn = InitServer( UDP_PORT, 100 )

    If rtn <> 0 Then MakeError GetNetErrorString( rtn )
    SetWindow "Servuke - Startannut onnellisesti"

Repeat
        rtn = ServerRead()
        
        If rtn = 0 Then
            'Koko veks
            _Net_GetInt()
            infoByte = _Net_GetByte()
            
            If infoByte = INFO_STARTING_CONNECTION Then
                SetWindow "Servuke - Client yhdisti"
                alus.ALUUT=New(ALUUT)
                alus\id=_Net_GetInt()
                alus\obj=LoadObject("alus1.png",180) 'Serveri näyttää alukset havainnollistavista syistä. Ei tule lopulliseen.
                clients+1
                _Net_InitMemBlock()
                _Net_PutByte( infoByte )
            ElseIf infoByte = INFO_CLOSING_CONNECTION Then
                SetWindow "Servuke - Client katkaisi"
                clients-1
                _Net_InitMemBlock()
                _Net_PutByte( infoByte )
            ElseIf infoByte = INFO_SEND_INFO Then
                aluskontrollissa=_Net_GetInt() // <--------------------- Tämä oli sinulla alemman For...Each loopin SISÄLLÄ, kun sen tietenkin täytyy olla ulkopuolella.
                For alus.ALUUT=Each ALUUT
                    If aluskontrollissa=alus\id Then
                        alus\x=_Net_GetInt()
                        alus\y=_Net_GetInt()
                        alus\angle=_Net_GetInt()
                        Exit
                    EndIf 
                Next alus
                _Net_InitMemBlock()
                _Net_PutByte( infoByte )
                For alus.ALUUT=Each ALUUT
                _Net_PutInt(alus\x)
                _Net_PutInt(alus\y)
                _Net_PutInt(alus\angle)
                Next alus
            EndIf
            
            For alus.aluut=Each aluut
                PositionObject alus\obj,alus\x,alus\y
                RotateObject alus\obj,alus\angle
            Next alus

            ServerSend()
                
         EndIf

            Text 10,10,"Clients: "+clients
            For alus.ALUUT=Each ALUUT 'Epäkäytännöllistä kuonaa
            Text 10,20,"X: "+alus\x
            Next alus
            Text 10,40,"FPS: "+FPS()
            DrawScreen
Until EscapeKey()
While EscapeKey() : Wend
CloseServer()
Pikku vinkkinä voisin sanoa sen, että sinun EI tarvitse tehdä jollain rand-funktion avulla omaa ID:tä. Käytä cbNetworkin sisäistä ID:tä erottamaan clientit toisistaan, kts. globaali Net_ClientId.
EDIT: Katso vaikkapa miten NetMatchissa tallennetaan NET_ClientId globaalin tieto palvelimella.

Re: CoolBasic & netti = cbNetwork

Posted: Mon May 09, 2011 4:10 pm
by Noun
Kas vain, sekös siinä olikin. Kiitoksia oikein paljon. Yritän oppia paremmille tavoille sisennyksissä, niitä tulee lätkittyä vähän minne sattuu. Ja saattaa tuo johtua myös osittain siitä että tuo on rakennettu valtzu.arkku.netin esimerkkiohjelman päälle.

Seuraavaksi yritin saada clientissä näkymään muutkin kuin pelaajan alukset, mutta se ei jostain syystä toimi. Mitään virheilmoitusta ei tule, mutta ketään ei näy. Kun servulle ilmestyy uusi pelaaja, pistän sen lähettämään tiedon tästä clieteille, jolloin niissä luodaan uusi objekti. Jota ei kuitenkaan näy eikä kuulu. Tähän liittyvät jutut alkavat clientin koodin riviltä 77 ja servun koodin riviltä 30.
Jos nyt tähän vielä kehtaisi apua pyytää. :)

Re: CoolBasic & netti = cbNetwork

Posted: Mon May 09, 2011 11:13 pm
by valscion
Noun wrote:Kas vain, sekös siinä olikin. Kiitoksia oikein paljon. Yritän oppia paremmille tavoille sisennyksissä, niitä tulee lätkittyä vähän minne sattuu. Ja saattaa tuo johtua myös osittain siitä että tuo on rakennettu valtzu.arkku.netin esimerkkiohjelman päälle.

Seuraavaksi yritin saada clientissä näkymään muutkin kuin pelaajan alukset, mutta se ei jostain syystä toimi. Mitään virheilmoitusta ei tule, mutta ketään ei näy. Kun servulle ilmestyy uusi pelaaja, pistän sen lähettämään tiedon tästä clieteille, jolloin niissä luodaan uusi objekti. Jota ei kuitenkaan näy eikä kuulu. Tähän liittyvät jutut alkavat clientin koodin riviltä 77 ja servun koodin riviltä 30.
Jos nyt tähän vielä kehtaisi apua pyytää. :)
Ongelmasi johtuu siitä periaatteellisesta virheestä, että koitat lähettää clienteille tiedon samalla silmukan kerralla, kun uusi yhdistää. ServerRead-funktio asettaa sen clientin, jolta data luettiin, samaksi jolle data lähetetään - eli dataa ei lähetetä yhden silmukan aikana kuin sille jolta sitä alun perin luettiinkin! Sinun pitää laittaa jonkinmoinen tieto ohjelmaasi siitä, että kaikille pelaajille pitää lähettää tieto uuden pelaajan liittymisestä. Sinulle tulee vielä eteen vastaavanlaisia ongelmia, esimerkiksi chattiviestien kanssa, joten suosittelisin vahvasti tekemään uuden tyyppikokoelman, joka pitäisi sisällään tiedot clienteille lähtevästä datasta. Sitten kun silmukassa tulisi oikean pelaajan vuoro, niin tuon viesti-tyyppikokoelman juuri tälle pelaajalle tarkoitetut viestit lähetettäisiin eteenpäin. Tämän homman toteutus on aika lailla samanlainen kuin cbNetworkin paketin mukana tulevan chattiesimerkin toteutus.

Voit myös tutustua NetMatchin toteutukseen lataamalla projektin lähdekoodit tästä: ZIP-paketti. Kannattaa tutustua erityisesti NetMessage.cb tiedostossa sijaitsevaan NET_MESSAGES tyyppikokoelmaan. Tätä kokoelmaa käytetään, kun palvelimelta lähetetään kaikki clientille osoitetut tiedot palvelimen luku/lähetysloopissa, kts. Server.cb rivi 571 eteenpäin.

Re: CoolBasic & netti = cbNetwork

Posted: Thu Oct 13, 2011 4:29 pm
by naputtelija
Toimiiko tuo coolbasicin SaveGame tämän kanssa ihan normaalisti? Eli ideana olisi se, että uuden clientin tullessa linjoille sen lähettämä ID tarkastetaan ja jos se on uusi, sama clientin ID tallennetaan serverin puolelle ja peli tallennetaan. Jos se on taas vanha, serveri antaa oman pelitilanteensa takaisin. Entä onko tälle minun idealleni jotain käytännöllisempää ratkaisua?

Re: CoolBasic & netti = cbNetwork

Posted: Thu Oct 13, 2011 4:37 pm
by Viltzu
naputtelija wrote:Toimiiko tuo coolbasicin SaveGame tämän kanssa ihan normaalisti? Eli ideana olisi se, että uuden clientin tullessa linjoille sen lähettämä ID tarkastetaan ja jos se on uusi, sama clientin ID tallennetaan serverin puolelle ja peli tallennetaan. Jos se on taas vanha, serveri antaa oman pelitilanteensa takaisin. Entä onko tälle minun idealleni jotain käytännöllisempää ratkaisua?
En ny mieti yhtää mitää, mut väitän että SaveGamea ei kannata käyttää ikinä. Paras aina tehdä oma save systeemi.