CoolBasic & netti = cbNetwork

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

CoolBasic & netti = cbNetwork

Post by valscion »

Kun minulle nyt on näitä yksityisviestejä, liittyen cbNetworkkiin, lähiaikoina tullut useampia, niin päätinpä pistää pystyyn yleisen keskustelun cbNetworkista. Voit kysellä tässä topikissa, kuinka jotkut asiat tehdään ja auttelen parhaani mukaan (tietysti muutkin saavat auttaa :P).

Aloita lataamalla tuosta alta Marcoderin tekemä paketti, josta löytyy tarvittavat tiedostot ja pari esimerkkiä cbNetworkin käytöstä. (Koska vanhat foorumit ovat kadonneet, en oikeata linkkiä Marcoderin cbNetwork-sivulle enää löytänyt...)
cbNetwork.zip
cbNetwork & examples by Marcoder
(130.93 KiB) Downloaded 1297 times
Sitten lukaise läpi tämä Valtzun tekemä tuto: http://valtzu.arkku.net/tuto/

Ja eikun sitten venkslailemaan. Jos jokin kohta on epäselvä niin kysele pois vain, tyhmiinkin kysymyksiin vastailen :)

EDIT (27.1.2011): Jos kaipailet tietoa, miten saat helposti ladattua nettisivusta tietoa CB-ohjelmallesi, niin käytä GetHTTPString-funktiota.
EDIT:

Virheiden tarkastelulista, jos kohtaat outoja ongelmia niin tarkista että nämä ovat ainakin oikein. Tällä hetkellä nämä ovat keskittyneet clientin kaatumiseen johtaviin syihin, mutta näitä voi myös soveltaa palvelimen puolelle. (Kts. alkuperäinen viesti)

  • Kai sulla on molemmissa (client ja server) sama portti?
  • Kai muistat aina alustaa muistipalan, ennen kuin laitat siihen dataa?
  • Kai muistat laittaa viestiä lähetettäessä jonkinlaisen "lopetustavun", jotta vastaanottava ohjelma tietää missä vaiheessa sen pitää lopettaa lukeminen?
  • Kai muistat sen, että muistipalassa on aina ensimmäisenä saadun datan pituus, joka pitää lukea pois _Net_GetInt() komennolla?
  • Kai muistat clientin puolella käyttää jotain tapaa, jolla luetaan dataa serveriltä vasta sen jälkeen kun jotain dataa on lähetetty? (esim. globaali muuttuja, jonka arvoa vaihdetaan dataa lähetettäessä ja nollataan datan lukemisen jälkeen)
    • Lukemisen kohtaan tämä (gClientDataSended on globaali muuttuja):

      Code: Select all

          // Ei jäädä lukemaan dataa jos mitään ei ole lähetettykään
          If gClientDataSended = False Then Return True
          
          // Nyt luetaan
          nRet = ClientRead()
          // Jos paluuarvo on alle 0 niin kaikki data ei ole vielä tullut palvelimelta
          If nRet < 0 Then Return True
          
          // Lukemisessa tuli joku virhe
          If nRet <> 0 Then 
              // Jos virhe oli "Connection timed out" niin ei välitetä siitä
              If nRet = 10060 Then Return True
              errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
              MakeError errMsg
          EndIf
          
          // Nyt data on luettu. Nollataan muuttuja joka antaa luvan lähettää lisää dataa serverille.
          gClientDataSended = False
      
          // Muistipalan alussa on aina saapuneen datan pituus joka luetaan tässä pois
          _Net_GetInt()
    • Ja lähettämisen kohtaan tämä:

      Code: Select all

          // Jos viesti on jo lähetetty mutta vastausta ei ole luettu niin ei lähetetä uudestaan
          If gClientDataSended = True Then Return False
      
          // Muistipalan alustus ensin
          _Net_InitMemBlock()
      
      //... tässä lisätään lähetettävät tiedot muistipalaan ...
      
          // Kirjoitetaan vielä viestin loppumerkki ja lähetetään.
          _Net_PutByte(NET_END)
          // ClientSendBack lähettää datan serverille ja jää heti odottamaan vastausta
          // mutta palauttaa kuitenkin kontrollin heti tänne. Vastausta siis odotellaan "taustalla".
          ClientSendBack()
          // Laitetaan muuttujaan tieto että dataa on lähetetty.
          gClientDataSended = True
  • Kai luet/lisäät saman määrän tietoa niin serverin kuin clientin puolella, ja samassa järjestyksessä? (esim. "viestinTyyppi-string-string-int-lopetustavu")
[/edit]
Last edited by valscion on Thu Jan 27, 2011 9:41 pm, edited 5 times in total.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolBasic & netti = cbNetwork

Post by Ruuttu »

Mää en oikeen tajua, että miten noissa esimerkeissä client muodostaa yhteyden serveriin ihan automaattisesti? Mistä se serveri voi tietää että linjoille on tullut uusi client, tai päinvastoin, mistä se client tietää serverin ip:n sun muut, että osaa ottaa siihen yhteyttä? Vai hoitaako dll kaiken tällaisen automaattisesti?
EDIT:

sillie wrote:Kun client -ohjelma käynnistetään se ottaa yhteyden serveriin. Näin siis serveri tietää aina kun clientti tulee linjoille.
Ja mistäs se client tietää että missä ip:ssä se serveri on? Tai osoitteessa ylipäänsä, se porttihan on vakio, mutta muuten...[/edit]
Last edited by Ruuttu on Thu Dec 18, 2008 11:07 am, edited 1 time in total.
sillie
Newcomer
Posts: 19
Joined: Sun Dec 14, 2008 8:56 pm

Re: CoolBasic & netti = cbNetwork

Post by sillie »

Kun client -ohjelma käynnistetään se ottaa yhteyden serveriin. Näin siis serveri tietää aina kun clientti tulee linjoille.

Ja ainakin noissa esimerkeissä tuo IP ja port on koodissa jo määritelty localhostiksi (client ja server pyörii samalla koneella), nettipeleissähän niiden servereiden IP:Port listahan pitäisi hakea jostakin jotta client osaisi yhdistää oikeaan osoitteeseen.

Tuo Valtzun tuto selventi ainakin mulle tosi paljon, kannattaapi lukaista se.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: CoolBasic & netti = cbNetwork

Post by KilledWhale »

Marcoder selvitti tuotta kikkailuaan joskus, eli dll antaa clientille id:n jonka avulla tiedetään kelle tieto menee. Eli kun serveri kuuntelee yhteyksiä ja client yhdistää serverihän saa luonnollisesti clientin osoitteen poimittua siitä. cbNetworkin (ansiosta?) vuoksi käyttäjän ei tarvitse kikkailla sockettien ja muiden kanssa
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Henkru
Advanced Member
Posts: 359
Joined: Sun Aug 26, 2007 2:46 pm

Re: CoolBasic & netti = cbNetwork

Post by Henkru »

Serveri puolella muuttujassa Net_ClientId on aina sen clientin IP:ID mistä dataa tuli. (jos oikeen olen ymmärtänyt)

Mitä muuten ClientSendBack funktio tekee?

EDIT.
Ruuttu wrote:Ja mistäs se client tietää että missä ip:ssä se serveri on? Tai osoitteessa ylipäänsä, se porttihan on vakio, mutta muuten...
Perjaatteessa ei mistään vaan käyttäjän pitää itse tietää serverin ip ja portti tai sit client voi hakea ne jostain listasta, jos tämmöinen ominaisuus on koodattu.

EDIT2.
Tutkin tuota funktio listaa sen verran vielä et osui silmään vielä ClientState() funktio ja sen tarkoitus? Marocerilta oisi ollut kyllä kiva jonkun lainen dokumentaatio.
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by Valtzu »

Henkru wrote:Mitä muuten ClientSendBack funktio tekee?
Lähettää tiedot serverille "taustalla", eli koodin suoritus ei pysähdy odottamaan vastausta serveriltä. Huomaa kuitenkin, että et voi lähettää dataa uudestaan, ennen kuin edelliseen kutsuun on vastattu.
User avatar
Ilmuri
Developer
Developer
Posts: 277
Joined: Sun Aug 26, 2007 2:46 pm
Location: \o

Re: CoolBasic & netti = cbNetwork

Post by Ilmuri »

Client kysyy käyttäjältä serverin osoitteen, DNS palauttaa serverin IP:n. Näin ainakin normaalisti tehdään.
CoolBasic henkilökuntaa
Kehittäjä
CoolBasic Classic
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolBasic & netti = cbNetwork

Post by Ruuttu »

Joo'o... Yritin tuosta Chattiesimerkistä jotain kyhätä, mutten saanut mitään aikaiseksi. Voisiko joku tehdä yksinkertaisen esimerkin, jossa Kone1 ja Kone2 muodostavat automaattisesti yhteyden toisiinsa, jonka jälkeen voidaan lähettää esim. kokonaislukuja ykkösestä kakkoseen tai kakkosesta ykköseen? Molemmissa koneissa olisi siis CoolBasic -ohjelma käynnissä. Ohjelman ei tarvitse olla molemmissa koneissa sama.

Kiitos jo etukäteen (siltä varalta että tulee jotain kiitettävää)
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Re: CoolBasic & netti = cbNetwork

Post by Someday coder »

Ruuttu wrote:Joo'o... Yritin tuosta Chattiesimerkistä jotain kyhätä, mutten saanut mitään aikaiseksi. Voisiko joku tehdä yksinkertaisen esimerkin, jossa Kone1 ja Kone2 muodostavat automaattisesti yhteyden toisiinsa, jonka jälkeen voidaan lähettää esim. kokonaislukuja ykkösestä kakkoseen tai kakkosesta ykköseen? Molemmissa koneissa olisi siis CoolBasic -ohjelma käynnissä. Ohjelman ei tarvitse olla molemmissa koneissa sama.

Kiitos jo etukäteen (siltä varalta että tulee jotain kiitettävää)
harmi että mulla oli tommonen säätö ihan valmiina, mutta poistin kaikki cb tallennetut jutut vähän aikaa sit :/
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by valscion »

Tässä olis tämmönen esimerkki, jossa lähetetään string-tietoa kahden ohjelman välillä. Chat-esimerkistä kopioiduissa kohdissa Marcoderin kommentoinnit on merkitty // ja omat kommentointini ovat merkitty ' merkillä.

Code: Select all

'*** CLIENT ***

SCREEN 640, 480

Include "cbNetwork.cb"
Include "NET_Constants.cb"

Const ADDRESS = "localhost" 'mihin yhdistetään
'PORT <-- määritelty "NET_Constants.cb" tiedostossa
Const TIMEOUT = 1000 'kauan dataa odotellaan


SetWindow "cbNetwork-esimerkki (client)"

// Käynnistetään client.
nRet = InitClient(ADDRESS, PORT, TIMEOUT)
If nRet <> 0 Then
    // Tuli joku virhe
    errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
    MakeError errMsg 
EndIf

Global gSendMessage$      'Tähän tallennetaan se lopulta lähetettävä viesti
gSendMessage$ = ""

Global gClientDataSended  'Onko dataa lähetetty?
gClientDataSended = False

Global gTextAmount        'monta viestiä on lähetetty
gTextAmount = 0





Repeat
    Locate 0,0
    txt$ = Input("Lähetä: ")
    If KeyHit(cbKeyReturn) Then
        gSendMessage = txt
        CloseInput
    EndIf
    
    Locate 0, (gTextAmount + 1)*13
    
    If KeyDown(cbKeyLCtrl) Or KeyDown(cbKeyRCtrl) Then
        If KeyHit(cbKeySpace) Then
            'CTRL + SPACE = Tyhjennä ruutu
            ClearText
        EndIf
    EndIf
    
    ReadDataFromServer() 'luetaan palvelimelta
    SendDataToServer()   'lähetetään palvelimelta
    
    
    DrawScreen
    
    Wait 5 'annetaan prosessorille hengähdystauko
Until EscapeKey()


//================================================================================
// Luetaan serverin lähettämää dataa
//================================================================================
Function ReadDataFromServer()
    // Ei jäädä lukemaan dataa jos mitään ei ole lähetettykään
    If gClientDataSended = False Then Return True

    // Nyt luetaan
    nRet = ClientRead()
    // Jos paluuarvo on alle 0 niin kaikki data ei ole vielä tullut palvelimelta
    If nRet < 0 Then Return True
    
    // Lukemisessa tuli joku virhe
    If nRet <> 0 Then 
        // Jos virhe oli "Connection timed out" niin ei välitetä siitä
        If nRet = 10060 Then Return True
        errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
        MakeError errMsg
    EndIf
    
    //Nollataan muuttuja joka antaa luvan lähettää lisää dataa serverille.
    gClientDataSended = False
    
    // Muistipalan alussa on aina saapuneen datan pituus joka luetaan tässä pois
    _Net_GetInt()
    
    // Luetaan kaikki viestit läpi
    While True
        netmsg = _Net_GetByte() 'minkä tyyppinen viesti
        
        If netmsg = NET_TEXTMSG Then
            'jotain tekstiä tulee
            txt$ = _Net_GetString()
            
            Color cbGreen
            AddText txt$ 'lisätään näytölle
            Color cbWhite
            
            gTextAmount = gTextAmount + 1
            
        ElseIf netmsg = NET_END Then
            'viestin loppu
            Exit
            
        EndIf

    Wend
    Return True
    
EndFunction

//================================================================================
// Lähetetään serverille dataa
//================================================================================
Function SendDataToServer()
    // Jos viesti on jo lähetetty mutta vastausta ei ole luettu niin ei lähetetä uudestaan
    If gClientDataSended = True Then Return False
    
    // Muistipalan alustus ensin
    _Net_InitMemBlock()
    
    If gSendMessage = "" Then
        // Jos mitään viestiä ei ole kirjoitettu niin lähetetään idle-viesti
        _Net_PutByte(NET_IDLE)
    Else
        'jotain on kirjoitettu, joten lisätäänpä se muistipalaan
        _Net_PutByte(NET_TEXTMSG) 'merkki siitä, että seuraavaksi muistipalassa on tavaraa
        _Net_PutString(gSendMessage) 'laitetaan muistipalaan viesti
        
        gSendMessage = "" 'alustetaan muuttuja
    EndIf
    
    'viestin loppumerkki vielä.
    _Net_PutByte(NET_END)
    
    // ClientSendBack lähettää datan serverille ja jää heti odottamaan vastausta
    // mutta palauttaa kuitenkin kontrollin heti tänne. Vastausta siis odotellaan "taustalla".
    ClientSendBack() '<-- lähetetään muistipala matkaan siis
    // Laitetaan muuttujaan tieto että dataa on lähetetty.
    gClientDataSended = True
EndFunction

Code: Select all

'*** PALVELIN ***

SCREEN 640,480

Include "cbNetwork.cb"
Include "NET_Constants.cb"

SetWindow "cbNetwork-esimerkki (server)",0,"Sammuta mielummin ESCistä (eli paina peruuta)"

// Käynnistetään palvelin.
// Koska tiedon lukeminen keskeyttää tämän ohjelman suorituksen niin
// asetetaan timeoutiksi 200 millisekuntia. Dataa siis odotellaan vain 200 ms
// jonka jälkeen kotrolli palaa DLL:stä tähän ohjelmaan.
nRet = InitServer(PORT, 200)
If nRet <> 0 Then
    // Tuli joku virhe
    errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
    MakeError errMsg 
EndIf

Global gSendMessage$   'Tähän tallennetaan se lopulta lähetettävä viesti
gSendMessage$ = ""

Global gTextAmount 'monta viestiä on lähetetty
gTextAmount = 0

SAFEEXIT OFF 'palvelin pitää sammuttaa erikseen, eikä vain murjoa alas

Repeat
    Locate 0,0
    txt$ = Input("Lähetä: ")
    If KeyHit(cbKeyReturn) Then
        gSendMessage = txt
        CloseInput
    EndIf
    
    Locate 0, (gTextAmount + 1)*13
    
    If KeyDown(cbKeyLCtrl) Or KeyDown(cbKeyRCtrl) Then
        If KeyHit(cbKeySpace) Then
            'CTRL + SPACE = Tyhjennä ruutu
            ClearText
        EndIf
    EndIf
    ReadFromClient() 'luetaan dataa clientiltä
        
    DrawScreen
    
    Wait 5 'annetaan prosessorille hengähdystauko
Until EscapeKey()

// Suljetaan palvelin
CloseServer()

//================================================================================
// Luetaan dataa clientiltä.
//================================================================================
Function ReadFromClient()
    // Luetaan dataa
    nRet = ServerRead()

    // Tuli joku virhe. Esimerkiksi timeout eli dataa ei tullut määräaikaan mennessä.
    If nRet <> 0 Then Return False
    
    // Muistipalan alussa on aina luetun datan pituus joka luetaan tässä pois
    _Net_GetInt()


    
    'luetaan viestit läpi
    While True
        // Mitä dataa on tulossa
        netmsg = _Net_GetByte()
        
        If netmsg = NET_TEXTMSG Then
            txt$   = _Net_GetString() 'luetaan string
            Color cbBlue
            AddText txt$              'lisätään se näytölle
            Color cbWhite
            
            gTextAmount = gTextAmount + 1
            
        ElseIf netmsg = NET_IDLE Then
            'client idlaa? ei tehä mitään :)
            
        ElseIf netmsg = NET_END Then
            'viestin lopetus
            Exit
        EndIf
        
    Wend
    
    _Net_InitMemBlock() // Datapaketin alustus
    
    If gSendMessage <> "" Then
        'jotain on kirjoitettu lähetettäväksi
        _Net_PutByte(NET_TEXTMSG)    'viestin tyyppi
        _Net_PutString(gSendMessage) 'itse string
        
        gSendMessage = "" 'alustetaan muuttuja
    EndIf
    
    _Net_PutByte(NET_END) 'viestin lopetus
    
    ServerSend() 'lähetetään...
EndFunction

Code: Select all

'*** NET_Constants.cb ***

' Samat vakiot clientilla ja palvelimella.
Const NET_IDLE = 1
Const NET_TEXTMSG = 2
Const NET_END  = 255

Const PORT = 10999
Huomaa, että palvelimen aluksi surkea FPS (mikä näkyy Inputin suurena tökkimisenä) johtuu siitä, koska sillä ei ole clienttia jolta lukea tietoa ja siksi se katkaisee tiedon lukemisen aina timeouttiin (ServerSend() komento siis).
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
Ruuttu
Devoted Member
Posts: 688
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolBasic & netti = cbNetwork

Post by Ruuttu »

Aaww, kiitos! Tuo on Juuri Se Mitä Etsin!
Ja ei kun virittelemään.

Kysyn valmiiksi siltä varalta etten onnistu itse ratkaisemaan ongelmaa: Kun Clientin käynnistää ilman että Server on jo käynnissä, tulee virheilmoitus. Onko tämä mahdollista muuttaa niin, että Client yrittää vaikka kolmen sekunnin välein uudestaan, kunnes Serveri tulee onlineen?
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: CoolBasic & netti = cbNetwork

Post by Jani »

Ruuttu wrote:Aaww, kiitos! Tuo on Juuri Se Mitä Etsin!
Ja ei kun virittelemään.

Kysyn valmiiksi siltä varalta etten onnistu itse ratkaisemaan ongelmaa: Kun Clientin käynnistää ilman että Server on jo käynnissä, tulee virheilmoitus. Onko tämä mahdollista muuttaa niin, että Client yrittää vaikka kolmen sekunnin välein uudestaan, kunnes Serveri tulee onlineen?
kyllä se on mahdollista.

Esim tyylin (älä käytä tätä):

se ihme luku juttu on nyt tallennettu rtn muuttujaan.

Code: Select all

If rtn <> 0 Then Wait 3000 : goto {uusi}
ja tuona "uusi" tilalle linkki linkitykseen.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by valscion »

Ruuttu wrote:Aaww, kiitos! Tuo on Juuri Se Mitä Etsin!
Ja ei kun virittelemään.
Oles hyvä vain :). Muista, että tuossa sitten ei ole mitenkään huomioitu sitä, että clienttejä on enemmän kuin yksi.
Ruuttu wrote:Kysyn valmiiksi siltä varalta etten onnistu itse ratkaisemaan ongelmaa: Kun Clientin käynnistää ilman että Server on jo käynnissä, tulee virheilmoitus. Onko tämä mahdollista muuttaa niin, että Client yrittää vaikka kolmen sekunnin välein uudestaan, kunnes Serveri tulee onlineen?
Siinä esimerkissäni, clientin puolella palvelimeen yhdistyksen voisit tehdä näin:

Code: Select all

SetWindow "cbNetwork-esimerkki (client)"

// Käynnistetään client.
nRet = InitClient(ADDRESS, PORT, TIMEOUT)
If nRet <> 0 Then
    // Tuli joku virhe
    errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
    MakeError errMsg 
EndIf

_Net_InitMemBlock()   'muistipalan alustus
_Net_PutByte(NET_END) 'viestin lopetuksen merkki
ClientSendBack()      'lähetys
nRet = ClientRead()
While nRet > 0
    // Tuli joku virhe
    retryAmount = retryAmount + 1
    SetWindow "Connecting... (retry #" + retryAmount + ")"
    _Net_InitMemBlock()   'muistipalan alustus
    _Net_PutByte(NET_END) 'viestin lopetuksen merkki
    ClientSendBack()      'lähetys
    Wait 3000
    nRet = ClientRead()
Wend

_Net_InitMemBlock() 'alustetaan muistipala

SetWindow "cbNetwork-esimerkki (client) [CONNECTED]"
EDIT:

HETKINEN!! Ei tuo toimikaan noin... hmm..

EDIT:

Noniin, nyt se toimii. Purkkaisaa :D.

cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: CoolBasic & netti = cbNetwork

Post by phons »

Olen vähän pihalla tästä ja yritän saada yksikertaisesti serverin joka lähettää kokonaisluvun ja clientin joka vastaanottaa sen. En ole saanut sitä toimimaan vaan client on aina vastaannottanut nollan eli ei mitään. Voisiko joku laittaa jonkun toimivan esimerkin jossa serveri lähettää kokonaisluvun ja client vastaanottaa sen. :oops:
Image
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by valscion »

phons wrote:Olen vähän pihalla tästä ja yritän saada yksikertaisesti serverin joka lähettää kokonaisluvun ja clientin joka vastaanottaa sen. En ole saanut sitä toimimaan vaan client on aina vastaannottanut nollan eli ei mitään. Voisiko joku laittaa jonkun toimivan esimerkin jossa serveri lähettää kokonaisluvun ja client vastaanottaa sen. :oops:
No tuo minun pari viestiä yläpuolella oleva esimerkki kävis pienellä säädöllä myös kokonaisluvun lähettämiseen...
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Sefru
Newcomer
Posts: 4
Joined: Mon Dec 10, 2007 6:42 pm

Re: CoolBasic & netti = cbNetwork

Post by Sefru »

Olen yrittänyt tehdä jotain pientä ohjelmaa cbNetworkilla, mutta client ohjelmani antaa aina virheilmoituksen "socket operation on non-socket". Mitäs tämä tarkoittaa? :shock:
EDIT: Tarkennanpa vielä että virhe tulee siinä kohtaa, kun clientin pitäisi vastaan ottaa serveriltä tulevaa tietoa. Tiedon lähetys clientiltä serverille toimii hyvin ,mutta ei toisin päin. :?
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by valscion »

Sefru wrote:Olen yrittänyt tehdä jotain pientä ohjelmaa cbNetworkilla, mutta client ohjelmani antaa aina virheilmoituksen "socket operation on non-socket". Mitäs tämä tarkoittaa? :shock:
EDIT: Tarkennanpa vielä että virhe tulee siinä kohtaa, kun clientin pitäisi vastaan ottaa serveriltä tulevaa tietoa. Tiedon lähetys clientiltä serverille toimii hyvin ,mutta ei toisin päin. :?
  • Kai sulla on molemmissa (client ja server) sama portti?
  • Kai muistat aina alustaa muistipalan, ennen kuin laitat siihen dataa?
  • Kai muistat laittaa palvelimelta viestiä lähetettäessä jonkinlaisen "lopetustavun", jotta client tietää missä vaiheessa sen pitää lopettaa lukeminen?
  • Kai muistat clientin puolella sen, että muistipalassa on aina ensimmäisenä saadun datan pituus, joka pitää lukea pois _Net_GetInt() komennolla?
  • Kai muistat clientin puolella käyttää jotain tapaa, jolla luetaan dataa serveriltä vasta sen jälkeen kun jotain dataa on lähetetty? (esim. globaali muuttuja, jonka arvoa vaihdetaan dataa lähetettäessä ja nollataan datan lukemisen jälkeen)
    • Lukemisen kohtaan tämä (gClientDataSended on globaali muuttuja):

      Code: Select all

          // Ei jäädä lukemaan dataa jos mitään ei ole lähetettykään
          If gClientDataSended = False Then Return True
          
          // Nyt luetaan
          nRet = ClientRead()
          // Jos paluuarvo on alle 0 niin kaikki data ei ole vielä tullut palvelimelta
          If nRet < 0 Then Return True
          
          // Lukemisessa tuli joku virhe
          If nRet <> 0 Then 
              // Jos virhe oli "Connection timed out" niin ei välitetä siitä
              If nRet = 10060 Then Return True
              errMsg$ = "(" + nRet + ") " + GetNetErrorString(nRet)
              MakeError errMsg
          EndIf
          
          // Nyt data on luettu. Nollataan muuttuja joka antaa luvan lähettää lisää dataa serverille.
          gClientDataSended = False
      
          // Muistipalan alussa on aina saapuneen datan pituus joka luetaan tässä pois
          _Net_GetInt()
    • Ja lähettämisen kohtaan tämä:

      Code: Select all

          // Jos viesti on jo lähetetty mutta vastausta ei ole luettu niin ei lähetetä uudestaan
          If gClientDataSended = True Then Return False
      
          // Muistipalan alustus ensin
          _Net_InitMemBlock()
      
      //... tässä lisätään lähetettävät tiedot muistipalaan ...
      
          // Kirjoitetaan vielä viestin loppumerkki ja lähetetään.
          _Net_PutByte(NET_END)
          // ClientSendBack lähettää datan serverille ja jää heti odottamaan vastausta
          // mutta palauttaa kuitenkin kontrollin heti tänne. Vastausta siis odotellaan "taustalla".
          ClientSendBack()
          // Laitetaan muuttujaan tieto että dataa on lähetetty.
          gClientDataSended = True
  • Kai luet/lisäät saman määrän tietoa niin serverin kuin clientin puolella, ja samassa järjestyksessä? (esim. "viestinTyyppi-string-string-int-lopetustavu")
Jos nuo kohdat eivät auta niin sitten kattele että molemmat ohjelmat pyörivät palomuurin blokkimatta ja jos vieläkin ongelmia löytyy niin laitappa koodia tulemaan.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Sefru
Newcomer
Posts: 4
Joined: Mon Dec 10, 2007 6:42 pm

Re: CoolBasic & netti = cbNetwork

Post by Sefru »

Kiitos oikein paljon, nyt toimii! :) Tuo lopetustavu sieltä puuttui. ;)
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: CoolBasic & netti = cbNetwork

Post by Jani »

Miksi seuraava ei toimi?

Code: Select all

Include "cbNetwork.cb"

rtn=HTTPGet("http://i19.photobucket.com/albums/b176/Pate5/cb.jpg")
If rtn<>200 Then MakeError "ERROR"
img=HTTPLoadContentImage()
W=ImageWidth(img)
H=ImageHeight(img)
SCREEN W,H

DrawImage img,0,0

DrawScreen

WaitKey

??

Ja Patelle: Harjoittelen vain.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: CoolBasic & netti = cbNetwork

Post by Valtzu »

Jani wrote:Miksi seuraava ei toimi?

Code: Select all

...
??

Ja Patelle: Harjoittelen vain.
Koska SCREEN-komento poistaa kaikki kuvat muistista.
Post Reply