Accueil > Forum > > > > Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré
Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré
samedi 5 juin 2010 à 01:56:59 |
Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

nostalgius
|
Salut tout le monde..
Là je tente d'envoyer une image (simple exemple) avec send(), une image étant un fichier binaire elle contient des caractère non-imprimable tel que le '\0' (caractère nul) et là mon send() s'arrête sur le premier '\0' rencontré.
quelqu'un a une solution ?
(à part recourir à un encodage base64 ou quelque chose de semblable).
Merci d'avance.
:: un simple curieux ::
|
|
samedi 5 juin 2010 à 10:32:46 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

TychoBrahe
|
Réponse acceptée !
Salut,
Je serai curieux de voir ton code, en particulier la manière donc tu calcules la longueur de la chaîne à envoyer. Si tu utilises un strlen() pour calculer cette longueur alors il est parfaitement normal que ça s'arrête au premier \0 rencontré.
|
|
samedi 5 juin 2010 à 11:59:51 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

nostalgius
|
Merci!! en faite j'utilisai strlen() pour spécifier la taille des données à envoyer, là je donne comme paramètre la taille de mon fichier et ça marche!!
Merci encore
Voici ma fonction envoi_fichier, si vous avez des remarques pour
|
|
samedi 5 juin 2010 à 12:08:17 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

nostalgius
|
Merci!! en faite j'utilisai strlen() pour spécifier la taille des données à envoyer, là je donne comme paramètre la taille de mon fichier et ça marche!!
Merci encore
Voici ma fonction envoi_fichier, si vous avez des remarques pour l'améliorer:
Code C/C++ : int envoi_fichier(SOCKET sur_socket, char* fichier)
{
FILE *p_fichier;
p_fichier = fopen(fichier, "rb");
if (p_fichier == NULL) return 0;
puts("\n\touverture fichier source");
int longueur = 0;
while (!feof(p_fichier))
{
fgetc(p_fichier);
longueur++;
}
fclose(p_fichier);
printf("\n\ttaille fichier: %d", longueur);
unsigned char* contenu_fichier;
contenu_fichier = malloc(longueur*sizeof(char));
puts("\n\tinitialisation conteneur");
int i;
for(i=0; i<longueur+1; i++) contenu_fichier[i]= '\0';
p_fichier = fopen(fichier, "rb");
if (p_fichier == NULL) return 0;
i=0;
while (!feof(p_fichier))
{
contenu_fichier[i] = fgetc(p_fichier);
i++;
}
fclose(p_fichier);
char t_donnees_a_envoyer[10] = {0};
sprintf(t_donnees_a_envoyer, "%d", longueur);
if(send(sur_socket, t_donnees_a_envoyer, strlen(t_donnees_a_envoyer), 0) == SOCKET_ERROR) return 0;
if(send(sur_socket, &t_donnees_a_envoyer[strlen(t_donnees_a_envoyer)+1], 1, 0) == SOCKET_ERROR) return 0;
if(send(sur_socket, contenu_fichier, longueur ,0) == SOCKET_ERROR) return 0;
free(contenu_fichier);
return 1;
}
|
|
samedi 5 juin 2010 à 14:52:21 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

TychoBrahe
|
De rien ;)
si vous avez des remarques pour l'améliorer
Oui, mapper le fichier en mémoire est bien plus efficace. A noter que mmap() n'existe aps sous windows, il temfaudra regarder les différentes documentation pour trouver un équivalent (j'ai connais un pour le C++ sous windows mais pas pour le C).
Un exemple d'implémentation sur un système GNU/Linux :
Code C/C++ : #include <sys/types.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int send_file(int so, const char *file)
{
struct stat st;
int fd;
int nbw;
char *addr;
fd = open(file, O_RDONLY);
if (fd == -1)
{
perror("open");
return -1;
}
fstat(fd, &st);
addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED)
{
perror("mmap");
return -1;
}
nbw = send(so, addr, st.st_size, 0);
if (nbw != st.st_size)
{
perror("send");
munmap(addr, st.st_size);
return -1;
}
return munmap(addr, st.st_size);
}
|
|
samedi 5 juin 2010 à 14:55:25 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

TychoBrahe
|
Errata: j'ai oublié le close() (à ajouter juste après le mmap().
Avec les lignes précédentes et suivantes ça donne :
Code C/C++ :
/* ... */
addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
if (addr == MAP_FAILED)
/* ... */
|
|
jeudi 24 juin 2010 à 11:07:10 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

nostalgius
|
Re TychoBrahe.
Désolé pour mon retard. je suis un peu débordé ces derniers temps  .
Je vais essayer de trouver une équivalente sous Windows. en attendant ça consiste en quoi "mapper le fichier en mémoire"
Dslé encore et Merciii 
|
|
jeudi 24 juin 2010 à 11:28:17 |
Re : Problème envoi chaine binaire: send() s'arrête sur le premier '\0' rencontré

TychoBrahe
|
Salut,
en attendant ça consiste en quoi "mapper le fichier en mémoire"
Tout simplement à le charger dans la mémoire afin d'y avoir directement accès. Bref, tu récupère un pointeur vers un espace mémoire contenant le fichier. Pour caricaturer, c'est un peu comme un gros malloc dans lequel on copie le fichier. La différence la plus notable est que mmap est bien plus "intelligent" (optimisation de l'utilisation réel de la mémoire etc).
Quelques liens :
mmap() sur Wikipedia
man 2 mmap
|
|
Cette discussion est classée dans : send, binaire, premier, rencontré, arrête
Répondre à ce message
Sujets en rapport avec ce message
premier prog C++ graphique et Dev C++ 4.0 [ par zoophage ]
Salut !je suis plus ou moins débutant en C++ et c'est pour ça que j'utilise dev c++ qui a le mérite d'être gratuit et facile à utiliser.Seulement, voi
Mettre une fenette en premier plan et l'activer [ par atao ]
QQun connait il une façon plus élégnate pour mettre une fenette en premier plan et l'activervoid MettreFenetreDevant(HWND hwndDlg){// car si elle est
Compilation avec G++ [ par merlin ]
voila je bosse sous beos linux bref sous unix et n'arrive pas a creer un fichier binaire mais pas elf ni a.out un binaire ( code machine ) y a t'il kk
BINAIRE [ par lahou ]
Comment peut-on faire pour avoir le code binaire d'un caractère ?MerciLahouPS : g pas trouvé ds les sources ni ds le forum !!!
telecharger un fichier [ par Xs ]
On fait comment pour telecharger un fichier ?je suppose qu'il faut demander au serveur de l'ouvrir en binaire puis utiliser une boucle du typewhile(!f
Lire et ecrire dans un fichier en mode binaire [ par vbnul ]
Je cherche comment lire et ecrire dans un fichier en mode binaire car on ne peut lire certains "caracteres" binaires dans les EXE par exemple.qqn pour
Quelle API pour mettre en premier plan une autre fenetre ? [ par Kheo ]
Afin d'eviter d'avoir plusieurs instance de mon soft en memoire au tout debut j'effectue un FindWindow sur le titre de mon soft. S'il ne trouve rien j
HELP !!! Après plantage fichiers cpp transformés en binaire : code perdu !!!!! [ par ngryman ]
J'y crois pas ! J'ai lancé mon progrmme, il a planté, une erreur windows s'est produite et j'ai redémarré mon pc, et après le fichier cpp principal de
Envoi d'un mot binaire [ par seblutfr ]
Bonjour à tous,Je suis en train de préparer en VB une appli qui se charge de créer un mot binaire de 25 éléments. Ce mot doit ensuite être envoyé vers
conversion decimal binaire sans connaitre la taille du nombre [ par kobee12 ]
Est ce que quelqu'un pourrait m'aider. Voici un algo qui convertit un nombre binaire en decimal :bin_digits est defini avec une taille de 10. Or j'aim
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|