Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/12/2013, à 12:07

dhoomh

Server et Client en UDP

Bonjour a tous et a toute,

Apres avoir trouvé le code en C du Server UDP et Client UDP, j'ai décider de relier mes 2 PC avec un câble croisé.
Sur un PC j'ai mis l'adresse 127.0.0.1 255.0.0.0 et sur l'autre 127.0.0.2 255.0.0.0

Voici le code du Server UDP :

/*
	Simple udp server
	
*/
#include<stdio.h>	//printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>

#define BUFLEN 512	//Max length of buffer
#define PORT 8888	//The port on which to listen for incoming data

void die(char *s)
{
	perror(s);
	exit(1);
}

int main(void)
{
	struct sockaddr_in si_me, si_other;
	
	int s, i, slen = sizeof(si_other) , recv_len;
	char buf[BUFLEN];
	
	//create a UDP socket
	if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
	{
		die("socket");
	}
	
	// zero out the structure
	memset((char *) &si_me, 0, sizeof(si_me));
	
	si_me.sin_family = AF_INET;
	si_me.sin_port = htons(PORT);
	si_me.sin_addr.s_addr = htonl(INADDR_ANY);
	
	//bind socket to port
	if( bind(s , (struct sockaddr*)&si_me, sizeof(si_me) ) == -1)
	{
		die("bind");
	}
	
	//keep listening for data
	while(1)
	{
		printf("Waiting for data...");
		fflush(stdout);
		
		//try to receive some data, this is a blocking call
		if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == -1)
		{
			die("recvfrom()");
		}
		
		//print details of the client/peer and the data received
		printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
		printf("Data: %s\n" , buf);
		
		//now reply the client with the same data
		if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == -1)
		{
			die("sendto()");
		}
	}

	close(s);
	return 0;
}

Voici le Client UDP :

/*
	Simple udp client
	
*/
#include<stdio.h>	//printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>

#define SERVER "127.0.0.1"
#define BUFLEN 512	//Max length of buffer
#define PORT 8888	//The port on which to send data

void die(char *s)
{
	perror(s);
	exit(1);
}

int main(void)
{
	struct sockaddr_in si_other;
	int s, i, slen=sizeof(si_other);
	char buf[BUFLEN];
	char message[BUFLEN];

	if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
	{
		die("socket");
	}

	memset((char *) &si_other, 0, sizeof(si_other));
	si_other.sin_family = AF_INET;
	si_other.sin_port = htons(PORT);
	
	if (inet_aton(SERVER , &si_other.sin_addr) == 0) 
	{
		fprintf(stderr, "inet_aton() failed\n");
		exit(1);
	}

	while(1)
	{
		printf("Enter message : ");
		gets(message);
		
		//send the message
		if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1)
		{
			die("sendto()");
		}
		
		//receive a reply and print it
		//clear the buffer by filling null, it might have previously received data
		memset(buf,'\0', BUFLEN);
		//try to receive some data, this is a blocking call
		if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
		{
			die("recvfrom()");
		}
		
		puts(buf);
	}

	close(s);
	return 0;
}

Voila je ne comprend pas pourquoi je ne reçoit pas le message sur le PC server.

Merci d'avance pour votre aide.
dhoomh

Hors ligne

#2 Le 29/12/2013, à 12:19

slasher-fun

Re : Server et Client en UDP

Bonjour,

127.0.0.1 est une adresse IP locale (loopback), elle ne risque donc pas de recevoir de données de 127.0.0.2.

Il est plus simple d'utiliser une IP de la RFC 1918, à savoir entre :
* 192.168.0.0 et 192.168.255.255
* 172.16.0.0 et 172.31.255.255
* 10.0.0.0 et 10.255.255.255

Attention en choisissant la plage à tenir compte de l'adresse désignant le réseau (la première) et de celle de broadcast (la dernière)

Dernière modification par slasher-fun (Le 29/12/2013, à 12:20)

Hors ligne

#3 Le 29/12/2013, à 13:26

dhoomh

Re : Server et Client en UDP

Ha ok merci pour ta réponse.

J'ai des warning lors de la compilation du code client, je n'arrive pas a comprendre. Les voici :

client.c: In function ‘main’:
client.c:46:3: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
   gets(message);
   ^
/tmp/cccDk2H8.o: In function `main':
client.c:(.text+0x10b): warning: the `gets' function is dangerous and should not be used.

Merci pour votre réponse.
dhoomh

Hors ligne

#4 Le 29/12/2013, à 13:32

slasher-fun

Re : Server et Client en UDP

Tu compiles en demandant l'affichage d'avertissements sur les fonctions dépréciées (-Wdeprecated-declarations), et il t'est répondu que gets en est une.

Hors ligne

#5 Le 29/12/2013, à 18:36

dhoomh

Re : Server et Client en UDP

Donc pas d'erreur dans le code ?

dhoomh.

Hors ligne

#6 Le 29/12/2013, à 23:29

slasher-fun

Re : Server et Client en UDP

A priori non, il ne s'agit que d'avertissements.

Hors ligne

#7 Le 30/12/2013, à 01:42

pires57

Re : Server et Client en UDP

J'ai regarder vite fait ton code, normalement les deux m'ont l'air correct, si il ne font pas ce que tu veut, alors il faudra donner des détails.


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#8 Le 30/12/2013, à 18:26

dhoomh

Re : Server et Client en UDP

J'ai mis comme @IP sur le client : 192.168.0.2 et @IP du server : 192.168.0.1 avec un masque 255.255.255.0

Après avoir exécuter, sur le client j'ai "Enter message" et sur le Server j'ai "Waiting for data..."
Au final le message n'apparait pas sur le PC server.

Avez-vous des idées? Ou est-ce-que quelqu'un l'a déjà exécuter ?

Merci d'avance,
dhoomh

Hors ligne

#9 Le 09/01/2014, à 22:34

pires57

Re : Server et Client en UDP

je ne l'ai pas executé non, je regarderais plus tard, la je ne suis pas sur mon pc ...


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne