Pb reception de fuchiers

melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008 - 20 nov. 2005 à 18:02
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008 - 21 nov. 2005 à 13:13
Bonjour!

Aprés avoir galéré pas mal pour envoiyer un fichier par TCP en local,

j'ai aussi un probleme concernant la reception de ce fichier,car il me manque un morceau!! sur un 700Mo j'en perds 20, sur un MP3 ça ne se voit pas et je peux donc le lire correctment. J'ai remarqué que je ne reçcois pas le meme nombre de paquet mais on m'a precisé que 1 send != 1 receiv .

Je vous mets un peu de code:

////******************************
case FD_READ:
if( sockfichierR == wParam )
{
ReceptionFichier();
}
else
ReceiveData();
break;

case FD_CLOSE:
{
if( sockfichierR == wParam )
{
lstrcpy(ListeDl[IndexCurrentDl].etat, "Terminer");
ListeDl[IndexCurrentDl].accept = TRUE;

CloseHandle(NewFile);

UpdateListDl();
}
}
break;

////******************************
DWORD WINAPI SendFile(LPVOID lpParameter) // Fonctionne correctement !
{
for( int i = 0 ; i<=NbDl ; i++ )
{
if( CurrentFile == ListeDl[i].ID )
{
IndexCurrentUp = i;
break;
}
}
i--;


HANDLE hFile;
char dataFile[TaillePak];
DWORD len;


ListeDl[i].currentNbPak = 0;
hFile = CreateFile(ListeDl[i].chemin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL , NULL);


if(hFile == INVALID_HANDLE_VALUE)
return TRUE;


BOOL End = FALSE;

for( ; End == FALSE ; )
{
len = 0;
ZeroMemory(dataFile, TaillePak);
ReadFile(hFile, dataFile, TaillePak, &len, NULL);
send(sockfichierE, dataFile, len, NULL);
ListeDl[i].currentNbPak++;
if( len < TaillePak )
End = TRUE;
}


CloseHandle(hFile);


lstrcpy(ListeDl[i].etat, "Terminé");
ListeDl[i].accept = FALSE;

shutdown(sockfichierE, SD_BOTH);
closesocket(sockfichierE);


MyThread = CreateThread(NULL,NULL,ThreadProc,NULL,NULL,&ThreadID);


return TRUE;
}

////******************************Et voila la fonction buggée!!
BOOL ReceptionFichier()
{
BOOL Ecrire = TRUE;
char Sdata[TaillePak];
ZeroMemory(Sdata, TaillePak);
int i = 0;


recv(sockfichierR, Sdata, sizeof(Sdata), NULL);

if( NewFile == NULL )
{
for( i = 0 ; i<=NbDl ; i++ )
{
if( ListeDl[i].ID == CurrentFile )
{
IndexCurrentDl = i;
break;
}
}
NewFile = CreateFile(ListeDl[IndexCurrentDl].nom, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( NewFile == INVALID_HANDLE_VALUE )
return FALSE;
}


DWORD Verif;
SetFilePointer(NewFile, 0, 0, FILE_END);
WriteFile(NewFile, Sdata, TaillePak, &Verif, NULL);
ListeDl[i].currentNbPak++;


return TRUE;
}

Voila, desolé si j'en ai mis un peu trop!
Où est la boulette ? (ou les boulettes plutot !!!!)
Merci à tous!

Melkior_le_necrarque

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 nov. 2005 à 18:47
Je regarde juste ReceptionFichier():

pourquoi tu Write inconditionnellement TaillePak octets ???

int n = recv(...);

WriteFile(NewFile, Sdata, n, &Verif, NULL);

ne te semble pas ? si oui voir le reste sur ce principe.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
21 nov. 2005 à 13:13
OK pour cette erreur, j'ai modifié la fonction comme ceci:
BOOL ReceptionFichier()
{
char Sdata[TaillePak];
ZeroMemory(Sdata, TaillePak);

int n = recv(sockfichierR, Sdata, sizeof(Sdata), NULL);

if( NewFile == NULL )
{
int i = 0;
for( i = 0 ; i<=NbDl ; i++ )
{
if( ListeDl[i].ID == CurrentFile )
{
IndexCurrentDl = i;
break;
}
}
NewFile = CreateFile(ListeDl[IndexCurrentDl].nom, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( NewFile == INVALID_HANDLE_VALUE )
return FALSE;
}


if( NewFile == INVALID_HANDLE_VALUE )
return FALSE;


DWORD Verif;
SetFilePointer(NewFile, 0, 0, FILE_END);
WriteFile(NewFile, Sdata, n, &Verif, NULL);
ListeDl[IndexCurrentDl].currentNbPak++;


return TRUE;
}

Mais le problème est toujours présent.
0
Rejoignez-nous