IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Routeur, comment passer en travers ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut Routeur, comment passer en travers ?
    Bonsoir !

    Je tente de développer un programme en Delphi qui nécessite d'échanger des données entre deux PC via internet. (que ce soit avec les composants VCL, Indy, Asphyres,...)
    Le problème est que mon PC ainsi que de plus en plus de PC d'ailleurs se trouve derrière un routeur, à "cause" de l'ADSL.

    Je lis partout qu'il faut configurer le modem (ou autre routeur) pour qu'il transmette les données envoyées sur le port désigné dans le programme client au bon PC, en précisant un port (identique ou non). Pas trop de soucis, j'ai du faire ça une fois pour jouer à Znes en ligne.

    Maintenant je n'ai rien trouvé après des heures de recherches qui dise qu'il est possible de ne pas avoir à configurer le routeur... pourtant si je prend par exemple, sans vouloir faire de pub, le jeu Wolfenstein Enemy Territory, rien ne me demande de configurer le routeur, mais le programme arrive très bien à envoyer aux autres joueurs mes coordonnées (là ça va, on est le client) et surtout .. à récupérer les coordonnées des autres ?! Dans ce cas on est serveur non ? Ou alors de quelle manière le serveur de jeu (ou le programme des autres joueurs, comme client ?! - je ne connais pas le fonctionnement justement- ) me les envoit-il ? Ne doit-on pas être serveur pour recevoir des données ?

    Le truc c'est que j'aimerai bien que mon programme soit à la fois client et serveur, mais qu'il récupère automatiquement les IPs des autres joueurs, ça facile, j'ai une bdd MySQL gérée en php pour inscrire les joueurs (login, pass, map -le jeu sera divisé en petits secteurs-, ..) et une page affichant l'ip publique du joueur (le prog la récupère tout seul biensûr - le code pour ceux que ça intéresse parce que j'ai pas mal cherché puis bidouiller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /////////////////////////////////
    procedure TMainForm.FormCreate(Sender: TObject);
    var
    MyStreamt:TMemoryStream;
    IPtxt : string;
    x : integer;
    begin
     
    MyStreamt:=TMemoryStream.Create;
    DIP.Get('http://www.ironsquare.com/ip.php',Mystreamt);
    Mystreamt.Position := 0;
    x := Mystreamt.Size;
    SetLength(IPtxt, x);
    Mystreamt.Read(IPtxt[1], x);
    PC_IP := IPtxt;
    MyStreamt.Free;
    end;
    ////////////////////////////////
    PC_IP est une variable String déclarée en globale, pour être réutilisée n'importe où. On peut sans doute virer la variable "x" pour le remplacer tout de suite par "Mystreamt.Size" je viens d'y penser en collant mon code lol Je test tout à l'heure d'abord un petit dodo...
    ip.php est un simple code PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $_SERVER["REMOTE_ADDR"]; ?>
    )
    Ensuite avec ces IPs (IP des joueurs étant en ligne - signalé présent dans la bdd au lancement du jeu - et sur la même map) j'échange les coordonnées directement entre joueurs, donc chaque joueur devient client et serveur. Une autre solution était de passer par la bdd mais c'est beaucoup beaucoup beaucoup trop lent. bref, en résumé j'aimerai vraiment faire comme dans Wolfenstein, ne pas avoir à configurer son routeur pour jouer à mon peut-être futur jeu (lol)

    Personne n'aurait une idée ? Une piste sérieuse ? Au pire il reste la solution de faire un petit tuto avec le programme expliquant comment configurer le routeur pour autoriser l'utilisation du (ou des) port du jeu avec la redirection... mais bon j'ai vraiment très envie de savoir comment certains programmes (comme Wolfenstein, MSN,...) y arrivent.

    Voila.. désolé pour la longeur du post j'ai souvent du mal à m'arrêter lol.

    Bonne nuit à tous et merci à toute réponse pouvant ne serait-ce que me remettre un peu dans la bonne voie;

  2. #2
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    bonjour,

    il y a un port qui est systématiquement ouvert, c'est le port 80
    tu peux l'utiliser, mais par contre il y aura surement pb avec les utilisateurs qui auraient Apache ou IIS d'installé sur leur poste.

    @++
    Dany

  3. #3
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut
    J'ai pas lu tt le post, c pas tres utilie, soit t'ouvre le port en allant config le routeur, soit tu utilise un port ouvert, soit, tu etabli la connection en reverse connection pck la plupart du temps de LAN a WAN ca passe mais pas de WAN a LAN. Donc, si t'as un des deux pc qui est sur routeur et l'autre non, tu prends celui qui est sur routeur et tu le fais se connecté a l'autre, si ils ont ts les deux un routeur, c grillé.

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    J'ai pas tout lu non plus, mais j'ai déjà longuement cherché une solution à ce problème car je suis déjà tombé dessus et c'est pas forcément un problème de routeur selon moi, mais aussi de firewall. La connection directe par socket nécessite qu'il y ait un pc client et un autre serveur et il n'est pas garanti que l'on puisse démarrer comme serveur sur un autre port que 80. La solution serait l'utilisation d'un tunnel ou bien un serveur dédié car dans ce cas, il n'y aurait plus que des clients. Enfin après tout dépend de ce que tu veux en faire exactement, mais dans ton cas, un serveur dédié est la meilleure solution (OVH = 30€/mois)...
    à+

    [EDIT]
    Ce sujet pourrait peut-être t'interesser :
    http://developpez.net/forums/showthread.php?t=192781
    De retour parmis vous après 10 ans!!

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Ce que je voudrais c'est que chaque joueur soit lui-même client et serveur, client pour envoyer ces coordonnées aux autres joueurs et serveur pour recevoir les coordonnées des autres joueurs.
    L'utilisation du port 80 semble fonctionner, il y a bien un échange de données entre mon PC et celui d'un ami, alors que nous sommes tous deux derrière un routeur.... parcontre mon code génère une erreur de type violation d'accès.

    Pour résumer, lorsque je lance le jeu, je dois entrer mon login et pass membre (qui sont enregistrés dans une table MySQL sur mon site) pour débloquer le bouton "Lancer". En cliquant sur ce dernier une requête est envoyé à ma bdd pour indiquer que je suis en ligne, indiquer mon IP actuel et récupérer mes données. Ensuite une nouvelle requête sélectionne la liste des joueurs étant sur la même map, j'ai donc leurs IP. Ensuite les joueurs échangent directement les infos entre eux.

    Pour mes test, je commence seul, je n'ai donc aucun IP à qui envoyer des données. Mon pote lance le jeu chez lui avec son login et pass. En cliquant sur "Lancer" il obtient la liste de ceux de la même map, moi en l'occurence. Mon IP s'ajoute donc à sa liste, un message m'est envoyé par le composant TNetCom (un des composants Asphyres). Son programme ne plante pas, je ne reçois pas le message en question (qui m'indique qu'un joueur vient d'arriver) et mon programme ne plante pas non plus.
    Par contre si je quitte et relance, mon pote étant déjà en ligne, j'obtiens son IP et là.... plantage des deux côtés simultanément, ce qui démontre qu'on arrive bien à échanger des données malgrès que je n'ai pas reçu le premier mess me disant que mon pote se connectait.

    J'ignore encore d'où viennent ces deux erreurs, le fait de ne pas recevoir le premier message et le pourquoi de l'erreur de type violation d'accès.

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Pour une connection directe entre 2 machines, il faut l'IP et le port.
    Si tu utilises le port 80 pour le serveur, ça ne peut pas fonctionner puisque ce port est déjà pris par internet. Il faut donc que le serveur choisisse un port libre et le client le même port... Et puis ya un port pour l'émission et un pour la reception... Je pense qu'ils peuvent être identiques, mais je n'en suis pas sûr.

    A propos, tu as lu ce topic ?
    http://developpez.net/forums/showthread.php?t=192781

    Ya une démo de Nono40 pour transférer un fichier, tu devrais l'essayer pour mettre au point ton programme...
    Au moins tu sauras si la communication entre vos 2 machines fonctionne.
    De retour parmis vous après 10 ans!!

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 768
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 768
    Points : 15 174
    Points
    15 174
    Par défaut
    Salut !

    Les problèmes de "violation d'accès" sont très souvent dûs à des embrouilles avec les pointeurs.
    Et je suppose (pour avoir utilisés les composants de Piette) que ces petites bêtes (qui les utilisent beaucoup - les pointeurs) sont sensibles à des détails insignifiants comme ne pas oublier de terminer une chaîne à envoyer avec le caractère #0, je crois (de mémoire, voir la FAQ de Piette sur www.overbyte.be).

    D'un autre côté, à mon avis, tu galèrerais moins si tu avais une seconde machine à portée de main : tu pourrais faire un code truffé de "ShowMessage", tu pourrais *facilement* voir où ça coince.

    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. Comment passer un ENUM à travers un Socket ?
    Par elmaestro dans le forum Langage
    Réponses: 12
    Dernier message: 21/05/2012, 09h48
  2. Réponses: 2
    Dernier message: 18/05/2008, 19h52
  3. Comment passer un objet à travers le scope session ?
    Par verbose dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 08/02/2008, 12h12
  4. Passer au traver d'un routeur
    Par Guillaume602 dans le forum Développement
    Réponses: 7
    Dernier message: 06/10/2006, 18h34
  5. comment passer de access à MySQL
    Par isa_21 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/10/2004, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo