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

Web & réseau Delphi Discussion :

Pb avec TSocketServer


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut Pb avec TSocketServer
    Bonjour

    Delphi 2010 :
    J'ai 1 PC (serveur) qui doit communiquer avec 2 autres par socket.
    Ne pouvant pas modifier les softs des 'Clients' (sous Android), je souhaite utiliser un port spécifique pour chacun d'eux, afin de ne pas mélanger les messages.

    Quand j'implémente un seul composant TServerSocket sur le PC serveur, tout se passe bien, mais je ne peux forcément dialoguer que sur un port unique.
    Si je tente d'implémenter un second TServerSocket (écoutant un port différent), il ne fonctionne pas. Seul le premier créé fonctionne !
    La seconde demande de connexion n'est même pas repérée...

    Est-ce normal, ou bien je m'y prends comme un manche ?

    Merci d'avance
    Amicalement, Champy

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Pour en avoir utiliser 6 en même temps en D6, je peux te dire que cela fonctionnait très bien à l'époque
    Tu as du mal configurer quelque choses !
    Le Firewall ?
    Tu as mis les gestionnaires Accept et Read

    Citation Envoyé par Champy_33 Voir le message
    , je souhaite utiliser un port spécifique pour chacun d'eux, afin de ne pas mélanger les messages.
    Si c'est le client qui émet une requête et le serveur qui répond
    Pense que si tu codes bien ton TServerSocket, tu peux associer un message avec le Handle du Socket qui a émis le message, et te servir de celui-ci pour émettre la réponse


    Si le serveur prend l'initiative du dialogue, c'est difficile de savoir à qui envoyer un message
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si le serveur prend l'initiative du dialogue, c'est difficile de savoir à qui envoyer un message
    Et même plus, si le serveur prend l'initiative du dialogue, c'est que c'est un client (du moins pour cette partie du protocole) .
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut
    Merci beaucoup

    Je me doute que ça devrait marcher. Mais malheureusement, c'est 'niet'

    Les Firewall sont stoppés sur les 3 PC.
    Les 2 TServerSocket sont implémentés exactement de la même manière, mis à part le numéro de port écouté, et c'est le même code pour les deux (je fais le distingo dans les procédures en me servant du 'Sender').
    Les procédures marchent impeccable quand il n'y a qu'un seul SocketServer. Le problème doit donc logiquement se situer ailleurs.

    Le composant TServerSocket étant un peu ancien (il me semble qu'il date de Delphi 3 -1997...), n'y aurait-il pas une incompatibilité avec Win 7, ou bien avec Delphi 2010 ?

    Malheureusement, je n'ai plus Delphi 7, pour faire un essai...

    Pour préciser le but, le PC 'Serveur' gère une animation OpenGL qui varie en fonction des messages transmis par les 2 clients. Il renvoie aussi des valeurs aux clients.
    C'est un peu comme un jeu en ligne qui s'adapte aux demandes des joueurs (sauf que c'est plutôt un 'serious game' dans mon cas ).

    Je vais tenter le coup avec un Server 'Indi'. Ca lèvera peut-être le doute.

    Allez, on verra ça lundi prochain...

    Bon WE et encore merci.
    Amicalement, Champy

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Et même plus, si le serveur prend l'initiative du dialogue, c'est que c'est un client (du moins pour cette partie du protocole) .
    quand je parlais de prendre "l'initiative du dialogue", j'ai peut-être mal choisi mon terme
    Je voulais dire que le serveur décide d'envoyer une trame à tous ses clients connectés et non qu'il décide lui même de se connecter !

    J'opposais un GET\RESPONSE typique d'un dialogue client\serveur
    à un KeepAlive ou à une émission cyclique d'état par exemple,
    le serveur tous les n secondes émets une trame de sa propre initiative !

    Pour ma part, j'ai eu cette situation, comme j'avais plusieurs clients, seuls une partie souhaitais s'abonner à un event, lors de la connexion, le client émettait une trame d'identification et d'abonnement

    ce qui donnait un dialogue de la forme, IDT->\ABON->\<-CONFIRM\<-EVENT\<-EVENT\<-EVENT....
    client->server
    server<-client


    Citation Envoyé par Champy_33 Voir le message
    (je fais le distingo dans les procédures en me servant du 'Sender')
    Si tu arrives à bien gérer Sender + SocketHandle, oublie les 2 ports !
    Tu ne peux pas ouvrir autant de port que tu as de clients !

    Je ne vois pas ce qui te pose problème avec un seul TServerSocket

    Par contre, TServerSocket a été déprécié un moment,
    aujourd’hui, c'est moins clair et il a en plus été migré en Unicode !

    Alors que peut-être, il n'apprécie pas Win7 !

    Tes deux TServerSocket sont bien en NonBlocking ?
    Tu n'as pas oublié le Active à true ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut
    Re

    En réalité, chaque client se connecte au serveur pour ouvrir sa session.
    Le serveur peut distinguer chaque client (ne serait-ce qu'avec l'IP d'emission) afin de les 'trier les patates'. .

    En revanche, le serveur doit répondre individuellement à chaque client (en fonction du contexte) sans que les autres clients ne reçoivent ce message.

    C'est finalement ça que je ne sais pas faire en n'utilisant qu'un seul port.

    Merci
    Amicalement, Champy

  7. #7
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Bon moi pour des manips similaires j'utilises les composants ICS. Tu as des exemple de serveur TCP lequel crée une instance à chaque client connecté, tous se connectent sur le même port.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Citation Envoyé par Champy_33 Voir le message
    En revanche, le serveur doit répondre individuellement à chaque client (en fonction du contexte) sans que les autres clients ne reçoivent ce message.

    C'est finalement ça que je ne sais pas faire en n'utilisant qu'un seul port.
    Tu n'as pas lu ce lien que j'ai fourni dès le début : Handle du Socket
    Cela fourni un exemple de dispatch de message vers le bon destinataire !
    Faut juste faire un peu d'effort, j'ai fait ce code alors que j'étais encore qu'un apprenti, c'est donc largement à ta portée !

    Il suffit de boucler sur ServerSocket.Socket.Connections[i] et de retrouver la bonne cible en fonction de l'IP ou du SocketHandle


    Mais si tu as procédé autrement , c'est donc ?
    Le bouton est juste en bas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec TSocketServer et TSocketClient !
    Par pointer dans le forum Delphi
    Réponses: 15
    Dernier message: 12/04/2007, 12h10
  2. Probleme avec TSocketServer
    Par Mercenary Developer dans le forum Web & réseau
    Réponses: 1
    Dernier message: 12/09/2005, 12h08
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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