Pb chaine de caractères

Résolu
baptchr55 Messages postés 34 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 6 avril 2011 - 27 janv. 2011 à 17:09
baptchr55 Messages postés 34 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 6 avril 2011 - 15 févr. 2011 à 12:59
Bonjour à tous encore une fois j'ai besoin de votre aide.

J'essaye d'envoyer par le biais d'un socket une chaine de caractères. Ce qui fonctionne, seul problème, si elle est composée d'un espace la ligne transmise ressemble à ça :

Envoyé : Essai Envoi Trame (coté serveur)

Recu : Essai (coté client...)
Recu : Envoi
Recu : Trame

J'ai essayé le type "string" à la place du tableau ainsi que les pointeurs sans succès...
Je n'ai plus d'idées.

Merci d'avance...

************** Serveur *****************


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include
#include
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include

using namespace std;

#define PORT 1664
#define size 50



int main(void)
{

int erreur = 0;


SOCKET sock;
SOCKADDR_IN sin;
SOCKET csock;
SOCKADDR_IN csin;
char buffer[size] = "Bienvenue sur le serveur UPA";
socklen_t recsize = sizeof(csin);
int sock_err;

/* Si les sockets Windows fonctionnent */
if(!erreur)
{
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Si la socket est valide */
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);

/* Configuration */
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
sin.sin_family = AF_INET; /* Protocole familial (IP) */
sin.sin_port = htons(PORT); /* Listage du port */
sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Démarrage du listage (mode server) */
sock_err = listen(sock, 5);
printf("Listage du port %d...\n", PORT);

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Attente pendant laquelle le client se connecte */
printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);

csock = accept(sock, (SOCKADDR*)&csin, &recsize);
printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));


sock_err = send(csock, buffer, 32, 0);
printf("Chaine envoyée : %s\n", buffer);

while(1)
{
if(sock_err != SOCKET_ERROR)
{

cin>>buffer;

cout<<"Chaine Envoyée : "<
#include <sys/socket.h>
#include <netinet/in.h>
#include
#include
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;


#include <stdio.h>
#include <stdlib.h>


#define PORT 1664



int main(void)
{

int erreur = 0;


SOCKET sock;
SOCKADDR_IN sin;
char buffer[32] = "";

/* Si les sockets Windows fonctionnent */
if(!erreur)
{
/* Création de la socket */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);

/* Si l'on a réussi à se connecter */
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
printf("Connection à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));

/* Si l'on reçoit des informations : on les affiche à l'écran */
while(1)
{
if (recv(sock, buffer, 32, 0) != SOCKET_ERROR)
{ printf("Recu : %s\n", buffer);
//char buffer[32] = "";
}
}
/* sinon, on affiche "Impossible de se connecter" */
/*else
{
printf("Impossible de se connecter\n");
}*/

/* On ferme la socket */
closesocket(sock);
}

}

/* On attend que l'utilisateur tape sur une touche, puis on ferme */
getchar();

return EXIT_SUCCESS;

}

2 réponses

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
11 févr. 2011 à 22:46
L'erreur vient peut-être de cin,
lorqu'on rentre plusieurs mot il insere un caractère null à la place de l'espace.

Essaie comme ceci pour voir :

  
  char buffer[32]
    cin.get(buffer,32);// à la place de cin>>buffer;
 



C++dialement

Pop70
3
baptchr55 Messages postés 34 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 6 avril 2011
15 févr. 2011 à 12:59
En effet le caractère "NULL" ma posé bien des problèmes. J'ai résolu celà en identifiant dans ma trame le caractère de fin de chaine pour ensuite la stocker dans un tableau. La traiter, puis la convertir en entiers.

Merci Bcp de ton Attention.

Cordialement.
0
Rejoignez-nous