Nettipeliongelmia...

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Nettipeliongelmia...

Post by regalis »

Yritin saada kyhättyä Valtzun yksinkertaisesta server-client-esimerkistä systeemiä, joka olisi ottanut toiselta koneeltani yhteyttä toiselle.

Toisella koneella käynnistin servu-ohjelman:

Code: Select all

SCREEN 400,100

// Sisällytetään kirjasto
Include "cbNetwork.cb"

// Määritellään vakiot
Const UDP_PORT    = 1337 // Portti, jota käytetään

Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_WANT_RESULT         = 253

SAFEEXIT OFF

    SetWindow "Serveri"
    
    // Käynnistetään serveri
    rtn = InitServer( UDP_PORT, 100 )
    
    // Virheen sattuessa lopetetaan virheilmoitukseen
    If rtn <> 0 Then MakeError GetNetErrorString( rtn )
    
    Repeat
        // Luetaan dataa clientilta
        rtn = ServerRead()
        
        If rtn = 0 Then // Kaikki ok
            
            // Luetaan muistipalan alusta koko
            _Net_GetInt()
            
            // Luetaan infotavu muistipalasta
            infoByte = _Net_GetByte()
            
            If infoByte = INFO_STARTING_CONNECTION Then
                SetWindow "Serveri - Yhteys muodostettu"
            ElseIf infoByte = INFO_CLOSING_CONNECTION Then
                SetWindow "Serveri - Client katkaisi yhteyden"
            ElseIf infoByte = INFO_WANT_RESULT Then
                luku1       = _Net_GetInt()
                luku2       = _Net_GetInt()
                operaattori$= Chr( _Net_GetByte() )
            EndIf
            
            // Alustetaan muistipala
            _Net_InitMemBlock()
            
            // Lähetetään infoByte takaisin
            _Net_PutByte( infoByte )
            
            If infoByte = INFO_WANT_RESULT Then
                
                Select operaattori
                    Case "+" : result = luku1 + luku2 // Yhteenlasku
                    Case "-" : result = luku1 - luku2 // Vähennyslasku
                    Case "*" : result = luku1 * luku2 // Kertolasku
                    Case "/" : result = luku1 / luku2 // Jakolasku
                End Select
                
                // Kirjoitetaan vastaus muistipalaan
                _Net_PutInt( result )
                
            EndIf
            
            // Lähetetään tiedot
            ServerSend()
            
        EndIf
    Until EscapeKey() // Suoritetaan kunnes painetaan esciä
    
    SetWindow "Serveri - Serveriä suljetaan..."
    
    // Odotetaan, että esc-nappula vapautetaan
    While EscapeKey() : Wend
    
    // Suljetaan serveri
    CloseServer()
Ja toisella client-ohjelman:

Code: Select all

SCREEN 400,100

// Sisällytetään kirjasto
Include "cbNetwork.cb"

// Määritellään vakiot
Const UDP_PORT    = 1337 // Portti, jota käytetään

Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_WANT_RESULT         = 253


SAFEEXIT OFF
    
    SetWindow "Client"
    
    rtn = InitClient("TOISEN KONEEN IP-OSOITE", UDP_PORT, 100 )
    If rtn <> 0 Then MakeError GetNetErrorString( rtn )
    
    // Lähetetään serverille viesti, että linjoilla ollaan.
    _Net_InitMemBlock()
    _Net_PutByte(INFO_STARTING_CONNECTION)
    
    ClientSend()
    
    Dim lasku As String, lastLasku As String
    
    AddText "Esim. 5 + 6"
    AddText ""
    
    Repeat
        lasku = Input("Lasku: ")
        If lastLasku<>"" Then Text 0,60,lastLasku+" = "+lastResult
        DrawScreen
        
        If KeyHit(cbKeyReturn) Then
            
            // Siistitään lasku
            lastLasku = Replace(lasku," ","")
            lastLasku = Replace(lastLasku,"+"," + ")
            lastLasku = Replace(lastLasku,"-"," - ")
            lastLasku = Replace(lastLasku,"*"," * ")
            lastLasku = Replace(lastLasku,"/"," / ")
            
            CloseInput
            lasku = Input("Lasku: ")
        
            // Parsitaan laskusta tiedot
            luku1       = Int( GetWord(lastLasku, 1) )
            luku2       = Int( GetWord(lastLasku, 3) )
            operaattori = Asc( GetWord(lastLasku, 2) )
            
            // Alustetaan muistipala
            _Net_InitMemBlock()
            
            // Kirjoitetaan muistipalaan, että halutaan tulos
            _Net_PutByte( INFO_WANT_RESULT )
            
            // Kirjotetaan tiedot muistipalaan
            _Net_PutInt(luku1)
            _Net_PutInt(luku2)
            _Net_PutByte(operaattori)
            
            // Lähetetään data
            ClientSend()
            
        EndIf
        
        // Luetaan dataa serveriltä
        rtn = ClientRead()
        
        // Luetaan muistipalan alusta koko
        _Net_GetInt()
        
        // Jos kaikki meni niinkuin pitikin
        If rtn = 0 Then
        
            // Haetaan infotavu
            infoByte = _Net_GetByte()
            
            If infoByte = INFO_STARTING_CONNECTION Then
                SetWindow "Client - Yhteys muodostettu"
            ElseIf infoByte = INFO_WANT_RESULT Then
                lastResult = _Net_GetInt() // Luetaan tulos muistipalasta muuttujaan.
            EndIf
        EndIf
        
    Until EscapeKey() // Suoritetaan kunnes painetaan esciä
    CloseInput
    
    // Alustetaan muistipala
    _Net_InitMemBlock()
    
    // Kirjoitetaan poistumisviesti muistipalaan
    _Net_PutByte(INFO_CLOSING_CONNECTION)
    
    // Lähetetään tiedot
    ClientSend()
Mitään virheilmoitusta ei tullut, eikä kumpikaan ohjelma kaatunut, mutta kumpikaan niistä ei saanut yhteyttä toiseen. Mikä voisi olla vikana?
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: Nettipeliongelmia...

Post by Marcoder »

Code: Select all

rtn = InitClient("TOISEN KONEEN IP-OSOITE", UDP_PORT, 100 )
Kun itse laitoin tuohon osoitteeksi localhost niin toimi aivan mainiosti.
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Nettipeliongelmia...

Post by regalis »

Jep, onnistuin kyllä yhdistämään samaan koneeseen, mutta kun yritin yhdistää eri koneelta tähän, mitään ei tapahtunut. Pitää vielä kokeilla, jos palomuuri olisi estänyt yhteyden...
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: Nettipeliongelmia...

Post by Valtzu »

regalis wrote:Jep, onnistuin kyllä yhdistämään samaan koneeseen, mutta kun yritin yhdistää eri koneelta tähän, mitään ei tapahtunut. Pitää vielä kokeilla, jos palomuuri olisi estänyt yhteyden...
Siis sunhan pitää tietysti muuttaa IP-osoite vastaamaan serveri-koneen osoitteeksi. (esim. 192.168.0.100)

Jos yrität yhdistää muualta kuin sisäverkosta serveriin, voi syynä olla NAT. Tämän ongelman saa ratkaistua ohjaamalla ADSL-reitittimestä tietyn UDP-portin serverille.
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Nettipeliongelmia...

Post by regalis »

Olin laittanut IP-osoitteen lainausmerkeissä, ei ihmekään ettei toiminut... :) Mutta nyt kun laitoin sen ilman niitä, tuli "host not found". Miten tuo portin ohjaaminen tapahtuu?
EDIT:

Vaikka laitoin palomuurin pois päältä kummaltakin koneelta, tuli host not found. Vanhoilta foorumeilta löydettyjen ohjeiden mukaisesti vertasin komentoriviltä saatavaa IP-osoitetta ja whatsmyip.orgista saatavaa, ja ne olivat samat. Mikä ihme tässä nyt voisi olla vikana?

Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: Nettipeliongelmia...

Post by Koodiapina »

Mutta jos siinä on esimerkiksi pisteitä, niin silloinhan se on merkkijono.
regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Nettipeliongelmia...

Post by regalis »

Laitoin sen merkkijonoksi, eikä enää tullut host not foundia. Client ei kuitenkaan löytänyt serveriä, tai ainakaan serverissä ei lukenut "yhteys muodostettu", eikä se lähettänyt mitään dataa clientille.
EDIT:

Jes, nyt sain toimimaan! Palomuuri esti ohjelmia yhdistämästä.

regalis
Advanced Member
Posts: 268
Joined: Mon Aug 27, 2007 9:44 pm

Re: Nettipeliongelmia...

Post by regalis »

Toinen kysymys:
Miten ns. serveriaula kannattaa tehdä? Varmaankin ainoa tapa saada käyttäjien omat servut näkymään muille, on tehdä joku nettisivu, jolle niiden tiedot tallentuvat? Entä pitäisikö servun IP-osoite tallentaa myös sinne nettisivulle?
Post Reply