Citat:
Ursprungligen inskrivet av SwedishPshyco
Så om ni orkar kolla så kommentera gärna min fulkod, ge förslag på förbättringar osv... Och om ni inte byter till den från standardklienten, så hoppas jag iaf att ni lär er något från källkoden.
Jag har inte testat programmet då jag sitter i Linux, men jag har kollat lite på källkoden. Några kommentarer:
* För att vara C++ är koden väldigt C. Förutom att filerna heter *.cpp och att det finns en cSocket-klass (och även en cUser-klass, men den ser mer ut som en C-style struct) skulle jag inte ha trott att det var C++ (och jag lutar fortfarande åt att det är "C with a class"; en variant på det lite vanligare "C with classes"). Men i resten av texten antar jag att tanken är att det ska vara C-style, så jag skippar att nämna C++-idiom och dylikt.
* Du har lite blandad intentering: på vissa ställen tab och andra ställen spaces. Det finns även några ställen där indenteringen inte är lika djup som den borde vara (missad indentering).
* De flesta av dina funktioner (där det är relevant) tar en char-array av fix storlek som argument. Bättre vore att ta ett extra argument för att säga hur lång en buffer är, och låta buffer-argumentet bara vara en char-pekare. Denna pekare kan gärna vara const (const char *) för att signalera att funktionen inte kommer att förändra inputsträngen. cConsol::addText gör nästan rätt, men har fix storlek på input-argumentet (och det är inte const).
* När du bygger strängar genom sprintf finns risk för buffer overflow. snprintf vore lite säkrare. Kolla gärna returvärdet för att vara säker på att hela strängen rymdes. Är returvärdet större än eller lika med bufferstorleken fanns det inte plats för allt den ville skriva. Det går eventuellt att acceptera att inte hela den önskade strängen kunde skrivas, beroende på sammanhang, men buffer overflow bör undvikas.
* Du använder gets för att hämta input. Denna tar ingen storleksgräns som argument, och är därför osäker. fgets vore ett bättre val.
** Då gäller fortfarande att en inskriven rad kan vara längre än 255 tecken (inputs storlek minus ett). Vill du ha kvar begränsningen på 255 tecken borde du i alla fall kolla så användarens "entertryckning" ryms i buffern, och i annat fall ge ett felmeddelande. Du hanterar annars eventuellt bara en del av raden som användaren skrev in.
* I cSocket::getData kollar du så recv lyckades, men du har ingen felhantering för det fall där det inte lyckades. Ett felmeddelande kan man önska sig. Detta kan gälla på fler platser.