begin process at 2012 05 28 15:15:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Chaine de caractères Via Socket


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Chaine de caractères Via Socket

vendredi 28 janvier 2011 à 09:02:28 | Chaine de caractères Via Socket

baptchr55

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.

De + je n'arrive pas à recevoir des caractères sur le "serveur"!

Merci d'avance...

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


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#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 <iostream>

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 : "<<buffer<<endl;
sock_err = send(csock, buffer, 32, 0);

}

else{ printf("Erreur de transmission\n");}
}

/* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
shutdown(csock, 2);
}
}

/* Fermeture de la socket */
printf("Fermeture de la socket...\n");
closesocket(sock);
printf("Fermeture du serveur terminee\n");
}


}

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

return EXIT_SUCCESS;
}


******************** Client ****************


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#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;

}
vendredi 28 janvier 2011 à 14:27:47 | Re : Chaine de caractères Via Socket

aardman

Membre Club
Salut,
send() et recv() ne manipulent pas des chaines de caractères (le fait qu'ils prennent des char* comme argument est trompeur) mais des octets.
coté serveur, tu envoies bien ta chaine suivie de son zéro final, mais pas seulement puisque tu envoies 32 octets alors que buffer contient la chaine "Bienvenue sur le serveur UPA". il y a donc un premier problème ici.
coté client, tu n'as qu'un recv, autrement dit tu supposes que tu va recevoir d'un coup tout ce qui t'a été envoyé par le send, ce qui n'est pas garanti. il se peut donc que tu fasses un printf sur buffer alors même que buffer ne contient pas de chaine de caractères valide (pas de zéro final).



lundi 31 janvier 2011 à 19:40:48 | Re : Chaine de caractères Via Socket

baptchr55


En effet ces sockets me posent bien des problèmes... J'ai essayé 50codes différents remodelés à ma sauce sans succès... J'obtiens bien des connexion, cette partie je la maitrise. Mais en ce qui concerne la réception, ce n'est pas la meme histoire... !!!

Je ne sais + vraiment comment m'y prendre... !!!

Merci de ce début de réponse !


Cette discussion est classée dans : include, socket, sin, sock, sockaddr


Répondre à ce message

Sujets en rapport avec ce message

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 Problèmes avec les Socket [ par baptchr55 ] Bonjour à tous, Je suis ennuyé avec la création de socket. J'aimerais pouvoir envoyer des données (dans un premier temps que j'écris) une par une se Pb chaine de caractères [ par baptchr55 ] 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, se Reseaux/Sockets pb client/serveur [ par Rayn3d ] Bonjour tous le monde, j'ai un probleme avec un programme en reseaux client/serveur : lorsque j'envoie un message au client il se decoupe en plusieu Socket C et api [ par shadow1779 ] Bonjour,j'ai un petit prob avec un bot que j'essai de faire avec l'api et les sockets en C, pour l'instant on ne peux que cliquer sur le bouton connec 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 serveur multi-client [ par Mick7 ] je m'explique je suis arrivé a creer un serveur qui peut accepter 2 client mais le probleme est que si j'essaye de creer les 2 sockets sur le meme por Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils Problème de connexion Socket [ par qhhu ] Bonjour !En temp normal, je programme en java, mais j'ai voulu essayer le c++parce que je trouve que c'est interessant de connaître plusieurs language socket trop lents [ par cid7777777 ] bonjour,jessaye de faire un jeu qui peu se jouera 2 en reseau local.je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales