Probleme socket ...

Résolu/Fermé
gacki Messages postés 109 Date d'inscription mardi 23 avril 2013 Statut Membre Dernière intervention 15 mars 2016 - 17 oct. 2015 à 03:12
gacki Messages postés 109 Date d'inscription mardi 23 avril 2013 Statut Membre Dernière intervention 15 mars 2016 - 23 nov. 2015 à 01:51
bonsoir,

S'il vous plait j'ai besoin d'aide dans un code que je suis entrain d'ecrire en C. en fait j'essaye d'apprendre les sockets en C mais ils ne marchent pas en fin le coté client qui ne marche pas surtout dans la fonction write une fois le programme arrive à cette fonction il se termine authomatiquement, pourquoi ? j'en sais rien j'ai beaucoup chercher sur google mais toujours je ne comprend pas le probleme.
bon voila le code que j'est ecris :
coté serveur :
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

struct sockaddr_in name;
struct sockaddr client;

main()
{
	printf("création de la socket : ");
	int maSocket = socket (AF_INET, SOCK_STREAM, 0);
	if(maSocket != -1)
	{
		name.sin_port = htons (2222) ;
		name.sin_addr.s_addr = INADDR_ANY ;
		int validation = bind(maSocket, (struct sockaddr *)&name, sizeof(name));
		printf("validation : %d\n\n",validation);
		if(validation == 0)
		{	
			if(listen(maSocket,5) != -1)
			{
				int lent = sizeof(client);
				int li = accept(maSocket, &client, &lent);
				if(li != -1)
				{
					printf("il y a %d qui est connecter\n",li);
					char chaineLu[100]; 
					read(li, chaineLu, sizeof(chaineLu));
					printf("message du client : %s\n",chaineLu);
					printf("socket fermer");
				}
				else
				{
					printf("erreur durant l'accepte de la cnx !\n");
				}
			}
			else
			{
				printf("erreur au niveau du listening");	
			}
		}
		else
		{
			perror("probleme au niveau de la fonction bind   ");
		}
	}
	else
	{
		printf("probleme au niveau de la socket !");
	}
}


coté CLIENT (la ou il y a probleme) :===================

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

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

struct sockaddr_in name;

main()
{
	printf("création de la socket : \n");
	
	int maSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
	name.sin_addr.s_addr = inet_addr ("127.0.0.1") ;
	name.sin_port = htons (2222) ;
	printf("I am in %d\n",maSocket);
	if(maSocket > -1)
	{
			printf("I am in");
			if(connect(maSocket, (struct sockaddr *)&name, sizeof(name)) != -1)
				{
					printf("I am in 2");
					char *chaineEcrit = (char *)malloc(sizeof(char)*100);
					strcpy(chaineEcrit,"je suis client 1"); 
					int s = write(maSocket, chaineEcrit, sizeof(chaineEcrit));
					
					perror(" ");
					close(maSocket);
					printf("socket fermer cote client\n");
				}
				else
				{
					printf("erreur durant l'accepte de la cnx !\n");
				}	
	}
	else
	{
		printf("probleme au niveau de la socket !\n");
	}
}
 


est ce que quelqu'un pourrait me dire ou se trouve l'erreur ? et merci d'avance.

1 réponse

chris79 Messages postés 97 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
Modifié par chris79 le 24/10/2015 à 14:06
Salut,

Ton souci est lié à la confusion entre sizeof et strlen.
Je t'invite à faire qq recherches à ce sujet ;)

Pour ton client, cela devrait mieux fonctionner avec :
int s = write(maSocket, chaineEcrit, strlen(chaineEcrit));


Pour ton serveur :
La fonction read retourne le nombre d'octet lu. Il convient ensuite de bien définir la fin du buffer avec '\0' :
char chaineLu[100];
lu=read(li, chaineLu, 100);
chaineLu[lu]='\0';
printf("message du client : %s\n",chaineLu);



Enfin, beaucoup utilise les fonctions send/recv en lieu et place de write/read.
A creuser également.

++
0
gacki Messages postés 109 Date d'inscription mardi 23 avril 2013 Statut Membre Dernière intervention 15 mars 2016
23 nov. 2015 à 01:51
merci beaucoup :)
0