[client pop3]Exception non gérée

electron159 Messages postés 10 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 27 mai 2007 - 23 mai 2007 à 07:34
electron159 Messages postés 10 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 27 mai 2007 - 24 mai 2007 à 14:06
Bonjour, 
 je suis sous visual studio, mode console.
 j'ai essayé d'adapter un client pop3 linux pour qu'il tourne sous windows. Mais, j'ai une exception, alors que je n'ai pas d'erreur :  
            Exception non gérée à 0x00411507 dans pop3.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x0000000a.
J'ai regardé du côté des pointeurs, mais je n'ai pas trouvé l'erreur.
Savez-vous d'où peut provenir cette exception?

  Merci de votre aide,
                       Alex.

Voici le code:

#include

<stdio.h>#include

<stdlib.h>#include

<errno.h>#include

<string.h>#include

<winsock2.h>#pragma

comment (
lib ,
"WS2_32.lib")
#pragma

comment(
lib,
"setupapi.LIB") 

 

#define

PACKET_SIZE 1024
int

writen(
int fd,
char *ptr,
int n);
int

readn(
int fd,
char *ptr,
int n);
int

test_OK(
char *buf,
int do_exit);
char

*server_name =
"pop.wanadoo.fr";
unsigned

short server_port=110;
char

*user=
"test@wanadoo.fr";
char

*pass=
"mdptest";
int

to_server_socket = -1;
int

main (
int argc,
char *argv[]){

struct

sockaddr_in serverSockAddr;
/* addresse de la socket */struct

hostent *serverHostEnt;
/* description du host serveur */unsigned

long hostAddr;
/* addr du serveur */unsigned

char bufw[PACKET_SIZE+1];
unsigned

char bufr[PACKET_SIZE+1];
unsigned

char list[PACKET_SIZE+1];
int

n, msg, index, retry = 4;SecureZeroMemory(&serverSockAddr,

sizeof(serverSockAddr));hostAddr = inet_addr(server_name);

if

( (
long)hostAddr != (
long)-1)memmove(&serverSockAddr.sin_addr,&hostAddr,

sizeof(hostAddr));
else

/* si on a donne un nom */{

serverHostEnt = gethostbyname(server_name);

memmove(&serverSockAddr.sin_addr,serverHostEnt->h_addr,serverHostEnt->h_length);

}

serverSockAddr.sin_port = htons(server_port);

serverSockAddr.sin_family = AF_INET;

/* creation de la socket */

to_server_socket = socket(AF_INET,SOCK_STREAM,0);

/* requete de connexion */

connect(to_server_socket,(

struct sockaddr *)&serverSockAddr,
sizeof

(serverSockAddr));SecureZeroMemory(bufw, PACKET_SIZE+1);

SecureZeroMemory(bufr, PACKET_SIZE+1);

do

{n=readn(to_server_socket,bufr,PACKET_SIZE);

retry--;

}

while(test_OK(bufr,retry==0));
/* authentification */

sprintf(bufw,

"USER %s\r\n",user);writen(to_server_socket,bufw,strlen(bufw));

n=readn(to_server_socket,bufr,PACKET_SIZE);

test_OK(bufr,1);

sprintf(bufw,

"PASS %s\r\n",pass);writen(to_server_socket,bufw,strlen(bufw));

n=readn(to_server_socket,bufr,PACKET_SIZE);

test_OK(bufr,1);

/* liste des messages dans la boite aux lettres */

sprintf(bufw,

"LIST\r\n");writen(to_server_socket,bufw,strlen(bufw));

n=readn(to_server_socket,bufr,PACKET_SIZE);

test_OK(bufr,1);

if

(strlen(bufr) == 0 )n=readn(to_server_socket,list,PACKET_SIZE);

else

CopyMemory(list,bufr, strlen(bufr) + 1) ;

/* recupération de tous les messages */

index = 0;

while

( list[index] !=
'.' ) {sscanf(&list[index],

"%100d", &msg);
while

(list[index++] !=
'\n');
/* recuperation du message msg */

sprintf(bufw,

"RETR %d\r\n",msg);writen(to_server_socket,bufw,strlen(bufw));

do

{n=readn(to_server_socket,bufr, PACKET_SIZE);

printf(

"%s",bufr);
if

( ! strncmp(
"\r\n.\r\n",&bufr[n-5],5) )
break;SecureZeroMemory(bufr, PACKET_SIZE+1);

}

while ( 1 );}

/* fermeture de la connection */

shutdown(to_server_socket,2);

close(to_server_socket);

return

0;}

int

writen(
int fd,
char *ptr,
int n){

int

nl, nw;nl = n;

while

( nl > 0 ) {nw = write(fd, ptr, nl);

if

( nw <= 0 )
return

nw;
/*error*/nl -= nw;

ptr += nw;

}

return

(n-nl);}

int

readn(
int fd,
char *ptr,
int n){
int

nl, nr;nl = n;

while

( nl > 0 ) {nr = read(fd,ptr,nl);

if

(nr < 0 )
return nr;
/*erreur*/else

if ( nr == 0 )
break;nl -= nr;

ptr += nr;

if
( *(ptr-2) '\r' && *(ptr-1)
'\n' )
break

;}

*ptr = 0x00;

return

(n-nl);}

int

test_OK(
char *buf,
int do_exit) {
char

*ptr, tmp[PACKET_SIZE+1];SecureZeroMemory(tmp, PACKET_SIZE+1);

if

((ptr=strstr(buf,
"+OK")) == NULL) {
if

( strstr(buf,
"-ERR") ) {printf(

"ERROR: -->%s<--\n", buf);exit(1);

}

if

(do_exit ) exit(1);
else

return 1;}

else {
while

(*ptr !=
'\n') ptr++ ;CopyMemory(tmp,ptr+1,strlen(ptr));

SecureZeroMemory(buf,PACKET_SIZE+1);

CopyMemory(buf,tmp, strlen(tmp));

}

return

0;}

2 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
24 mai 2007 à 08:09
Salut,
Pas super cette source. Réserver 3 fois 1025 octets c'est pas un peu beaucoup? De plus tous ces ZeroMemory font perdre plus de temps qu'autre chose. L'espace est réservé: tu mets 0 à la fin de ce qui t'intéresse et basta.

Les fonctions readn() et writen() sont inutiles: rien ne sert de ré-écrire recv() et send(). En effet ces fonctions à vertu pédagogique proviennent des travaux de Richard Stevens, censées montrer l'utilisation des primitives read et write.

Test_OK() je la trouve également très lourde.

Ajoutez à celà aucune vérification d'erreur, conclusion: poubelle. Même pas besoin de perdre son temps à le débuguer ;) Il y a des sources valables sur cppfrance... Qui utilisent le type SOCKET sur windows.
I can break the rules too, goodbye.
0
electron159 Messages postés 10 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 27 mai 2007
24 mai 2007 à 14:06
Et concrètement, d'où vient cette errreur : Exception non gérée à 0x00411507 dans pop3.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x0000000a ? :d
0
Rejoignez-nous