[Socket] Reception incomplète de taille inconnue

neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010 - 25 mars 2010 à 08:39
neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010 - 28 mars 2010 à 10:18
Bonjour à tous,

Amis des sockets et de la programmation réseaux, ce post s'adresse à vous !

Je dois réaliser un client qui se connecte à un serveur pour y récupérer des images (pour ensuite les afficher ou les enregistrer, mais là n'est pas la question...).
Je précise d'entrée que je n'ai pas accès au sources du serveur, et que par conséquent, je ne peux que me plier aux exigences du protocole mis en place.

La communication se base sur les échanges suivants :
[LIST= 1]
[*]Mon client se connecte au serveur en TCP et ouvre une connexion que nous appellerons la connexion de contrôle
[*]Il ouvre ensuite une connexion TCP sur laquelle il se met en écoute, nous l'appellerons la connexion de données
[*] Il envoie au serveur des informations sur la connexion de données (notamment le port sur lequel il est en écoute)
[*] Le serveur se connecte sur la connexion de données
/LIST
Ensuite le client demande des images via la connexion de contrôle, et le serveur les lui envoie via la connexion de données.

J'ai entrepris de réaliser ce projet en C#. Mais voilà je me heurte à un problème :
Lorsque le serveur envoie les données de l'image, je n'en reçois pas la totalité. Et cela me semble étrange, car j'utilise les fonctions de connexion synchrones qui sont censées être bloquantes.

Voilà comment sont construits mes 2 sockets data et ctrl :
Socket data  null, ctrl null;

Socket dataInit = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
dataInit.Bind(new IPEndPoint(IPAddress.Parse(server), portData));
dataInit.Listen(1);

ctrl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ctrl.Connect(new IPEndPoint(IPAddress.Parse(server), portCtrl));
string Get = "informations sur la connexion de données...";
Byte[] ByteGet = ASCII.GetBytes(Get);
ctrl.Send(ByteGet, ByteGet.Length, 0);
                
data = dataInit.Accept();


Puis, pour recevoir les données j'appelle la méthode Receive sur la socket data.

Le problème est qu'apparemment toutes les données n'ont pas eu le temps d'arriver car je récupère seulement les X premiers octets. Mais si je "fais une pause" avant d'appeler la méthode Receive (par exemple en rajoutant une messagebox qui attend mon clic), alors cette fois je récupère bien toute les informations correctement.

J'ai essayé d'utiliser un NetworkStream, mais j'ai alors le même problème avec la méthode Read, et j'ai également essayé de boucler sur l'appel à Receive, mais là mon programme se bloque après quelques appels à Receive (appel bloquant cette fois ci ?)

Je ne sais pas du tout comment régler mon problème :/
En fait cela serait surement plus simple si je connaissais avec précision la taille des données à recevoir, qui varient en fonction de la taille de l'image (qui n'est jamais la même)

Un grand merci d'avance à tous ceux qui pourront m'aider :)
++
NiklosKoda

2 réponses

yohan49 Messages postés 380 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 août 2011 7
26 mars 2010 à 04:03
salut

Pourkoi tu n'utilise pas les fonction asynchrone ??
0
neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010
28 mars 2010 à 10:18
Je ne sais pas, est-ce que le problème n'est pas finalement le même ?
0
Rejoignez-nous