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 02/07/2010, à 11:43

Vermouth

Broadcast UDP sur le réseau

Bonjour.

Je suis en train de faire un petit programme dont le but est de localisé (IP) un hote sur le réseau. Ça marche avec un système client-serveur chaque hote voulant être localisé devant faire tourner le serveur.

Les programmes client (nommé flh) et serveur (flhd) fonctionne très bien en local. Mais dès que j'essaie de localisé un autre hote de mon réseau ça ne fonctionne pas hmm .

Donc voici les sources:
flh.c:

/*########################
# Client FLH (Find Local Host) simple #
#########################*/
#include "flh.h"


char* option_h = "-h";
char* help = "Usage: flh [OPTION]\nRecherche un hote sur le réseaux local suivant le protocole FLH.\n\nOption:\n\t-h\tAffiche cette aide.\n\nCode d'erreur:\n\t1\tErreur de création de la socjet.\n\t2\tErreur de nommage de la soccket.\n\t3\tErreur de réception de packet.\n\t4\tErreur de fork.\n\t5\tErreur de récupération du nom d'hote.\n\t6\tErreur d'envoie de message.\n";


int main(int argc, char* argv[]){
	int h = 0;
	if(argc > 1){
		if(strcmp(argv[1], option_h) == 0) h = 1;
	}
	else{
		h = 1;
	}
	
	if(h){
		printf("%s", help);
		exit(0);
	}
	else{
		struct sockaddr_in addr;
		if(searchHost(argv[1], &addr)){
			printf("%s\n", inet_ntoa(addr.sin_addr));
		}
		else{
			printf("0.0.0.0\n");
		}
	}
}

flhd.c:

/*####################
# Démon FLH (Find Local Host) #
#####################*/
#include "flh.h"

char* option_n = "-n";
char* option_h = "-h";
char* help = "Usage: flhd [OPTION]\nLance le démon FLH.\nNe passer qu'une option à la fois.\n\nOption:\n\t-h\tAffiche cette aide.\n\t-n\tNe fork pas.\n\nCode d'erreur:\n\t1\tErreur de création de la socjet.\n\t2\tErreur de nommage de la soccket.\n\t3\tErreur de réception de packet.\n\t4\tErreur de fork.\n\t5\tErreur de récupération du nom d'hote.\n\t6\tErreur d'envoie de message.\n";

int main(int argc, char* argv[]){
	
	int n = 0;
	if(argc > 1){
		if(strcmp(argv[1], option_n) == 0) n = 1;
		else if(strcmp(argv[1], option_h) == 0){
			printf("%s", help);
			exit(0);
		}
	}
	
	if(!n){
		pid_t pid = fork();
		if(pid == -1){
			perror("fork()");
			exit(ERR_FORK);
		}
		else if(pid > 0){
			printf("PID fork: %d\n", pid);
			exit(0);
		}
	}
	
	char hostname[FLH_MAX_HOSTLEN];
	if(gethostname(hostname, FLH_MAX_HOSTLEN) == -1){
		perror("gethostname()");
		exit(ERR_HOSTNAME);
	}
		
	
	int sock;
	struct sockaddr_in s_addr;//Server infos
	
	/* ### */
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
		perror("socket()");
		exit(ERR_SOCK);
	}
	
	s_addr.sin_family = AF_INET;
	s_addr.sin_addr.s_addr = INADDR_ANY;
	s_addr.sin_port = htons(FLH_SERVER_PORT);
	memset(&(s_addr.sin_zero), '\0', 8);
	
	if (bind(sock, (struct sockaddr *)&s_addr,
		sizeof(struct sockaddr)) == -1) {
		perror("bind()");
		exit(ERR_BIND);
	}
	
	socklen_t addr_len = sizeof(struct sockaddr);
	struct sockaddr_in c_addr;//Client infos
	char* ip = NULL;
	char buffer[FLH_MAX_MSGLEN];
	int nob = 0;
	printf("flhd running on %s...\n", hostname);
	while(1){
		if ((nob = recvfrom(sock, buffer, FLH_MAX_MSGLEN-1 , 0, (struct sockaddr *)&c_addr, &addr_len)) == -1) {
			perror("recvfrom()");
			exit(ERR_RECV);
		}
		else if(strncmp(buffer, WHERE_ARE, WHERE_ARE_LEN) == 0 || nob < FLH_MAX_MSGLEN+2){
			ip = inet_ntoa(c_addr.sin_addr);
			char tmp[FLH_MAX_MSGLEN+1];
			int offset = WHERE_ARE_LEN+1;
			strncpy(tmp, buffer+offset, nob-offset);
			tmp[nob-offset] = '\0';
			
			printf("%s is searching %s", ip, tmp);
			
			sprintf(tmp, "%s",IM_HERE);
			if(sendMessage(FLH_CLIENT_PORT, c_addr.sin_addr.s_addr, tmp)) printf(", response sent\n");
			else printf(", error sendin response\n");
			
		}
		else{
			char tmp[FLH_MAX_MSGLEN+1];
			strncpy(tmp, buffer, nob);
			tmp[nob] = '\0';
			printf("Receive unknow message: %s\n", tmp);
		}
	}
	close(sock);//Pour la forme
	
	return 0;
}

et flh.h:

/*############################
# Fonction utile pour FLH (Find Local Host) #
#############################
#		Définition du protocole FLH
#			(Find Local Host)
#
#	Le démon écoute en UDP le port 8862
# (sur l'adresse de broadcast) et attend la
# réception d'un packet contenant:
#	"WHERE ARE YOU X"
# où X est l'hote dont on cherche l'IP.
# 	Une fois ce message reçut, il répond
# à l'expéditeur avec le message (UDP):
# 	"IM HERE"
# il envoie se message sur le port 8864 que
# le client doit écouté à ce moment là.
#
#	Un client doit donc envoyer le message
# attendu par le serveur (en broadcast) en y
# insérant le nom de l'hote qu'il recherche.
# Puis il écoute en UDP le port 8864 et attend
# une réponse.
#
#	Le serveur ne répond qu'une seul fois.
# Donc si le client ne reçoit pas de message,
# il doit refaire une demande.
############################*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

//###
#define ERR_SOCK 1
#define ERR_BIND 2
#define ERR_RECV 3
#define ERR_FORK 4
#define ERR_HOSTNAME 5
#define ERR_SENDTO 6


#define FLH_SERVER_PORT 8862
#define FLH_CLIENT_PORT 8864
#define FLH_MAX_MSGLEN 256
#define FLH_MAX_HOSTLEN 200


const char* WHERE_ARE = "WHERE ARE YOU";
const int WHERE_ARE_LEN = 13;

const char* IM_HERE = "I AM HERE";
const int IM_HERE_LEN = 9;

// /!\ Peu bloqué indéfiniment si aucun message reçu /!\
//Reçoit un message UDP
char* receiveMessage(int port, int usec, struct sockaddr_in* addr){
	int sock;
	struct sockaddr_in s_addr;
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
		perror("socket()");
		return NULL;
	}
	
	s_addr.sin_family = AF_INET;
	s_addr.sin_addr.s_addr = INADDR_ANY;
	s_addr.sin_port = htons(port);
	memset(&(s_addr.sin_zero), '\0', 8);
	
	if (bind(sock, (struct sockaddr *)&s_addr,
		sizeof(struct sockaddr)) == -1) {
		perror("bind()");
		return NULL;
	}
	
	socklen_t addr_len = sizeof(struct sockaddr);
	struct sockaddr_in c_addr;
	
	char* ip = NULL;
	char buffer[FLH_MAX_MSGLEN];
	int nob = 0;
	if ((nob = recvfrom(sock, buffer, FLH_MAX_MSGLEN-1 , 0, (struct sockaddr *)&c_addr, &addr_len)) == -1) {
		perror("recvfrom()");
		return NULL;
	}
	close(sock);
	*addr = c_addr;
	
	char* tmp = malloc(nob+sizeof(char));
	strncpy(tmp, buffer, nob);
	tmp[nob+1] = '\0';
	
	return tmp;
}

//Envoie un message en UDP
int sendMessage(int port, in_addr_t addr, char* message){
	int sock;
	struct sockaddr_in s_addr;
	if ((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
		perror("socket()");
		return 0;
	}
	memset((char *) &s_addr, 0, sizeof(s_addr));
	s_addr.sin_family = AF_INET;
	s_addr.sin_port = htons(port);
	s_addr.sin_addr.s_addr = addr;
	
	int nob = strlen(message);
	if(nob > FLH_MAX_MSGLEN){
		return 0;
	}
	if (sendto(sock, message, nob, 0, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1){
		return 0;
	}
	else{
		return 1;
	}
	close(sock);
}

struct sockaddr_in* G_addr;
int G_found= 0;

//Thread de recherche
void* searchThread(void *data){
	char* tmp = receiveMessage(FLH_CLIENT_PORT, 2000000, G_addr);
	
	if(tmp != NULL && strcmp(tmp, IM_HERE) == 0){
		G_found = 1;
	}
        return NULL;
}

//Cherhche un hote, 3 tentatives max, 6 secondes max
int searchHost(char* hostname, struct sockaddr_in* addr){
	G_addr = addr;
	
	char buffer[FLH_MAX_MSGLEN];
	int nob = sprintf(buffer, "%s %s", WHERE_ARE, hostname);
	
	pthread_t st;
	pthread_create(&st, NULL, searchThread, NULL);
	
	sendMessage(FLH_SERVER_PORT, INADDR_ANY, buffer);
	sleep(1);
	if(G_found){
		*addr = *G_addr;
		return 1;
	}
	
	sendMessage(FLH_SERVER_PORT, INADDR_ANY, buffer);
	sleep(2);
	if(G_found){
		*addr = *G_addr;
		return 1;
	}
	
	sendMessage(FLH_SERVER_PORT, INADDR_ANY, buffer);
	sleep(3);
	pthread_kill(st, 0);
	if(G_found){
		*addr = *G_addr;
		return 1;
	}
	else{
		return 0;
	}
}

Pour le fonctionnement, tout est expliqué au début du fichier flh.h.

Le problème est que je n'arrive pas à envoyé les packets sur l'adresse de broadcast.
Pour envoyé un message j'utilise sendMessage:
sendMessage(FLH_SERVER_PORT, INADDR_ANY, buffer);
Mais que je mette INADDR_ANY, INADDR_BROADCAST ou inet_addr("192.168.1.255") je ne voit rien transité sur mon interface réseau (je sniff mon trafic avec Wireshark).
Si j'utilise une adresse précise cela fonctionne.

Une idée du problème ?

J'ai join une archive contenant les sources et un makefile.
Merci à vous smile !

PS:faite pas attention au warning, ça passe lol !


Android !
\_/°<

   coin coin...

Hors ligne

#2 Le 02/07/2010, à 15:42

telliam

Re : Broadcast UDP sur le réseau

as tu le meme probleme si tu le lances en root?
as tu des iptables de configurer ?
as tu testé le code retour de sendMessage?


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#3 Le 02/07/2010, à 16:42

Vermouth

Re : Broadcast UDP sur le réseau

Alors !

En root ça ne change rien hmm .

Pour le détail de iptable:

:~$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ufw-before-logging-input  all  --  anywhere             anywhere            
ufw-before-input  all  --  anywhere             anywhere            
ufw-after-input  all  --  anywhere             anywhere            
ufw-after-logging-input  all  --  anywhere             anywhere            
ufw-reject-input  all  --  anywhere             anywhere            
ufw-track-input  all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ufw-before-logging-forward  all  --  anywhere             anywhere            
ufw-before-forward  all  --  anywhere             anywhere            
ufw-after-forward  all  --  anywhere             anywhere            
ufw-after-logging-forward  all  --  anywhere             anywhere            
ufw-reject-forward  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ufw-before-logging-output  all  --  anywhere             anywhere            
ufw-before-output  all  --  anywhere             anywhere            
ufw-after-output  all  --  anywhere             anywhere            
ufw-after-logging-output  all  --  anywhere             anywhere            
ufw-reject-output  all  --  anywhere             anywhere            
ufw-track-output  all  --  anywhere             anywhere            

Chain ufw-after-forward (1 references)
target     prot opt source               destination         

Chain ufw-after-input (1 references)
target     prot opt source               destination         
ufw-skip-to-policy-input  udp  --  anywhere             anywhere            udp dpt:netbios-ns 
ufw-skip-to-policy-input  udp  --  anywhere             anywhere            udp dpt:netbios-dgm 
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn 
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds 
ufw-skip-to-policy-input  udp  --  anywhere             anywhere            udp dpt:bootps 
ufw-skip-to-policy-input  udp  --  anywhere             anywhere            udp dpt:bootpc 
ufw-skip-to-policy-input  all  --  anywhere             anywhere            ADDRTYPE match dst-type BROADCAST 

Chain ufw-after-logging-forward (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere            limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] ' 

Chain ufw-after-logging-input (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere            limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] ' 

Chain ufw-after-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-after-output (1 references)
target     prot opt source               destination         

Chain ufw-before-forward (1 references)
target     prot opt source               destination         
ufw-user-forward  all  --  anywhere             anywhere            

Chain ufw-before-input (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ufw-logging-deny  all  --  anywhere             anywhere            state INVALID 
DROP       all  --  anywhere             anywhere            state INVALID 
ACCEPT     icmp --  anywhere             anywhere            icmp destination-unreachable 
ACCEPT     icmp --  anywhere             anywhere            icmp source-quench 
ACCEPT     icmp --  anywhere             anywhere            icmp time-exceeded 
ACCEPT     icmp --  anywhere             anywhere            icmp parameter-problem 
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request 
ACCEPT     udp  --  anywhere             anywhere            udp spt:bootps dpt:bootpc 
ufw-not-local  all  --  anywhere             anywhere            
ACCEPT     all  --  BASE-ADDRESS.MCAST.NET/4  anywhere            
ACCEPT     all  --  anywhere             BASE-ADDRESS.MCAST.NET/4 
ufw-user-input  all  --  anywhere             anywhere            

Chain ufw-before-logging-forward (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-input (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-before-output (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ufw-user-output  all  --  anywhere             anywhere            

Chain ufw-logging-allow (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere            limit: avg 3/min burst 10 LOG level warning prefix `[UFW ALLOW] ' 

Chain ufw-logging-deny (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            state INVALID limit: avg 3/min burst 10 
LOG        all  --  anywhere             anywhere            limit: avg 3/min burst 10 LOG level warning prefix `[UFW BLOCK] ' 

Chain ufw-not-local (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            ADDRTYPE match dst-type LOCAL 
RETURN     all  --  anywhere             anywhere            ADDRTYPE match dst-type MULTICAST 
RETURN     all  --  anywhere             anywhere            ADDRTYPE match dst-type BROADCAST 
ufw-logging-deny  all  --  anywhere             anywhere            limit: avg 3/min burst 10 
DROP       all  --  anywhere             anywhere            

Chain ufw-reject-forward (1 references)
target     prot opt source               destination         

Chain ufw-reject-input (1 references)
target     prot opt source               destination         

Chain ufw-reject-output (1 references)
target     prot opt source               destination         

Chain ufw-skip-to-policy-forward (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-input (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-output (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-track-input (1 references)
target     prot opt source               destination         

Chain ufw-track-output (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere            state NEW 
ACCEPT     udp  --  anywhere             anywhere            state NEW 

Chain ufw-user-forward (1 references)
target     prot opt source               destination         

Chain ufw-user-input (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:rsync 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:8862 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:8864 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 

Chain ufw-user-limit (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere            limit: avg 3/min burst 5 LOG level warning prefix `[UFW LIMIT BLOCK] ' 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain ufw-user-limit-accept (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-user-logging-forward (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-input (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-output (0 references)
target     prot opt source               destination         

Chain ufw-user-output (1 references)
target     prot opt source               destination

On y voit bien les deux règle que j'ai ajouté:

ACCEPT     udp  --  anywhere             anywhere            udp dpt:8862 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:8864

anywhere/anywhere donc il ne devrais pas avoir de problème.
C'est sûrement la même sur mon autre PC où j'ai inséré les règles de la même manière (gufw).

Quand au sendMessage, je n'ai pas fait le teste dans mon code (pas utile, si un packet échoue on en renvoie un) mais dans tout les cas le packet est bien envoyé.

yikes

Merci de de te pencher sur mon cas.

Dernière modification par Vermouth (Le 02/07/2010, à 16:43)


Android !
\_/°<

   coin coin...

Hors ligne

#4 Le 02/07/2010, à 16:48

telliam

Re : Broadcast UDP sur le réseau

je suis pas un expert en iptables mais je serais toi, je ferai le meme test sans IPtable pour être sur que ca vient de la ou pas.
si ca vient de la, remonte tes regles au debut de IPtables et fais par dicotomie en descendant les regles pas a pas pour voir laquelle bloque tes UPD broadcast.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#5 Le 02/07/2010, à 17:12

Vermouth

Re : Broadcast UDP sur le réseau

telliam a écrit :

je suis pas un expert en iptables mais je serais toi, je ferai le meme test sans IPtable pour être sur que ca vient de la ou pas.
si ca vient de la, remonte tes regles au debut de IPtables et fais par dicotomie en descendant les regles pas a pas pour voir laquelle bloque tes UPD broadcast.

Il est où le fichier contenant les règles ?
J'ai chercher dans la doc et le man mais j'ai pas trouvé mad .


Android !
\_/°<

   coin coin...

Hors ligne

#6 Le 02/07/2010, à 17:31

telliam

Re : Broadcast UDP sur le réseau

pas essayé mais tu px faire
iptables-save > sauv.txt pour sauvegarder ta table
iptables -F pour la vider
...
tu fais tes tests
et tu fais
iptables-restore < sauv.txt


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#7 Le 02/07/2010, à 18:05

Vermouth

Re : Broadcast UDP sur le réseau

J'ai essayé quelque chose comme ça:

# Generated by iptables-save v1.4.4 on Fri Jul  2 17:39:37 2010
*filter
:OUTPUT ACCEPT [36:1914]
:INPUT ACCEPT [36:9914]
COMMIT
# Completed on Fri Jul  2 17:39:37 2010

Mais ça ne marche pas non plus.
De toute façon ça m'étonnerai que par défaut il bloque le trafic sortant.

Je vient d'essayer d'utilisé un avec le port 138 (protocole nommé BROWSER dans wireshar mais je crois que c'est le partage windows/netbiosname truc du genre) sur lequel je voit fréquemment des packets envoyer sur l'adresse de broadcast. Mais ça ne fonctionne toujours pas (en utilisant INADDR_ANY.
Mais par contre je vient de remarqué grâce à une modif du code que les packets ne veulent pas s'envoyer sur 192.168.1.255 (adresse de broadcast de mon réseau).
Donc je pense que le problème ne vient pas du filtrage.

Mais je vais tater un peu quelque combinaison mais là je commence à manquer d'imagination lol!


Android !
\_/°<

   coin coin...

Hors ligne

#8 Le 02/07/2010, à 18:12

Vermouth

Re : Broadcast UDP sur le réseau

Bein après quelque teste j'en conclut que INADDR_ANY ne semble pas correspondre à l'adresse de broadcast et que par contre je ne peut pas envoyé de packet sur l'adresse de broadcast (INADDR_BROADCAST ou inet_addr("192.168.1.255") ).

Donc pas un problème de filtrage mais... un autre lol !

Une autre idée ?


Android !
\_/°<

   coin coin...

Hors ligne

#9 Le 02/07/2010, à 19:22

telliam

Re : Broadcast UDP sur le réseau

il te manque pas un setsockopt avec l'option SO_BROADCAST ??


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#10 Le 02/07/2010, à 20:52

Vermouth

Re : Broadcast UDP sur le réseau

telliam a écrit :

il te manque pas un setsockopt avec l'option SO_BROADCAST ??

Youhou !! Victoire !
Le plaisir que j'ai eu quand j'ai vue mes packets dans Wireshark lol !

A appliquer sur la socket servant à émettre en broadcast:

	int optval = 1;
	setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(int));
	memset((char *) &s_addr, 0, sizeof(s_addr));

Merci smile !!

Me reste à peaufiner un programme avec fichier de configuration pour synchroniser une liste de dossier (unison marche impec).

Je repasserai quand j'aurai avancé.
Je n'ai pas encore avancé sur wine (je l'ai juste installer) et pour synchroniser les programmes (entre mes installs d'Ubuntu), je synchroniserai un fichier listant les applications à installé.

Dernière modification par Vermouth (Le 02/07/2010, à 21:06)


Android !
\_/°<

   coin coin...

Hors ligne

#11 Le 02/07/2010, à 21:01

Link31

Re : Broadcast UDP sur le réseau

Un bon moyen de trouver ce genre d'erreur est de faire un strace sur un outil réseau fiable, du type hping2, pour déterminer l'enchaînement des opérations et les options utilisées.

Hors ligne

#12 Le 02/07/2010, à 21:15

Vermouth

Re : Broadcast UDP sur le réseau

Link31 a écrit :

Un bon moyen de trouver ce genre d'erreur est de faire un strace sur un outil réseau fiable, du type hping2, pour déterminer l'enchaînement des opérations et les options utilisées.

Dans mon cas je ne vois pas l'utilité de hping2 ? (tcp uniquement qui plus est).

De toute façon c'est ma faute, si j'avais pas oublié de mettre un affichage sur l'erreur d'envoi du packet, j'aurai situé le programme bien plus tôt. Ça m'apprendra lol !
Cela dit, pour setsockopt, je l'ai croisé une fois dans une source et je l'avais mis dans un coin de ma tête mais j'ai mis plein de chose dessus donc je l'ai oublié lol !

Par contre, je me pose une question.
Est-ce que mon petit "projet" intéresse du monde ?
Car si c'est le cas je fait un README etc... et je vous balance tout (à la fin, je pense que j'aurai un démon à lancé au démarrage et qui gérera tout avec un fichier de conf).

Dernière modification par Vermouth (Le 02/07/2010, à 21:15)


Android !
\_/°<

   coin coin...

Hors ligne

#13 Le 02/07/2010, à 21:27

Link31

Re : Broadcast UDP sur le réseau

hping2 permet de forger des paquets TCP, UDP et ICMP.

Sinon, au sujet de ton projet... pourquoi ne pas faire simplement un arping ? Il suffit de connaître l'adresse MAC de la machine qu'on cherche pour obtenir son adresse IP si elle est connectée. Bon, ça dépend aussi de la topologie du réseau...

Hors ligne

#14 Le 02/07/2010, à 21:34

Vermouth

Re : Broadcast UDP sur le réseau

Link31 a écrit :

hping2 permet de forger des paquets TCP, UDP et ICMP.

Oui (ok pour UDP, j'ai regardé trop vite la page de man).
Mais moi s'était un problème de programmation.. enfin c'est vraie que ça aurai pue écarté la (mauvaise) piste du problème de filtrage (hein telliam lol).

Link31 a écrit :

Sinon, au sujet de ton projet... pourquoi ne pas faire simplement un arping ? Il suffit de connaître l'adresse MAC de la machine qu'on cherche pour obtenir son adresse IP si elle est connectée. Bon, ça dépend aussi de la topologie du réseau...

Ouai c'est vraie qu'à la réflexion ça aurai pu le faire mais c'est plus propre avec le nom d'hote (surtout plus aisé).
Et puis s'était un petit défit personnel big_smile !

EDIT: plus haut j'ai parlé d'un petit projet, en faite je pensai à ce que je tente de faire sur ce topic et plus particulièrement la synchro entre deux PC sur mon réseaux local.

Dernière modification par Vermouth (Le 02/07/2010, à 22:46)


Android !
\_/°<

   coin coin...

Hors ligne