Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Winsock-onglema

crafn [07.09.2006 14:56:06]

#

Moi taas.
Oon tässä yrittäny vähä tota winsockia opetella, mut noi mun ohjelmat ei lähetä/vastaanota ku 4 merkkiä, vaikka 100 pitäs tossa mun koodissa olla maksimi:

//clientin pääsilmukka
for(;;)
   {

       char valinta[100]="";
       cout << "Komennot:" << "\n";
       cout << "1. MessageBoxi" << "\n";
       cout << "2. Akkunoitten nimet vaihtuu" << "\n";

       cout << "Valintasi: ";
       cin >> valinta;
       send(Socket,(const char*)valinta, sizeof((const char*)valinta),0);

       if(!strcmp(valinta,"1")){
          char teksti[100]="";
          cin >> teksti;
          send(Socket,(const char*)teksti, sizeof((const char*)teksti),0);
       }

       char vastaus[100];
       recv(Socket, vastaus, sizeof(vastaus), 0);
       cout << "\n" << "Sinne lähti ja " << vastaus << "\n";

   }
//serverin pääsilmukka
for(;;)
   {
       char valinta[100]="";
       cout << "Odotetaan k\204sky\204!" << "\n";
       recv(Socket, valinta, sizeof(valinta), 0);
       if (!strcmp(valinta,"1"))
           {
               char teksti[100]= "";
               recv(Socket, teksti, sizeof((const char*)teksti), 0);
               MessageBoxEx(hwnd, teksti, "HUOM!", MB_ICONHAND, true);
               const char viesti[100]={"perille meni."};
               send(Socket,viesti, sizeof(viesti),0);
           }
       if (!strcmp(valinta,"2"))
           {
           //ei viel mitää
           }
   }

Oon jo kokeillu vähän kaikkea mut en oo saanu toimimaan, toivottavasti joku teist osaa/viitti auttaa..
EDIT: Voi perhana.. Typo otsikossa :S

Legu [07.09.2006 15:16:23]

#

No ainakin mikä nyt silmään pistää on

sizeof((const char*)valinta)

Et nähdäkseni lähetä ollenkaan nollatavua. Koitappas + 1 tuohon perään (itse kyllä läytän strlen(data) + 1)

Jos olen väärässä niin korjatkaa.

crafn [07.09.2006 15:37:49]

#

Ongelma ei ollut tossa valinta-muuttujassa vaan, teksti muuttujan koko sisältö ei lähety toiseen ohjelmaan..

Ps: Joo ja ois kiva pääst ohjelmointiputkan kanavalle, mut ku yks nimeltämainitsematon tyyppi bannas mut sielt ku en asentanu gentoota... :D

A-P [07.09.2006 15:40:23]

#

Legu kirjoitti:

No ainakin mikä nyt silmään pistää on

sizeof((const char*)valinta)

Et nähdäkseni lähetä ollenkaan nollatavua. Koitappas + 1 tuohon perään (itse kyllä läytän strlen(data) + 1)

Send- ja recv-käskyillä ja nollatavulla ei ole mitään tekemistä keskenään. Send-käsky lähettää n tavua ja recv vastaanottaa n tavua. Recv palauttaa vastaanotettujen tavujen lukumäärän. Lukiessa voitaisiin käyttää vaikka tavun kokoista puskuria ja vastaanottaa dataa kunnes recv palauttaa nollan.

Tarkistamalla kuinka monta tavua recv-käsky vastaanotti, tiedät tuliko kaikki data vai ei. Lähettäessä voisit käyttää Legun esittämää tapaa kertoa lähetettävän datan määrä.

crafn [07.09.2006 15:49:26]

#

Tiiän et servulle ei tuu ku 4 merkkiä(tavuista en tiiä).
Sen takii kysyinki apuu, et mitä vikaa tossa mun koodissa on?

A-P [07.09.2006 18:24:56]

#

MR.Coodari kirjoitti:

Tiiän et servulle ei tuu ku 4 merkkiä(tavuista en tiiä).

C:ssä ja C++:ssa merkki (char) on yhtä kuin 8 bittiä eli tavu.

Metabolix [08.09.2006 13:34:54]

#

Ongelmasi on siinä, että sizeof((const char*)mikätahansa) == sizeof(char *) == 4.
Ota siis sizeof-kohdasta tyypinmuunnos pois. Vielä mieluummin voisit laittaa siihen tekstin pituuden:
strlen(teksti)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta