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);
Verkko-ohjelmointi apua kaivataan
7
525
Vastaukset 7
- 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
Hallituksen järjestämä spektaakkeli tuo vessanpyttykeissi
Että olisi kymmenien kansanedustajien kodeissa käyty ihan tuosta vaan, eikä kukaan kansanedustaja kerro niin käyneen, va3341346Sysmän "ilon päivä"
Ja taas palaa hirveä määrä verorahoja, ihan turhaan soopaan. Eikö nämä jotka kuntapolitiikassa valittavat ja tuhoaa vaan77936Uskon, että saataisiin kaikki selvitettyä
Mutta yhteys on jäissä, minä olen jäässä, enkä osaa tai uskalla enää lähestyä. Se vaan on niin. Naiselta Jos ei ole hyvä61823Timo Vornanen.
On siinäkin yksi täystampio. Eipä ihme, että persukannattajat sen eduskuntaan äänestikin.68758- 120693
Riitastako pelastaja
Riitta jätti hakemuksen. Hyvä niin. On ainakin yksi mistä ottaa. Pertsa ei taida aikuistua koskaan ja Pekka hoiteli silt44689Joka ilta mietin
sua❤️Mitä teet, missä meet? Kaipaatko yhtään? Yön tullen toivotan mielessäni sulle hyvää yötä ja aamuisin huomenet. Joka38682- 49648
- 50606
Luottamus
Luotan vain siihen mitä tapahtuu IRL. Anonyymipalstan vihjailut eivät merkitse minulle mitään.95552- 45537
Tässä ovat Elämäni biisi -vieraat lauantai 3.10. - Yksi vieras on todellinen suomalaisten suosikki
Jos menisit Elämäni biisiin, mikä olisi elämäsi biisi ja miksi? Elämäni biisi tulee suorana lähetyksenä Tampereelta. K9526- 32521
Kadutko mies sitä miten reagoit?
..siihen sotkuun, jonka jälkeen mikään ei ole ollut kuin ennen. 🥺48515- 25515
Millaisen talvitakin haluaisit?
Talveen vielä aikaa, mutta talvitakit tulleet kauppoihin. Millainen olisi unelmiesi talvitakki? Itse tykkäisin jostain84485En voi kertoa meistä kenellekään
Minulla on ikävä sinua mies.. Oon yrittänyt taas unohtaa, mutta silti tulet mieleeni lähes päivittäin. Eihän meitä voi o32482- 79457
Onko kahvila Retro samalla pub???
Netin mukaan anniskeluoikeudet. Käykö tuolla kaljoitteluporukkaa? Onko iltaviihdettä? Olen muuttamassa marraskuussa Kuhm8447Iivari esittää poliisin tutkintaa
Siikalatvan kunnanjohtaja Pekka Iivari on pannu ison pyörän liikkeelle. Entinen Kemijärven historian lyhimmän kaupunginj21421