Verkko-ohjelmointi apua kaivataan

verkkis

Hei !

Ongelmani on seuraava. Koodaan parhaillaan erästä verkkopeliä C:llä ja pitäisi saada pelaajan antama nickname näkymään jokaisen siirron yhteydessä, eli kuka teki kyseisen siirron. Kysessä client-Server tyyppinen ratkaisu jossa servu hoitaa kaiken tietoliikenteen clientien välillä.
Ohessa koodia siitä mitä tässä ajan takaa...
eli Servu välittää toiselle Clientille vastustaja Clientin siirron

memset(bufout, 0, sizeof(bufout));
strcpy(bufout, "Move from %s: ");
strcat(bufout, &bufin[1]);
strncpy(send, bufout, sizeof(send));
sendto(sock, bufout, strlen(bufout), 0, (struct sockaddr *)&clients[i], len);

7

498

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Voisitko hieman selventää mikä kokonaisuuden osa-alue tuottaa ongelmia. Onko se:
      1. Pelaajien nickien selvittäminen servulla
      2. Tunnistaminen miltä pelaajalta paketti tulee
      3. char* nicknamen yhdistämien lähetettävään puskuriin
      4. Joku muu, mikä?

      Koodista päätellen se vaikuttaisi olevan vaihtoehto 3. Kuitenkin esimerkkikoodisi tuntuu olevan oikeilla jäljillä enkä täysin kykenen ymmärtämään, mikä on ongelma. Tosin itseäni hieman häiritsee tuo %s joka näyttää enemmän stringien stream-tyyppiseltä käsittelyltä kuin heti tämän perässä tuleva strcat. Tosin en tunne C:tä kauhean hyvin, vaan pohjaan vastauksen täysin C :aan.

      • verkkis

        Hei !

        Kyse on nimen omaan tuosta mainitsemastasi 3. vaihtoehdosta. eli char* nicknamen yhdistämien lähetettävään puskuriin. tyyliin:

        move from Pekka: H5
        yms.

        Olen koittanyt tuota kyseista koodia myös %c määrittelyllä, mutta silloin tuo kaikki on
        sekavaa lähetettyä puppua tuon nicknamen kohdilla. Ohjelmassa on määritetty array nickeille jotka
        lisätään ks. taulukkoon ohjelmaan kirjautumisen yhteydessä.


      • Anonyymi
        verkkis kirjoitti:

        Hei !

        Kyse on nimen omaan tuosta mainitsemastasi 3. vaihtoehdosta. eli char* nicknamen yhdistämien lähetettävään puskuriin. tyyliin:

        move from Pekka: H5
        yms.

        Olen koittanyt tuota kyseista koodia myös %c määrittelyllä, mutta silloin tuo kaikki on
        sekavaa lähetettyä puppua tuon nicknamen kohdilla. Ohjelmassa on määritetty array nickeille jotka
        lisätään ks. taulukkoon ohjelmaan kirjautumisen yhteydessä.

        Tutkiskelin tuossa hieman dokumentaatiota ja näyttäisi, että haluamaasi lopputulokseen voidaan päästä kahdella eri tavalla. Esimerkkikoodisi tuntuu tosin olevan jotain näiden välillä.

        Muotoilu voidaan tehdä:
        sprintf(bufout, "Move From %s: %s", nickname, movestring);
        btw. En ole aivan varma, mutta pitäsi kai tarkistaa, että lopputulos mahtuu bufout-taulukkoon, niin ei tule ilkeitä puskuriylivuotoja...

        Tai toisaalta kelpaa kait
        memset(bufout, 0, sizeof(bufout));
        strcpy(bufout, "Move from ");
        strcat(bufout, nickname);
        strcat(bufout, ": ");
        strcat(bufout, movestring);

        Tässäkin kai tulisi tarkistaa koko ennen kopioimista...

        Huomaathan, että nämä ovat vain esimerkkejä, eli ne eivät välttämättä toimi lainkaan (vaikka kyllä pitäisi). En ole koodeja testannut, eikä tuo C:n standardikirjasto ole kauhean hyvin hallussa, mutta periaatteen luulisin olevan kyllä oikein.


      • verkkis
        Anonyymi kirjoitti:

        Tutkiskelin tuossa hieman dokumentaatiota ja näyttäisi, että haluamaasi lopputulokseen voidaan päästä kahdella eri tavalla. Esimerkkikoodisi tuntuu tosin olevan jotain näiden välillä.

        Muotoilu voidaan tehdä:
        sprintf(bufout, "Move From %s: %s", nickname, movestring);
        btw. En ole aivan varma, mutta pitäsi kai tarkistaa, että lopputulos mahtuu bufout-taulukkoon, niin ei tule ilkeitä puskuriylivuotoja...

        Tai toisaalta kelpaa kait
        memset(bufout, 0, sizeof(bufout));
        strcpy(bufout, "Move from ");
        strcat(bufout, nickname);
        strcat(bufout, ": ");
        strcat(bufout, movestring);

        Tässäkin kai tulisi tarkistaa koko ennen kopioimista...

        Huomaathan, että nämä ovat vain esimerkkejä, eli ne eivät välttämättä toimi lainkaan (vaikka kyllä pitäisi). En ole koodeja testannut, eikä tuo C:n standardikirjasto ole kauhean hyvin hallussa, mutta periaatteen luulisin olevan kyllä oikein.

        Kiitos avusta..nyt sain tuon toimimaan jotenkin tuolla jälkimmäisellä rakenteellla

        memset(bufout, 0, sizeof(bufout));
        strcpy(bufout, "Move from ");
        strcat(bufout, nickname);
        strcat(bufout, ": ");
        strcat(bufout, movestring);

        mutta vielä on eräs ongelma. Jokaiseen viestiin tulostuu vain toisen pelaajan nickname. Eli ihan sama kumpi Clienteista lähettää viestin,niin sama ekan clientin nickname tulee viestin lähettäjäksi.

        nicknamet on määritelty seuraavasti ( vain nicknameen liittyvät jutut esitetty):

        char nicks[MAXCLIENTS][NICKLENGHT 1]; /*array for nicks*/

        /* copy nick to the buffer and send it to server*/

        memset(buffer_in, 0, sizeof(buffer_in));
        strncpy(buffer_in, nick, 10);

        /* send nick to the server */
        n_sent = sendto(sk, buffer_in, strlen(buffer_in), 0, (struct sockaddr*) &server, sizeof(server));


      • Anonyymi
        verkkis kirjoitti:

        Kiitos avusta..nyt sain tuon toimimaan jotenkin tuolla jälkimmäisellä rakenteellla

        memset(bufout, 0, sizeof(bufout));
        strcpy(bufout, "Move from ");
        strcat(bufout, nickname);
        strcat(bufout, ": ");
        strcat(bufout, movestring);

        mutta vielä on eräs ongelma. Jokaiseen viestiin tulostuu vain toisen pelaajan nickname. Eli ihan sama kumpi Clienteista lähettää viestin,niin sama ekan clientin nickname tulee viestin lähettäjäksi.

        nicknamet on määritelty seuraavasti ( vain nicknameen liittyvät jutut esitetty):

        char nicks[MAXCLIENTS][NICKLENGHT 1]; /*array for nicks*/

        /* copy nick to the buffer and send it to server*/

        memset(buffer_in, 0, sizeof(buffer_in));
        strncpy(buffer_in, nick, 10);

        /* send nick to the server */
        n_sent = sendto(sk, buffer_in, strlen(buffer_in), 0, (struct sockaddr*) &server, sizeof(server));

        Hmm...

        Ensimmäisenä nyt tulisi mieleen varmistaa, että nick = nicks[i], eikä esimerkiksi unohtunut muotoon nick = nicks; tai nick = nicks[0] kohdassa
        strncpy(buffer_in, nick, 10);
        tai aiemmin...

        Nickithän tulevat kuitenkin onnistuneesti ja ne lisätään taulukkoon oikein? Senkin voisi tarkistaa parilla printf:llä. Ja muutenkin voisi olla hyvä ainakin aluksi printata konsoliin (printf) kaikki mitä servu luulee lähettävänsä, eli tässä tapauksessa tuo nick tai buffer_in.


      • verkkis
        Anonyymi kirjoitti:

        Hmm...

        Ensimmäisenä nyt tulisi mieleen varmistaa, että nick = nicks[i], eikä esimerkiksi unohtunut muotoon nick = nicks; tai nick = nicks[0] kohdassa
        strncpy(buffer_in, nick, 10);
        tai aiemmin...

        Nickithän tulevat kuitenkin onnistuneesti ja ne lisätään taulukkoon oikein? Senkin voisi tarkistaa parilla printf:llä. Ja muutenkin voisi olla hyvä ainakin aluksi printata konsoliin (printf) kaikki mitä servu luulee lähettävänsä, eli tässä tapauksessa tuo nick tai buffer_in.

        Mulla on määrittely clientin startissa:

        else if(port != 0 && address[0] != '\0' && nick[0] != '\0') Joka asettaa tuon nickarrayn nollaksi ??
        {
        startClient(port, address, nick); /*start client is port, address and nick is given*/
        }


      • Anonyymi
        verkkis kirjoitti:

        Mulla on määrittely clientin startissa:

        else if(port != 0 && address[0] != '\0' && nick[0] != '\0') Joka asettaa tuon nickarrayn nollaksi ??
        {
        startClient(port, address, nick); /*start client is port, address and nick is given*/
        }

        Tuossa koodissa ei minun silmiini näy kyllä mitään vikaa. Tuo koodihan ei muuta ainakaan nick-muuttujaa mitenkään, vain vertaa sen ensimmäistä arvoa ( = alkiota? ), että nick ei ole tyhjä.

        Itse tutkisin ensimmäiseksi nyt yhdistyskoodin servupäässä, sillä clientti todennäköisesti toimii oikein, koska toinen clientti tässä operaatiossa onistuu. Voisi siis olettaa, että serverissä on tämä vika, koska joinimisjärjestys tuskin vaikuttaa juurikaan clientin logiikkaan toisin kuin serverillä.

        Sitä paitsi, eikös servu luo täysin tuon "Move from X: YZ" palautteen, eikä tähän ole clientillä osaa eikä arpaa. Veikkailisin siis serveripään ongelmaa...


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Vasemmistohallitus palauttaa hintasääntelyn, esim. bensalitra vain 1e.

      Tuleva vasemmistolaisista koostuva hallitus ottaa käyttöön vanhat hyvät keinot pitää hinnat kurissa. Tähän tarkoitukse
      Maailman menoa
      76
      4558
    2. Vasemmistolainen valehteli jälleen - Purra tai persut eivät luvanneet "euron bensaa"

      Väite "euron bensasta" on ensisijaisesti poliittisten vastustajien käyttämä puhdas vale. Persut kyllä kampanjoivat näky
      Maailman menoa
      109
      3793
    3. Arman Alizadin viesti puna-aktivisteille: "Pitäkää lärvinne nytkin kiinni"

      Arman Alizad kritisoi vasemmiston kaksinaismoralismia. Iranissa syntynyt suosikkijuontaja Arman Alizad pakeni perheensä
      Maailman menoa
      148
      3516
    4. Minja Koskela nostanut vasemmistoliiton kannatuksen ennätykseen

      Koskela valittiin puolueen johtoon lokakuussa 2024, ja silloin Ylen kysely antoi puolueelle 9,3 prosentin kannatuksen.
      Maailman menoa
      43
      1997
    5. Antti johtaa Petteriä jo 7,1 prosenttiyksiköllä

      Tällä menolla sdp menee kokoomuksesta kierroksella ohi jo tällä vaalikaudella. https://yle.fi/a/74-20213575
      Maailman menoa
      71
      1928
    6. Mitä on tullut

      Entisen abcn rakennuksen tilalle se oli tyhjillään monta vuotta siellä oli jo nyt valot onko huoltoasema? 5:30.
      Haapavesi
      89
      1239
    7. Harmi nainen kun

      olet niin elähtäneen näköinen. Miestä et koskaan löydä itelles. j
      Ikävä
      126
      1074
    8. Palosta selvinnyt 18 vuotias munira tarvitsi tulkin kun puhui Iltalehdelle

      Suomessa asuva 18 vuotias tarvii tulkin !!! Tää Suomea puhumaton on palossa kuolleen naisen veli ja asui perheen kanssa.
      Vantaa
      138
      1000
    9. Minne pyydän sut?

      Jotta saan nähdä 🤨
      Ikävä
      57
      943
    10. Mikä homma?

      https://share.google/NvruSS4P4EzjTWPov Poliisilla oli keskiviikkona 4. maaliskuuta yksityisasunnossa Saarijärvellä tehtä
      Saarijärvi
      25
      847
    Aihe