Raw Socket, debug ok, release pas ok

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 20 déc. 2005 à 02:42
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 21 déc. 2005 à 19:56
Salutations,



J'ai créé un socket comme suit pour sniffer les paquets destinés à mon ip (les if SOCKET_ERROR ont été otés ici):



m_Sock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );

bind( m_Sock, (SOCKADDR*) &m_Sin, sizeof(m_Sin) );

WSAIoctl( m_Sock, SIO_RCVALL, &m_Optval, sizeof(m_Optval), NULL, 0, &m_dwBytesRet, NULL, NULL ) ;



Pas de problème en debug, le sniffer recoit des paquets.

Par contre, en release, la creation du socket reussit mais aucun paquet n'est intercepté.



Comment résoudre ce problème ?



Merci

8 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
20 déc. 2005 à 12:51
Il n'y a pas de bug donc pas d'overflow dans les mémoires que j'ai
allouées, juste des paquets non reçus :(. Je n'ai pas envie de devoir
compiler en debug et encore moins de découper le programme.en 2 pour
faire une partie en debug et l'autre en release.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
20 déc. 2005 à 18:19
Salut,

Met tout le code utile parceque la avec ces 3 lignes on peut pas dire grand chose..

Comment remplis tu m_Sin ?
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
21 déc. 2005 à 01:46
/*-------------*/


// Constructor //


/*-------------*/


CSniffer::CSniffer(HWND h)


{


m_hList = h;


m_ppRawData = NULL;


m_dwNumPackets = 0;





WSAStartup( MAKEWORD(2,0), &m_Wsa );





// Get local IP


hostent * host;


char szHostName[256];


in_addr myaddr_in;


gethostname(szHostName, sizeof(szHostName));


host = gethostbyname(szHostName);


memcpy(&myaddr_in, host->h_addr, host->h_length);





// Config du socket


m_Sin.sin_family = AF_INET;


m_Sin.sin_addr.s_addr = inet_addr(inet_ntoa(myaddr_in)) ;





// Création


m_Sock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );


bind( m_Sock, (SOCKADDR*) &m_Sin, sizeof(m_Sin) );





// Receive every data


WSAIoctl( m_Sock, SIO_RCVALL, &m_Optval, sizeof(m_Optval), NULL, 0, &m_dwBytesRet, NULL, NULL ) ;


}











Et ensuite pour chopper les données:





while (1)


{


memset( m_packet, 0, sizeof( m_packet ) ) ;


recv( m_Sock, m_packet, sizeof(m_packet), 0 );


.....


}





En debug pas de problème, la fonction recv fonctionne, par contre en release, le programme reste bloqué dessus.




En ajoutant


unsigned long ul = 1;


ioctlsocket(m_Sock, FIONBIO, (unsigned long *) &ul);

pour eviter que la fonction recv soit bloquante le debug recoit une
multitude de paquets 'vides' dont les autres paquets attendus, alors
qu'en release, TOUS les paquets sont 'vides'.





Je programme sous VC++ 6.0 Windows XP Home Edition.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
21 déc. 2005 à 01:59
Hop !



Ce sniffer est sujet du même problème chez moi: ok en debug plus ok en release.

http://www.cppfrance.com/code.aspx?id=21797



Pitiéééé ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
21 déc. 2005 à 10:20
salut
un bug pas reproductible par ceux a qui tu demandes est pas corrigeable par ceux a qui tu demandes.
Copie colle tout ton code, ou bien mets le .rar quelque part ou on puisse y acceder.

Dis toi que si ca marche en debug, mais pas en release ca vient forcément de ton code qui est buggé, et pas d'un mystere de l'univers.

deja ca:

while (1)
{
memset( m_packet, 0, sizeof( m_packet ) ) ;
recv( m_Sock, m_packet, sizeof(m_packet), 0 );
.....
}
c'est moyen (tu testes pas la valeur de retour de recv)

allez a +
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
21 déc. 2005 à 18:52
Ailowe,



Hou que si, c'est reproductible, facilement même, inévitablement malheureusement .


C'est la deuxième fois que j'ai besoin d'inclure un sniffer dans un de
mes projets et c'est aussi la deuxième fois que j'ai le problème, je ne
souviens plus de quelles sources j'ai fait des copier coller mais elles
étaient différentes.


Je n'ai d'ailleurs pas trouvé de sniffer qui fonctionne en release.





C'est évident que ce sont les programmes qui bugge car les fontions
réseaux sont déjà compilées donc ne peuvent être source de cette
différence debug-release.


Mon code (le plus simple) liste dans un report list windows les paquets IP reçus. C'est quasiement le même que celui dont j'ai donné la source, en plus compliqué.


La faute est peut-être due à mon compilateur.

Je vous serais reconnaissant de tester le programme "
http://www.cppfrance.com/code.aspx?id=21797" en release avec vos
compilateurs.





Je peux si vraiment vous le voulez uploader mon code sur mon site mais je ne vois pas trop l'utilité.








! Joyeux Noël !
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
21 déc. 2005 à 19:23
Salut,

Ce sniffer est sujet au meme probleme que toi car le code est quasiment identique.

Effectivement chez moi cela ne fonctionne pas en release, mais il ne
faut pas accuser le compilateur ou meme les apis, cela vient forcement
du code.



L'exemple de sniffer que l'ont peut trouver dans l'ebook que je
distribue très (trop ?) souvent fonctionne très bien en debug et en
release:

http://betouchi.free.fr/doc_et_ebook/prog_reseau/exemples-network2.zip

dans le chapitre 7.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
21 déc. 2005 à 19:56
Merci beaucoup !



Ca fonctionne mais je ne comprends pas pourquoi ... j'ai seulement changer

m_Sock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );

en

m_Sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);



Désolé je n'avais pas trouvé cet exemple en cherchant les sniffers sur cppfrance.



Rassure-toi je n'ai pas accusé les API, juste emis l'hyothèse que mon
compilateur pouvait me jouer des tours (il est instable sur mon PC,
j'avais du le réinstallé car il bloquait pendant le linking 2 fois sur
3). Si, j'ai fini de raconter ma vie.



Merci encore @+ et le fameux Joyeux Noël !
0
Rejoignez-nous