Accueil > Forum > > > > Socket/send/recv
Socket/send/recv
jeudi 11 juin 2009 à 10:06:05 |
Socket/send/recv

samuraijack1412
|
Bonjour, Je suis en train d'écrire une application de "chat". Elle se compose d'un client et d'un serveur. Maintenant, je veux que le client puisse envoyer un tableau des entiers au serveur. Sur le client: int config[49]; SOCKET sock; for(i=0;i<49;i++) config[i]=100; ... send(sock,(char *)config,sizeof(config),0); Sur le serveur: int config[49]; SOCKET sock; ... recv(sock,(char *)config,sizeof(config)*sizeof(char),0); Normalement, le serveur doit recevoir un tableau de 49 valeurs 100. Mais, il a reçu un tableau de 49 valeurs dont seulement 12 premières valeurs sont 100 et les autres sont bizzares! Que je dois faire? Merci!
|
|
jeudi 11 juin 2009 à 10:11:07 |
Re : Socket/send/recv

samuraijack1412
|
Re Bonjour,
J'ai éditer ma question précédente sur Safari, alors, elle est bizzare. Voilà, mon problème est le suivant:
Je suis en train d'écrire une application de "chat". Elle se compose d'un client et d'un serveur.
Maintenant, je veux que le client puisse envoyer un tableau des entiers au serveur.
Sur le client:
int config[49]; SOCKET sock; for(i=0;i<49;i++) config[i]=100; ... send(sock,(char *)config,sizeof(config),0);
Sur le serveur:
int config[49]; SOCKET sock; ... recv(sock,(char *)config,sizeof(config)*sizeof(char),0);
Normalement, le serveur doit recevoir un tableau de 49 valeurs 100. Mais, il a reçu un tableau de 49 valeurs dont seulement 12 premières valeurs sont 100 et les autres sont bizzares!
Que je dois faire? Merci!
|
|
jeudi 11 juin 2009 à 17:55:19 |
Re : Socket/send/recv

rt15
|
Salut, 12 valeurs correctes ? Ca ressemble étrangement à 100 / 8 = 12,5.
Tu dois avoir un problème int/char quelque part. Genre config[49] déclaré en char sur le serveur.
|
|
jeudi 11 juin 2009 à 17:56:36 |
Re : Socket/send/recv
|
samedi 13 juin 2009 à 06:18:15 |
Re : Socket/send/recv

katsankat
|
Salut, le problème vient de send(sock,(char *)config,sizeof(config),0); send() ne peut envoyer que des char, il faut donc au choix: * envoyer les ints un par un APRES les avoir converti en char* * ou concaténer un char* contenant une chaine valide et l'envoyer. Utilisation d'un caractère séparateur. char buf[1500]; int len = 0; for(i=0;i<49;i++) { config[i]=100; len += sprintf(buf, "%d-", ints[i]); //tiret séparateur } printf("envoi de la chaine suivante: [%s]\n", buf); send(sock, buf, len, 0); Voila, bon courage pour la suite!
|
|
samedi 13 juin 2009 à 06:27:40 |
Re : Socket/send/recv

katsankat
|
Apparemment problème de sauts de ligne avec google chrome ici aussi.
|
|
samedi 13 juin 2009 à 07:48:59 |
Re : Socket/send/recv

samuraijack1412
|
Réponse acceptée !
Bonjour,
Merci. Mais bon, j'ai trouvé l'erreur. En fait, comme sizeof(char)=1 et que sizeof(int)=4, la taille du tableau original, en convertissant en (char *), est réduite avant d'être envoyé. Donc, il faut faire comme suivant:
send(sock, (char *)config, sizeof(config)*sizeof(int), 0);
recv(sock, (char *)config, sizeof(config)*sizeof(int), 0);
Voilà!
|
|
samedi 13 juin 2009 à 19:17:59 |
Re : Socket/send/recv

rt15
|
Sauf que c'est pas logique mais bon... Tu vas te dire, mais qu'est ce qu'il vient m'embêter celui là, mais je me lance quand même. Pour que la vérité triomphe dirons nous. Partons de ton hypothèse : sizeof(char)=1 sizeof(int)=4 C'est souvent vrai. Il faudrait vraiment que tu soit sur un serveur unix 64 bits particulier avec un compilo très particulier pour qu'il est l'idée de mettre des int de 8 octets. Prenons le code que tu as posté initialement, et qui est "bon" : int config[49]; SOCKET sock; for(i=0;i<49;i++) config[i]=100; ... send(sock,(char *)config,sizeof(config),0); Sur le serveur: int config[49]; SOCKET sock; ... recv(sock,(char *)config,sizeof(config)*sizeof(char),0);
Que vaut sizeof(config) ? Bin 49 fois la taille d'un int, c'est à dire 49 * 4 = 196. Dans le send, tu envoies sizeof(config) donc les 196 octets de ton tableau. Aucun problème. Dans ton recv, tu récupère 19 * 4 * sizeof(char). Sachant qu'un char fait un octet, tu récupères donc là aussi 196 octets. Donc ton code était juste. Du moins, le code que tu as posté ce fofo était juste. Mais ce n'était pas vraiment le code que tu as essayé sur ton poste, avec ton compilo. Le code que tu as essayé, c'était ça : int config[49]; SOCKET sock; for(i=0;i<49;i++) config[i]=100; ... send(sock,(char *)config,sizeof(config),0); Sur le serveur: char config[49]; SOCKET sock; ... recv(sock,(char *)config,sizeof(config)*sizeof(char),0);
Et oui, car que ce passe t'il avec ce code ? Rien ne change côté send, tu envoie toujours tes 49 entiers de 4 octets -> 196 octets. Par contre, côté recv, tu reçois sizeof(config) * sizeof(char). Donc sizeof(config) car un char prend un octet. Mais sizeof(config) ne vaut pas 196 vu que config est composé de 49 char. sizeof(config) = 49. Donc recv lit 49 octets sur les 196. Donc tu ne lis pas toutes les données que tu as écrites. Combien en lis-tu ? Combien y a t'il d'entier valide dans 49 octets ? 49 / 4 = 12.25. Donc tu envoyait 49 octets mais n'en lisait que 12. Par contre, ton nouveau code est tout à fait faux.  Il marche peut être. Mais il est invalide. Donc je te conseille de bien analyser la situation, de comprendre ce qu'il faut faire et de le coder. Pas faire des éssais aux hasard jusqu'à ce que ça marche.
|
|
samedi 13 juin 2009 à 19:20:04 |
Re : Socket/send/recv
|
Cette discussion est classée dans : send, serveur, config, socket, sock
Répondre à ce message
Sujets en rapport avec ce message
[serveur]telecharger fichier [ par lombredudragon ]
Avec les socket je debute et j'aimerais me faire un serveur en c ou c++ ou kan on se connect au port 23 par telnet on recoit automatiquement un fichie
probléme d'allocation mémoire ? [ par templeofboom ]
dans le cadre du développement d'une application de socket sous devcpp je me retrouve bizarrement coincé a cause d'une erreur d'allocation mémoire à
socket et serveur smtp [ par lombredudragon ]
Voila j'aimerais savoir si c'est possible d'envoyer un mail de cette maniere:#include #pragma comment(lib, "ws2_32.lib") void main(){ WSADATA WSADat
Problem De Socket [ send() ] [ par nem02004 ]
Voila jai fait un petit programme qui se connecte à 2 serveur irc differents ( bia 2 socket en thread ).Je voudrais que l'orsque un des deux serveur r
Petit Problem Pas compliké je pense [ par nem02004 ]
en fait G une infinité de socket ki commence par Sock suivi du Nieme socket ouvert:Je voudrais faire une commande ki envoi a tout les socket style:La
FTP socket, je ne recois rien de la part du serveur [ par MuPuF ]
Bonjour, j'essais de recoder des fonctions de wininet en socket, le probleme c'est que lors de ma connection au serveur ftp, il ne m'envois rien, alor
Qt, Kdev et MySQL.... [ par kokoariko ]
J'ai créé une database avec Qt, mais elle se connecte au mauvais socket :'var/lib/mysql/mysql.sock' or le socket de mysql est la :'/tmp/mysql.sock'Q:
socket envoie de text d'apres un fichier [ par hijakhakker ]
salutj'utilise recement les socket et je teste une source qui utilise les socket pour envoyer hello world a qui se connect :#include #pragma comment(l
pb de compilation (prog utilisant un socket) [ par smook ]
boujour a tous bon je vais commencer part bien vous detailler ce qui a detailler : j utilise dev c++ 4.9.9.2 et mon ^programme a pour but d ecouter un
probleme de communication entre deux programme [ par smook ]
re salut le dernier message que j ai poster c etait pour les socket et la librairie "libwsock.a" mais sayer j ai passer cette etape j ai reussi a fair
Livres en rapport
|
Derniers Blogs
MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg [MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril CERTIFICATIONS BETA .NET 4CERTIFICATIONS BETA .NET 4 par KooKiz
Les inscriptions pour les certifications beta .NET 4 ont commencé. L'inscription est offerte pour les examens suivants : - 71-511, TS: Windows Applications Development with Microsoft .NET Framework 4 - 71-515, TS: Web Applications Development with...
Cliquez pour lire la suite de l'article par KooKiz [MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2[MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2 par redo
J'imagine que la plupart d'entre vous connaissent bien et utilisent le service de traduction de Google, mais connaissez-vous celui de Microsoft . Microsoft Translator ? Effectivement, Microsoft nous annoncé le lancement version 2 de la Technologie Preview...
Cliquez pour lire la suite de l'article par redo
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|