[Socket] Reception incomplète de taille inconnue

Signaler
Messages postés
4
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
14 avril 2010
-
Messages postés
4
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
14 avril 2010
-
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

Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
salut

Pourkoi tu n'utilise pas les fonction asynchrone ??
Messages postés
4
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
14 avril 2010

Je ne sais pas, est-ce que le problème n'est pas finalement le même ?