Probleme socket en JAVA / C

Probleme socket en JAVA / C - Programmation

Marsh Posté le 30-04-2001 à 13:45:33    

J'ai fais un programme client Java qui se connecte à un serveur programmé en C  
 
Mon probleme est que desfois (aleatoirement)le serveur recoit seulement le premier caractere de la chaine envoyée.
 
En gros, desfois ca marche, d'autres fois ca marche pas.  
 
Voila le debut de mon code java :  
-----------------------------------------  
InetAddress adresse = InetAddress.getByName (serveur);  
Socket socket = new Socket (adresse, port);  
 
DataOutputStream fluxSortie=new DataOutputStream(socket.getOutputStream ());  
DataInputStream fluxEntree=new DataInputStream(socket.getInputStream());  
 
fluxSortie.writeBytes("ma chaine de caracteres" );  
-----------------------------------------  
 
En face, le serveur fait un simple :  
---------------------------------  
char *szBuffer = new char[1024];  
recv(sock, szBuffer, 1024, NULL); // avec la gestion des erreurs  
---------------------------------  
 
Si je regarde le contenu de szBuffer, desfois il y a seulement le premier caractere, desfois toute la chaine est là.  
S'il n'y a eu que le premier caractere de recu, on peut recevoir la suite du message avec un autre recv au niveau du serveur.  
 
Enfin, en mettant un Sleep(1000) juste avant le recv, le probleme ne se pose plus, cependant ce n'est pas une méthode tres elegante de resoudre ce probleme  
 
 
Voila, est-ce un bug de java ?  
Est-ce moi qui utilise mal les socket en java ?

Reply

Marsh Posté le 30-04-2001 à 13:45:33   

Reply

Marsh Posté le 30-04-2001 à 14:05:36    

c donc un pb de synchronisation..  
tout est synchronized dans tes methodes de reception/envoi?


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 30-04-2001 à 14:32:03    

Oui, tout est synchronisé car c'est le premier message qui est envoyé/recu.
 
D'ailleurs je ne comprend meme pas comment le recv s'arrete (quand ca marche) à la fin de la chaine envoyée qui est < à 1024

Reply

Marsh Posté le 30-04-2001 à 16:01:09    

T'as essayé d'utiliser les sock non bloquantes ? J'ai fait dans une vie antérieure un petit serveur qui utilisait la fonct° WSAAsyncSelect avec les évènement FD_CONNECT, FD_READ, FD_WRITE et FD_CLOSE. Cela permet de communiquer de manière asynchrone -> transfert de fichiers, ...
Petite précision : cela n'est valable que sous windows alors si tu travaille sous un autre os il ya d'autres méthodes.

 

[edit]--Message édité par Amadeus--[/edit]

Reply

Marsh Posté le 30-04-2001 à 16:29:02    

... .Dommage, c'est deja le Select qui est utilisé (WSAAsyncSelect) ....

Reply

Marsh Posté le 30-04-2001 à 17:33:12    

Un truc peut-être bête :
 
un problème de caractère de fin de chaîne différent entre Java et C (\0) ????
 
A++

Reply

Marsh Posté le 30-04-2001 à 23:00:28    

Ah mon avis, ce que tu devrait faire c si tu n'a pas recu la chaine complete, tu recommence un recv
 
C surement du au fait que java quand tu lui demande de faire qq chose, il le fait quand il a le temps et pas quand tu lui demande ...

Reply

Marsh Posté le 01-05-2001 à 12:05:20    

Oui, c'est surement à cause du fait que c'est une sortie bufferisée, j'ai bien essayé flush() juste apres l'envoie mais ca ne change rien.
 
Y'a pas un moyen d'ecrire directement sans passer par un buffer ?

Reply

Marsh Posté le 12-06-2001 à 14:47:41    

Il faut pas envoyer des caracteres mais des bytes et la ca marche bien (prob de java c'etait pareil pour moi)

Reply

Marsh Posté le 12-06-2001 à 17:44:17    

hrolf a raison, avec des bytes au lieu de String (DataOutputStream) ça marche (pb de caractères de terminaison != en C et Java je pense).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed