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