Decouper un fichier avant le transfert via un socket

[Résolu]
Signaler
Messages postés
4
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
30 septembre 2005
-
 SpidersX -
J'espere bien que vous pourrez m'aider...



Je dois coder une application client serveur (avec un gteway au milieu) afin de transferer un fichier.



Pur l'instant tout se passe bien (les messages passe bien du client au
gateway et du gateway au serveur) mais j'aurais aimer savoir comment on
decoupe un fichier en petit block avant de les envoyer...



Je debute...



Merci d'avance

25 réponses

Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

ah non brunews 100 ko c'est beaucoup trop, j'ai fais pas mal de test de
debit en fonction de la taille du paquet, et c'est a 1ko que la
connection est la plus stable et le debit meilleur (il reste tjs a la
vitesse max de ma ligne qui est de 93 Ko/s). Et puis 100 Ko pour faire
une barre d'avancement, ça va pas se raffraichir souvent sur une petite
connection avec 16 ko/s d'upload.

Voila ! donc pour decouper un fichier voila comment ça marche.



int len;

char Buffer[1001];



//Etablir la connection

FILE* FichR=fopen("MonfichierALire","rb");

if(FichR==NULL)

{

printf("L'ouverture du fichier d'entrée a ratée\n");

return 0;

}

fseek(Fich,0,SEEK_END);

FileSize=ftell(Fich);

fseek(Fich,0,SEEK_SET);



while(!feof(FichR))

{

len=fread(Buffer,1,1000,FichR);

send(sock,Buffer,len,0);

//Calcul de vitesse enfin tout que tu veux (avec la taille récupéree plus haut)

}



fclose(FichR);

//Fermeture de la connection



Voila, je ne pense pas avoir fais d'erreur, tiens nous au courant
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

tu utilises quoi pour ouvrir le fichier ? api window ? C ? C++ ?
Messages postés
4
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
30 septembre 2005

J'utilise le langage c avec un compilateur gcc sous unix.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
C'est obligatoire de découper ?
Va bon sans découpe, aspire par passe de 100 Ko (par exemple) dans un buffer et envoie ce bloc, tu boucles ainsi tant qu'il reste des octets.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
j'ai bien dit 'par exemple', bien sur depend du matos en place, 130 Ko/s upload avec Freebox sur Paris donc...

ciao...
BruNews, MVP VC++
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

;-) quelle chance, j'habite (a 40 km au nord de perpignan) exactement a
l'oposé et j'ai une v3 donc, tjs limité a 93 Ko/s enfin bon deja ça...
Messages postés
4
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
30 septembre 2005

Merci d'avance, vraiment je suis epater de l'aide recu sur le site...



Je testerais tout en revenant de weekend, alors amusez vous bien parce que moi je part pour Boston



@ +
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Peut-être on se croise en vol, moi c'est départ Seattle demain midi pour la semaine.

ciao...
BruNews, MVP VC++
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

rrr, moi c'est lycée toute la journée ...
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

euh valide une reponse pour dire que c'est bon, si tu as un prob, je te répondrais
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Ptete tu va croisé Rita en vol aussi BruNews :)

Mais bon j'veux pas t'inquiété ;)
if(!Meilleur("Joky")) return ERREUR;<
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

Mais eux c'est quoi tout ces voyageurs !!!

j'en ais marre j'ai plus de 1200* le meme moi ! Maison --> lycée en bus

bon j'arrete de me plaindre, question, vous allez faire quoi au USA ?
démarchage ? dans ce cas la pourquoi pas le japon ? la chine ?



L'inocent mùpùf ...
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Rita c'est juste un ouragan hein lol :)

Et on voyage pas tous :)

Moi aussi vais à la fac tous les jours :)



En même temps, pourquoi voyager ? on a pas le plus beau pays du monde ? :p
if(!Meilleur("Joky")) return ERREUR;
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
On est bien d'accord Joky, aucun doute là dessus.
http://mvp.support.microsoft.com/gp/MVPSMT2005

ciao...
BruNews, MVP VC++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Envoyé des paquets de 1ko ???
Niveau optimisations j'ai vu mieux.

Tu as fait des test de débit et pour toi 1ko va bon... A mon avis t'as pas du faire les bons test.

Les sockets transmette au maximum des paquets de 8Ko.
En envoyant des paquets de 1Ko, tu va bouffer de la bande passante inutillement.

Les paquets contiennent des entetes, plus tu réduira la taille des paquets, plus tu auras d'entete a tranférer.

Procède par bloc de 8Ko, et envoie ca tel quel, tu sera au maximum des performances autorisées par les socket, et ceci quel que soit la connexion utilisé.

Shell
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

la j'ai du mal, j'ai testé pas
mal de taille de paquet, et le 1 était le meilleur ceci dit je suis
jamais monté a plus de 3 Ko (vus que ça aillait en se dégrandant). Je
vais tester 8 Ko
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

Oulala oui, c'est pas mal 8, le debit est plus stable, (je passait de
88 a 100 Ko/s) now je suis tjs entre 91 et 94 ko/s, merci, DeathCrash
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
No soucis,

Si tu veux encore plus optimisé le transfert passe en UDP.
Le TCP, control tout les paquets et transmet des entetes bien plus grosse que l'UDP.

Le seul incovénient avec l'UDP, c'est que tu n'as aucune garantie sur le bon transfert des fichiers.

Pour y palier tu peux utiliser un checksum en fin de trame, c'est ce que font la plupart des soft de transfert de data.

Shell
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

8ko c'est la taille des buffers d'un socket par defaut, pas la taille maxi d'un paquet.

La taille d'une trame n'est pas vraiment limitée, mais il vaut mieux la
choisir de facon a eviter la fragmentation des trames au niveau ip. Par
exemple, emule utilise des trames 1400 octets.



Quant a l'udp pour transferer un fichier, c'est une mauvaise idée il n'est pas du tout fait pour ca.

Imagine la freebox de BruNews qui upload sur un 56k en province, ben tu
va etre decu quand tu va voir le pourcentages de paquets correctements
recus.
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

oui l'udp n'est pas vraiment une solution. Et je ne veux pas d'une
solution trop complexe a mettre en place, si je dois verifier l'ordre
des paquets et tout c'est un peu le bordel