:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Tutoriels

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 07/04/2007, 11h18   #1
Samote
Membre confirmé
 
Date d'inscription: 12/01/2006
Localisation: Terre
Messages: 434
Par défaut Réaliser une connection wifi DS <-> AP <-> DS

Réaliser une connection simple entre deux ds par wifi


Intro : Nous réaliserons un programme simple côté serveur puis côté client. Ce programme se chargera d'afficher un texte si l'écran tactile de l'autre ds est touché.
Nous utiliserons PALib pour sa fonction PA_ConnectWifiWFC(). Les autres fonctions utilisées proviendrons de la lib wifi.
Pour communiquer les ds vont utiliser des sockets. Les données seront envoyées et reçues par les fonctions send() et recv().



Avant de commencer nous allons placé ces deux lignes en haut de la fonction main :
Code PHP:
PA_InitWifi(); // Pour initialiser le wifi
PA_ConnectWifiWFC(); // Pour se connecter en utilisant les paramètres WFC 
1) Côté serveur :
1. La structure sockaddr_in :
Code PHP:
struct sockaddr_in {
        
short int          sin_family;  // Famille d'adresse
        
unsigned short int sin_port;    // Numéro de Port
        
struct in_addr     sin_addr;    // Adresse Internet (ip)
        
unsigned char      sin_zero[8];
}; 
Cette structure va contenir les adresses et les ports du client et du serveur.

Nous allons donc en déclarer deux :
Code PHP:
struct sockaddr_in addresseserveur// information du serveur
struct sockaddr_in addresseclient;  //information du client 
Puis "remplir" celle concernant le serveur :
Code PHP:
addresseserveur.sin_family AF_INET;
//pour la famille nous utilisons  AF_INET

addresseserveur.sin_port htons(8888);
//pour le port  nous utilisons la fonction  htons() avec en paramètre le numéro du port

addresseserveur.sin_addr.s_addr 0;
//pour l'adresse ip nous mettons 0 car une ip a déjà été attribué a la ds. 
Nous récupèrerons les informations concernant le client plus tard.

2. Creation du socket :
Pour créer un socket il faut utiliser la fonction :

Code PHP:
int socket(int domainint typeint protocol); 
Elle renvoie un descripteur de socket que nous récupérerons dans une variable de type int.

Nous y ferons appelle ainsi :
Code PHP:
int notresocket 0;
notresocket socket(AF_INETSOCK_STREAM0); 
3. Association a un port :
Une fois le socket créé il faut l'associer avec un port. Pour cela nous utiliseront bind().

Code PHP:
int bind(int sockfdstruct sockaddr *my_addrint addrlen); 
Nous y ferons appelle ainsi :
Code PHP:
bind(notresocket,  // le descripteur de socket
    
(struct sockaddr *)&addresseserveur,  // les infos du serveur
    
sizeof(addresseserveur));  // la taille de la structure des info du serveur 
4. Écouter sur le socket :
Nous allons désormais écouter sur le socket a l'aide de listen().

Code PHP:
int listen(int sockfdint backlog); 
Nous y ferons appelle ainsi :
Code PHP:
listen(notresocket,  // le descripteur de socket
    
1);  // le nombre de connection autorisée 
5. Accepter les connections :
Pour finir nous allons accepter les connections entrante grace a accept().

Code PHP:
int accept(int sockfdvoid *addrint *addrlen); 
Cette fonction bloque le programme jusqu'à ce qu'une connections soit accepter.
Elle renvoie une nouveau descripteur de socket que nous allons récupérer dans une nouvelle variable de type int.

Nous y ferons appelle ainsi :
Code PHP:
int notresocketfinale 0;
notresocketfinale accept(notresocket//ancien descripteur
                         
(struct sockaddr *)&addresseclient,// recuperation des info client
                         
(int*)sizeof(struct sockaddr_in)); //taille de la structure  sockaddr_in 
2) Côté client :
1. L'ip du serveur :
Les adresse ip sont contenu dans des variable de type long.

Code PHP:
long ipserveur 0
Pour transformer une chaîne de caractère en ip nous allons utiliser la fonction inet_addr()
Par exemple :
Code PHP:
ipserveur inet_addr("86.204.83.214"); 
Si votre ip est sous la forme d'un nom de domaine il faut utiliser la fonction gethostbyname().
Code PHP:
extern struct hostent gethostbyname(const char name); 
Elle renvoie une structure de type hostent qui contient diverse information sur le nom de domaine.
Code PHP:
struct hostent domaine// on declare une structure hostend
domaine = *gethostbyname("samote.dyndns.org"); //on récupère les info du dns 
L'ip du serveur est contenu dans le membres .h_addr_list
Code PHP:
ipserveur = **domaine.h_addr_list
2. sockaddr_in pour les infos du serveur :
Nous avons recuperé l'ip dans un long maintenant nous allons devoir crée une structure sockaddr_in :
Code PHP:
struct sockaddr_in addresseserveur;
addresseserveur.sin_family AF_INET// AF_INET pour la famille
addresseserveur.sin_port htons(8888); // meme port que pour le serveur
addresseserveur.sin_addr.s_addr ipserveur// on utilise la variable ip serveur 
3. Creation du socket :
Nous allons passer a la création du socket :
Code PHP:
int notresocketfinale 0// le descripteur de socket
notresocketfinale socket(AF_INETSOCK_STREAM0); // création du socket 
4. La connection au serveur :
La connection au serveur de fait a l'aide de la fonction connect().
Code PHP:
int connect(int sockfdstruct sockaddr *serv_addrint addrlen); 
Elle doit être appelée pendant que le serveur fait appel a accept() :
Code PHP:
connect(notresocketfinale// le descripteur de socket
      
(struct sockaddr *)&addresseserveur// les infos du serveur
       
sizeof(struct sockaddr)); // taille de la structure  sockaddr_in 
3) send() et recv() :

Nos deux ds sont désormais connectées, nous allons donc pouvoir utiliser send() et recv() pour transférer des données.

Notez que la ds serveur doit être allumer avant la ds client car connect() doit être appelé après accept(). Pour éviter se problème vous pouver faire appel a connect() lors de la pression d'une touche.

1. send() :
Voici le prototype de la fonction send :
Code PHP:
int send(int sockfd// le descripteur de socket
         
const void *msg// un pointeur sur les données a envoyer
         
int len// taille des données en octet
         
int flags); // mettre flag a 0 
Il n'y a pas de type définie pour les données, on peut envoyer ce que l'on veut : variables de tout type, tableaux , structures...
2. recv() :
Voici le prototype de la fonction recv :
Code PHP:
int recv(int sockfd// le descripteur de socket
         
void *buf// un pointeur sur le buffer
         
int len// la taille maximal du buffer
         
unsigned int flags); // mettre flag a 0 
Le buffer est la variable qui va recevoir les données.


La fonction recv() et une fonction bloquante, c'est a dire qu'elle bloque l'exécution du programme jusqu'à la réception d'un paquet.

Pour éviter cela on peut rendre le socket non bloquant :
Code PHP:
u8  erreur 1// variable pour vérifier les erreurs
ioctl(notresocketfinale// le descripteur de socket
      
FIONBIO,
      &
erreur); //la variable d'erreur 
En mode non bloquant recv() renvoie -1 si il n'y a pas de paquet reçu.

4) Exemple d'utilisation :

Maintenant que les deux ds peuvent communiquer, nous allons réaliser la partie du programme qui affiche un texte lorsque l'écran de l'autre ds est touché.

Nous allons d'abord déclarer deux booléens :
Code PHP:
bool donnesenvoyees 0// la variable que nous enverons avec send()
bool buffer 0// la variable qui va contenir les données reçues 
Maintenant voici le code de la boucle principale :
Code PHP:
while (1)
{
    
//  donnesenvoyees vaut 1 si l'écran est touché
    
donnesenvoyees Stylus.Held;
    
// on envoie la variable  donnesenvoyees a l'autre ds
    
send(notresocketfinale, &donnesenvoyees10);
    
    
// on reçois les données de l'autre ds, le buffer va être modifié
    
recv(notresocketfinale, &buffer10);
    
    
//Si buffer vaut 1, l'écran de l'autre ds a été touché
    
if (buffer == 1)
    {
        
// alors on affiche le texte
        
PA_OutputSimpleText (11612"Salut");
    }   
        
        
PA_WaitForVBL();

C'est la fin de ce tuto, j'espère que sa vous aura été utile.
__________________

Dernière modification par Samote ; 07/04/2007 à 13h19.
Samote est déconnecté   Réponse avec citation

Publicité

Vieux 07/04/2007, 11h19   #2
Samote
Membre confirmé
 
Date d'inscription: 12/01/2006
Localisation: Terre
Messages: 434
Par défaut

Je n'ai pas expliqué les sockets en profondeur. Le but est de mettre en place un truc fonctionnel rapidement.
__________________
Samote est déconnecté   Réponse avec citation
Vieux 07/04/2007, 11h58   #3
Noda
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: à montréal jusqu'au 4 mai, après retour en france ^^
Messages: 570
Par défaut

Tu devrais préciser, "avec un AP" dans le titre, car j'ai cru que t'avais fait un tuto direct DS>DS au début, j'ai été très décu
__________________
http://nodadev.wordpress.com
Noda est déconnecté   Réponse avec citation
Vieux 07/04/2007, 13h19   #4
Samote
Membre confirmé
 
Date d'inscription: 12/01/2006
Localisation: Terre
Messages: 434
Par défaut

C'est fait. Désolé pour la fausse joie.
__________________
Samote est déconnecté   Réponse avec citation
Vieux 07/04/2007, 20h58   #5
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 963
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

merci beaucoup pour ce tuto, c'est du très bon travail
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 01/03/2008, 22h46   #6
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

Merci enormement moi qui essayer de faire ca en passant par un PC
MERCI
Cortes48 est déconnecté   Réponse avec citation
Vieux 01/03/2008, 23h07   #7
Bap65
Into the Valve Index
 
Date d'inscription: 10/11/2005
Localisation: Tour Eiffel
Messages: 4 394
Voir l'identifiant PSN
Par défaut

Oui, merci énormément pour tes tutos ! C'est super sympas et ça peut être vraiment utile pour ceux qui en on besoin !
__________________
Kifs du moment:
- Réalité virtuelle (Vive)
- Impression 3D (https://www.thingiverse.com/Bperraud/about)
- Cryptomonnaies (Biiiikoooonneeeeekk')
- Jeux-video (of course)
Bap65 est déconnecté   Réponse avec citation
Vieux 06/08/2008, 12h12   #8
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

Et si plusieur DS sont connecté au même serveur peut on envoyer un socket a une seule DS grace à son addresse MAC ?
Cortes48 est déconnecté   Réponse avec citation
Vieux 06/08/2008, 14h25   #9
t4ils
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Morangis ( 91 )
Messages: 2 754
Voir les codes amis Wii
Par défaut

Si plusieurs DS sont connectées, tu conserves l'ordre de connexion de chaque console et tu mets le socket correspondant dans un tableau. Tu auras donc genre socket[0] le socket du premier connecté, socket[1] le second ...

ainsi, tu pourras communiquer avec toutes les DS, pas besoin de connaître l'adresse MAC
__________________
Un renard, en plus de voler, ca code !

t4ils est déconnecté   Réponse avec citation
Vieux 06/08/2008, 14h38   #10
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

Merci mais moi ça m'arrengerai d' envoté des socket avec l'adresse mac parce que je veux que plusieurs DS se connecte au serveur puis je par exemple que ma DS envoie une donné à la DS ayant pour addresse MAC fc:67:a7:0A(par exemple)
Cortes48 est déconnecté   Réponse avec citation
Vieux 06/08/2008, 15h16   #11
t4ils
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Morangis ( 91 )
Messages: 2 754
Voir les codes amis Wii
Par défaut

tu peux le faire toi même

quand une DS se connect à ton serveur, elle envoie son adresse MAC au serveur. A partir de là, tu fais un lien entre le socket et l'adresse MAC et hop la, tu peux savoir quelle adresse MAC à quel socket
__________________
Un renard, en plus de voler, ca code !

t4ils est déconnecté   Réponse avec citation
Vieux 06/08/2008, 15h22   #12
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

merci
Cortes48 est déconnecté   Réponse avec citation
Vieux 07/08/2008, 14h36   #13
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

J'ai encore une autre question ( Qu'est ce qu'il est chiant celui là)
Je voudrai que deux DS connecté a deux routeur différent puissent s'échangé des donné.
Je pensai que peut être avec un serveur cela serait possible mais je veux pas d'un serveur en .exe mais un serveur en nom de domaine.
Cortes48 est déconnecté   Réponse avec citation
Vieux 19/07/2009, 21h52   #14
squale76
Membre
 
Date d'inscription: 23/03/2009
Messages: 10
Par défaut

Bonjour,

J'ai testé ce tuto mais je n'arrive pas à l'arranger pour se connecter à un serveur FTP sur un PC via une connexion sécurisé (user, password).
Ou et Comment doit on envoyer ces infos au serveur ?
squale76 est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h19.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince