MaxSoldier
Messages postés289Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention28 février 2009
-
26 avril 2008 à 22:13
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
27 avril 2008 à 20:33
Bonsoir tout le monde !
Je me suis mis au C/C++ sous linux il y a quelques jours et j'ai de nombreuses erreur de dépassement de tampon (segmentation fault).
Voici mon code complet, c'est un scanneur de port multithreaded qui me sert de test pour voir si je suis capable de coder un programme gérant socket et multithreading (humm !). Mais le problème ne se situe pas sur ces difficultés !
// Mise en place d'un socket non blocant
Arg = fcntl(SktDesc, F_GETFL, NULL);
Arg |= O_NONBLOCK;
fcntl(SktDesc, F_SETFL, Arg);
// On set les paramètres du socket
memset(&SktIn, 0, sizeof(SktIn));
memcpy((char *) &SktIn.sin_addr.s_addr, ResolvedHost->h_addr_list[0], ResolvedHost->h_length);
return 0;
}
<hr size="2" width="100%" />
Je vous met aussi le dump GDB si ca peut vous aider :
<hr size="2" width="100%" />Starting program: /home/digitalguru/Bureau/Developpement/DGScan V2/DGScanV2
[Thread debugging using libthread_db enabled]
DGSCan Port Scanner...
Multithreaded !
Thread Limit : 10
Host : google.fr
Start port :1
End port :100
[New Thread 0x7f81f35986f0 (LWP 6549)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f81f35986f0 (LWP 6549)]
0x000000000040111e in main (argc=1, argv=0x7ffffb5aea18) at main.c:119
119 Param->Host = (char*)malloc(sizeof(char) * strlen(Host));
Current language: auto; currently c++
<hr size="2" width="100%" />
Voilà, si quelqu'un a une idée de comment m'en sortir !
Sinon, soyez indulgent sur mon "style" qui doit probablement être assez dégueulasse, car je viens d'une multitude de langage et je ne suis pas très habitué ni aux pointeurs, ni au standart d'écriture du C++.
Je prend bien sûr toutes les remarques
MaxSoldier
Messages postés289Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention28 février 20092 27 avril 2008 à 00:03
Salut !
D'abord, merci à toi d'avoir répondu !
-Pour le free, en effet, petit (gros ?) oubli de ma part !
- Il n'y a pas de fonction pour cloturer un thread, il se ferme tout seul après son execution.
- Pas besoin du close, puisque le socket n'est pas ouvert.
Mais malgrès le free, toujours ce BufferOverflow (je m'y attendais en même temps !) !
Une autre idée ?
Tchou !
-=Digital Guru=-
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 27 avril 2008 à 01:07
Au niveau de la propreté :
* headers : choisis iostream ou stdio mais pas les deux, strictement inutile
*
typedef struct MTConnectArg
{
char* Host;
int Port;
};
le typedef ne sert à rien dans ce cas
* tu mélanges cout (librairie C++) avec des struct sockaddr_in par exemple (syntaxe C). Point de vue personnel peut-être, mais je trouve pas ça génial. Choisis un langage et restes-y.
MaxSoldier
Messages postés289Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention28 février 20092 27 avril 2008 à 13:50
Nickel ! Merci SAKingdom, c'était bien ça, encore une erreur toute conne !
Quant aux remarques de Juju, autant pour les includes, j'ai oublié de les enlever lorsque que j'ai changé mes printf en cout, autant, le mélange des sockaddr_in et des cout ne me choquent pas plus que ça !
Mais j'essaierai de faire attention !
Merci encore !
Bye !
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 27 avril 2008 à 14:36
c'est pas l'utilisation des sockaddr_in qui me gênent, c'est le fait d'utiliser la syntaxe :
struct [type] var;
alors qu'en C++ c'est simplement
[type] var;
l'utilisation de cout montre que forcément tu es en C++ (surcharge de <<, templates, etc...) donc il faudrait utiliser la syntaxe adéquate.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 27 avril 2008 à 16:00
"il faudrait utiliser la syntaxe adéquate."
Ça, ça dépend vraiment des points de vue. En C++ (surtout), ajouter struct devant nous indique clairement que l'on travail avec une structure et non une classe ou un typedef quelconque (HANDLE et autres).
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 27 avril 2008 à 18:18
moui j'ai dit que c'était un point de vue...
de toutes manières la seule différence entre struct et class c'est l'accès public/private par défaut alors...
quant au typedef que veux-tu dire? un handle c'est jamais qu'un pointeur??
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 27 avril 2008 à 18:51
struct UneChose {
};
class UneChose {
};
typedef int UneChose;
UneChose bidule;
À partir du nom, peut-on dire, au premier coup d'oeil, qu'il s'agit d'une classe, d'une structure ou d'un int ?
Mettre struct devant a, au moins, le mérite d'identifier clairement sur quelle type de donnée on travail (si non spécifié dans le nom ex: CUneChose -> classe).
"de toutes manières la seule différence entre struct et class c'est l'accès public/private par défaut alors..."
Initialement, NON pas du tout.
Malheureusement, en C++, ils ont eu la non-brillante idée de transformer une structure en classe.
Une structure qui pouvait être utilisée pour stocker convenable et clairement des données peut maintenant contenir constructeurs fonctions et tout un barda inutile qui n'a sa place que dans une classe.
Les structures, qui avait une fonction bien précise, peuvent, maintenant, être transformé en un vague objet, un truc de plus pour mélanger les programmeurs.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 27 avril 2008 à 20:33
Pour ma part j'utilise effectivement des préfixes pour les variables;
remarquons quand même que si tu vois une structure utilisée dans un code, y aura forcément un accès aux membres donc en voyant machin.truc ou pMachin->truc tu pourras d'office pas le confondre avec un typedef sur type natif...
Après en ce qui concerne la différence struct/class...entièrement d'accord avec toi mais le fait est que les struct et les class sont équivalents alors vaut mieux jeter un coup d'oeil sur la définition à chaque fois pour vérifier si présence de constructeur ou autre chose...