Pb Socket et fichier - C - Programmation
Marsh Posté le 07-12-2005 à 21:14:58
xelad a écrit : Bonsoir,
|
Hum... quand tu fais "send(msgsock, fichier_a_envoyer, sizeof(fichier_a_envoyer), 0)"; tu envoies sur ta socket une variable de type "FILE *" et la fonction "send" (qui envoie le pointé de ce qu'on lui passe) va envoyer benoitement le contenu de la structure "FILE" (qui doit sûrement commencer par 4 octets bien particuliers...)
Bon, tu y envoies ce que tu veux sur ta socket... mais moi j'aurais plutôt fait "send(msgsock, chaine, nb_lu, 0)"
Idée de test ? T'as qu'à afficher la valeur hexa des 4 premiers octets de "*fichier_a_envoyer"
Marsh Posté le 07-12-2005 à 22:17:18
merci sve@r,
Le probleme doit se situer dans les environs en effet. mais comme il s'agit de l'envoi d'un fichier binaire apprement on est obligé de passer par "FILE *fichier_socket=fdopen(msgsock,"w" );" sinon d'apres ce que j'ai cru comprendre dans d'autres topics y'a des problemes avec des \n attendus qu'il n'y a pas dans les fichiers binaires. Je vais essayer quand meme...
Marsh Posté le 07-12-2005 à 23:06:10
xelad a écrit : merci sve@r, |
Pas du tout !!!
Tu ouvres ton "capture.jpg" en mode "rb" et c'est tout. De plus je ne sais pas à quoi sert "fdopen()" mais je m'en suis jamais servi pour transférer des infos via socket...
T'as qq exemples simples sur ce document http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
Marsh Posté le 08-12-2005 à 00:48:31
Bon bah j'ai beau tout essayer j'ai toujours 4 octets de trop, et toujours les memes.
Marsh Posté le 08-12-2005 à 06:50:48
xelad a écrit : Bon bah j'ai beau tout essayer j'ai toujours 4 octets de trop, et toujours les memes. |
Essaye ce code:
#include <sys/types.h> /* Types prédéfinis "c" */ |
C'est un client destiné à communiquer avec un serveur via un n° de port défini dans le fichier "/etc/services" sous le label "essai/tcp"
Il attend un argument qui est le nom du serveur mais prend "localhost" par défaut
Une fois le client connecté sur le serveur, il attend une chaîne et l'envoie au serveur. Normallement, le serveur associé est censé attendre un client et afficher ensuite la chaîne reçue.
Le client s'arrête dès qu'on tape la chaine "EOT"
Ptet que tu devras l'adapter un peu (je suis pas certain que la structure "hostent" contienne un membre "h_length" sous Linux) mais il fonctionne.
Moi j'utilisais "write" pour envoyer mes infos au serveur mais tu peux utiliser "send" si t'en as envie...
Marsh Posté le 12-12-2005 à 17:12:32
Merci pour toutes ces réponses Sve@r. Mon binome qui travaille sur le client Java à "contourné" le probleme en extrayant les 4 octets en question après la récéption du fichier. C'est pas terrible mais ça marche maintenant. Merci encore
A++++++++++
Marsh Posté le 13-12-2005 à 11:46:01
xelad a écrit : Merci pour toutes ces réponses Sve@r. Mon binome qui travaille sur le client Java |
Tu veux dire "serveur Java" !!!
xelad a écrit : à "contourné" le probleme en extrayant les 4 octets en question après la récéption du fichier. C'est pas terrible mais ça marche maintenant. Merci encore |
Euh... très dangereux ce truc !!! Si l'erreur vient d'un bug de ton code, le bug est resté !!!
C'est comme si on soignait un bras cassé en donnant des anti-douleurs... la douleur disparait mais le bras reste cassé !!!
Passe-moi via msg privé le code complet de ton client. Je le compilerai et le mettrai en dialogue avec mon serveur voir ce qu'il reçoit...
Marsh Posté le 13-12-2005 à 12:04:18
En fait c'est le serveur qui est en C, je m'explique :
Le but du projet (scolaire) est de faire un serveur qui créé des screenshots à la demande du client. Le serveur reçoit une demande de screenshot, créé le screenshot et l'envoie au client java. C'est donc bien le serveur qui est en C puisqu'il reste tout le temps 'à l'écoute'.
Je te poste mon code ce soir (je l'ai pas sous la main), meme si le projet est terminé (en bricolant coté client, c'est vraiment pas terrible, tu as raison) j'aimerai bien savoir ce qui se passe...
Merci
Marsh Posté le 14-12-2005 à 15:57:14
Le fichier main_server.c
Code :
|
Marsh Posté le 14-12-2005 à 15:58:58
Le fichier mod_datagram_srv.h
Code :
|
Marsh Posté le 14-12-2005 à 16:01:10
J'avais fait ce code pour faire un serveur qui executait des requetes SQL et qui formatait les réponses pour les renvoyer à un client C. Je l'ai réutilisé pour ce nouveau projet.
Marsh Posté le 07-12-2005 à 18:53:24
Bonsoir,
J'ai un souci avec un probleme de socket pour envoyer un fichier binaire entre 1 serveur en C et un client Java.
Le but et d'envoyer un fichier JPG à la demande du client Java.
Voici le code permettant l'envoi du fichier capture.jpg :
Le problème (accrochez-vous...) c'est qu'il y a 4 octets qui sont ajoutés comme par magie au début du dernier bloc, c'est à dire qui si le fichier fait 1030o par ex, le client va recevoir 1034o avec les blocs suivant : [1024, 10] au lieu de [1024, 6]. Il faut préciser aussi que les 4 octets en question sont toujours identiques en valeur. Pour les tests, j'ai mis HELLO dans capture.jpg, la sortie du printf("%o\n",chaine[j]); correspond bien au code ASCII de HELLO donc le "fichier_a_envoyer" semble bon.
Si vous avez une idée de test pour isoler plus précisement le pb ou carrément la solution... merci pour vos réponses.
Message édité par xelad le 08-12-2005 à 00:49:34