Problème pour lire un flux de byte en C# [Resolu (Merci MagicBuzz)] - C#/.NET managed - Programmation
Marsh Posté le 02-04-2003 à 19:57:48
T'es sûr que "intSize" est plus grand que "tcpclnt.ReceiveBufferSize" ?
Marsh Posté le 02-04-2003 à 20:06:18
MagicBuzz a écrit : T'es sûr que "intSize" est plus grand que "tcpclnt.ReceiveBufferSize" ? |
affirmatif. En tout cas (testé via l'interface web du webservice), "intSize" contient bien la taille du fichier. Donc en tout état de cause, "tcpclnt.ReceiveBufferSize" est <= a "intSize" (il envoiie que le contenu du fichier, sans balise ou autres fioritures).
De plus, je recupere dans une autre fonction le tableau de bytes retourné et j'enregistre ca dans un fichier, dont la taille vaut "intSize". Le début est bien rempli, mais la fin du fichier est rempli de 0 (en hexa).
Marsh Posté le 02-04-2003 à 20:18:26
OK.
Bon, alors ça doit être bêtement que tu dépasses la taille du buffer winsocks (ça doit être dans les 4 Ko je crois)
T'as essayé d'envoyer ton fichier en petits morceaux ?
Marsh Posté le 02-04-2003 à 20:29:57
mmmm, ouais en fait, j'ai dû dire une connerie, après vérification, il n'a pas l'air d'y avoir de taille maximum de buffer.
vais voir si j'arrive à faire un truc qui marche, et si c'est le cas, je te le poste;
Marsh Posté le 02-04-2003 à 20:31:17
MagicBuzz a écrit : OK. |
ca passe encore par winsock ??? ca date de win95 ca qd meme. Depuis le temps, je pensais qu'ils avaient mis autre chose. 4 ko c'est peu. Pour un fichier pdf de 300 ko, ca en fait des petits morceaux...
Surtout que dans l'hyper terminal, je recois bien tout (avec le meme serveur qui envoit le fichier d'un seul bloc, et pas en petit morceau de 4k). Donc, c'est pas logique ca. Comment recevoir 4k par 4k, si on envoie tout d'un coup ? Faudrait envoyer aussi 4k par 4k non ? ce qui n'est pas le cas, puisqu'avec l'hyper terminal ca marche...
Marsh Posté le 02-04-2003 à 20:34:11
MagicBuzz a écrit : mmmm, ouais en fait, j'ai dû dire une connerie, après vérification, il n'a pas l'air d'y avoir de taille maximum de buffer. |
merci, je commence a péter un cable là... surtout que sur la plateforme de développement qu'on impose je n'ai pas acces au debugger (super pour les webservice...))
Marsh Posté le 02-04-2003 à 21:09:32
Euh...
C pas gagné
T'ain, ça fait un bout de temps que j'ai pas fait de C#, et J'arrive même pas à lire un fichier
Y'a quoi qui cloche dans mon code
Code :
|
J'ai cette erreur dès la lecture du premier block de 1 Mo :
Ca plante sur la ligne :
Code :
|
Citation : An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll |
D'où y'a une merde ?
Le buffer "contenu" est rempli.
Length < Position
Par moment, le débugguer me met en rouge la moitié des valeurs dans le buffer.
Deplus, là il met en rouge fichier.Position, la valeur du caption, et la taille du tableau du buffer.
J'ai réessayé avec 1024 comme BUFFER_SIZE, mais rien n'y fait.
Deplus, il me semble que c'est cette méthode que j'utilisais à l'époque quand j'avais fait un prog qui lisait par block de 5 Mo (ce qui me donnait le meilleur résultat au niveau perfs)
C vraiment pas gagné, d'ici que j'arrive à faire tourner le winsock...
Marsh Posté le 02-04-2003 à 21:17:30
... quel crétin des Alpes
Le prochain coup, je lirai les defs des paramètres dans les fonctions
OffSet de "Read" c'est l'offset dans le tableau, pas dans le fichier
Marsh Posté le 02-04-2003 à 21:24:54
C'est koi tes lignes "Using" ?
Je trouve pas TcpClient dans les libs de .NET, et je trouve encore moins le composant que tu utilises si c'est un composant.
hey mais je suis bigleux ce soir moi...
System.Net.Sockets.TcpClient
Marsh Posté le 02-04-2003 à 21:28:34
MagicBuzz a écrit : C'est koi tes lignes "Using" ? |
using System.Text;
using System.Net.Sockets;
Edit: grillaid
Bon, c'est pas gagné non plus pour toi a ce que je vois.
Le meilleur truc que j'ai obtenu c'est avec une boucle while (i<intSize) qui lit avec des beginRead. Ca lit bien bloc par bloc, par contre qd je copie le tableau de bytes fraichement lue dans un tableau de byte (celui que je renvoie a la fin) ca copie rien. J'ai tout essayé (.setValue, .CopyTo, une copie avec boucle for() byteResultat[i]=byteLue[i] etc...)
Marsh Posté le 02-04-2003 à 22:34:27
Bon, c'est sur la bonne voie, j'ai juste un petit problème à la con, et après je poste mon truc, ça a l'air de marcher sans problème.
(par contre, c'est codé à la vas-y comme j'te pousse, en monothread et tout )
Marsh Posté le 02-04-2003 à 22:41:52
Bon, voilà, mon truc marche.
PS: je transmet pas la taille du fichier, ce qui fait que le fichier créé est un multiple de "BUFFER_SIZE" de taille immédiatement suppérieure à la taille du fichier.
Server :
Code :
|
Dans l'initialisation de textbox1 :
Code :
|
Client :
Code :
|
Marsh Posté le 02-04-2003 à 22:43:00
T'ain y'a des fois, je me dis que je suis trop une brute
Ma première appli qui utilise des socks [ : petite_larme ]
PS: Cherche pas à comprendre les commentaires, c'est des bouts résiduels de mes bugs, et des bouts d'exemples dont je me suis basé
PS: ça marche bien, je m'ensuis servi pour déplacer d'un disque à l'autre (super utile les socks pour ça ) un fichier JPG de taille inférieure au buffer, un MP3 de taille 1 fois suppérieure au buffer, et un DivX un peu énorme. Tout est passé.
dernier PS : cherche pas à comprendre pkoi j'envoie par morceaux, et que je lis/écrit aussi par morceaux dans le fichier. d'après la doc, la couche socks de windows s'en charge, mais j'aime pas, je préfère lire par petits bouts, ça évite entre autre d'avoir des tableaux de byte en mémoire de 800 Mo (pour mon divx par exemple... 2x 800 Mo, j'aurais presque saturé ma RAM )
Marsh Posté le 03-04-2003 à 12:21:11
Reply
Marsh Posté le 02-04-2003 à 19:25:55
bonjour,
j'ai un problème pour lire des données sur une socket (un flux de byte dont je connais la taille par avance (intSize en paramètre): ca ne lit pas tout, juste une partie.
Le programme qui envoie les données marche normalement (i.e. il envoie tout). J'ai essayé plein de trucs différents et aucun ne marche. Le mieux que j'ai trouvé c'est un while avec beginRead, mais meme la il me manque un bout à la fin.
Si quelqu'un avait un bout de code fonctionnel, ca m'aiderait bien.
Nota: le flux de données est un flux binaire quelconque (un fichier PDF dans mes tests).
D'avance Merci
Le code problèmatique (il est dans un web service):
//Entrée: str : la commande a envoyer sur le serveur pour déclencher l'envoie du fichier
//strHost : l'hôte à appeller (i.e. le serveur)
//intSize : la taille du fichier que l'on va recevoir
Message édité par ToxicAvenger le 03-04-2003 à 22:37:51