Page 1 of 8

CoolBasic & netti = cbNetwork

Posted: Wed Dec 17, 2008 10:07 pm
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 863 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]

Re: CoolBasic & netti = cbNetwork

Posted: Thu Dec 18, 2008 8:18 am
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]

Re: CoolBasic & netti = cbNetwork

Posted: Thu Dec 18, 2008 9:53 am
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.

Re: CoolBasic & netti = cbNetwork

Posted: Thu Dec 18, 2008 3:44 pm
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

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 19, 2008 4:43 pm
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.

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 19, 2008 4:50 pm
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.

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 19, 2008 4:51 pm
by Ilmuri
Client kysyy käyttäjältä serverin osoitteen, DNS palauttaa serverin IP:n. Näin ainakin normaalisti tehdään.

Re: CoolBasic & netti = cbNetwork

Posted: Thu Dec 25, 2008 8:48 pm
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ää)

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 26, 2008 12:11 am
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 :/

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 26, 2008 2:48 am
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).

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 26, 2008 11:05 am
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?

Re: CoolBasic & netti = cbNetwork

Posted: Fri Dec 26, 2008 6:53 pm
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.

Re: CoolBasic & netti = cbNetwork

Posted: Sat Dec 27, 2008 3:44 am
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.


Re: CoolBasic & netti = cbNetwork

Posted: Wed Jan 14, 2009 8:13 pm
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:

Re: CoolBasic & netti = cbNetwork

Posted: Wed Jan 14, 2009 10:16 pm
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...

Re: CoolBasic & netti = cbNetwork

Posted: Tue Jan 27, 2009 7:37 pm
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. :?

Re: CoolBasic & netti = cbNetwork

Posted: Wed Jan 28, 2009 3:29 pm
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.

Re: CoolBasic & netti = cbNetwork

Posted: Wed Jan 28, 2009 6:04 pm
by Sefru
Kiitos oikein paljon, nyt toimii! :) Tuo lopetustavu sieltä puuttui. ;)

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 07, 2009 11:46 am
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.

Re: CoolBasic & netti = cbNetwork

Posted: Sat Feb 07, 2009 11:55 am
by Valtzu
Jani wrote:Miksi seuraava ei toimi?

Code: Select all

...
??

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