Elikkä mulla on ongelmia tässä kun rustaan ircbottia. Plattis on linux. tässä on koodi
int op(int fd, char *channel, char *nick) { char buffer[1000]; char chan[100]; char nickname[100]; memset(chan,'\0',100); sprintf(chan,"%s",channel); memset(nickname,'\0',100); sprintf(nickname,"%s",nick); memset(buffer,'\0',1000); sprintf(buffer,"MODE %s +o %s\r\n\0",chan,nickname); printf("Puskuri on: %s :end",buffer); send(fd, buffer, strlen(buffer), 0); }
lähettää serverille datana "MODE +o (null)"
olen myös kokeillut tälleen
int op(int fd, char *channel, char *nick) { char buffer[1000]; memset(buffer,'\0',1000); sprintf(buffer,"MODE %s +o %s\r\n\0",channel,nick); printf("Puskuri on: %s :end",buffer); send(fd, buffer, strlen(buffer), 0); }
ja sama ongelma
Kysymys kuuluu: Miten tuo pitäisi tehdä että se lähettää oikein?
En näe tuossa jälkimmäisessä mitään vikaa (paitsi ilmeisesti turha memset, koska sprintf hoitaa merkkijon päättämisen ja loput nollatavut ovat turhia). Mitä tuo printf tulostaa?
Ai niin, piti vielä kysymäni, että lähettääkö send-funktio datan välittömästi? Muuten voisi olla mahdollista, että muistialue vapautetaan ennen sen lukemista, jos merkkijonon osoite otetaan vain talteen myöhempää lähettämistä varten (puskurointi).
Jos tuossa jälkimmäisessä ei ole memsettiä ni se ylivuotaa.
Send lähettää datan välittömästi. Printf tulostaa saman kuin mitä tuo lähettää dataa serverille siitähän minä näin että mitä se lähettää.
Ok, ajattelin jos olisit katsonut lähetettävän datan esim. packet snifferillä, mutta tuo toki riittää.
Kokeile tulostaa myös channel- ja nick-muuttujien sisältö yksinään. Ehkä ne ovat tyhjiä?
tesmu: (nämä siis tuohon jälkimmäiseen)
1) Memsettiä ei tarvitse tuossa.
2) Myöskään "MODE %s +o %s\r\n\0" perässä olevaa nollatavua (\0) ei tarvitse.
3) (null) tarkoittaa, että nick-osoitin oli 0 -- eli vika ei ole tuossa funktiossa. Tuo channel osoittanee tyhjään merkkijonoon ("") koska se ei näy bufferissa.
4) Tuossa sprintf-kutsussa on potentiaalinen puskuriylivuodon vaara koska et tarkista, mahtuuko merkkijono buffer-taulukkoon. Toki tarkistuksen voi tehdä myös siellä mistä tuota funktiota kutsutaan mutta se on aika typerää.
Olen katsonut myös erikseen nuo muuttujat ja ne näyttävät kanavan ja nicknamen. Mutta nytten sain toimimaan vika oli kutsuvassa funktiossa. eli siis onjoin funktiossa jollon data sekottuu ellei sitä pätki "\n" väleiltä
Aihe on jo aika vanha, joten et voi enää vastata siihen.