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

Réseau C Discussion :

Problème de connexion sockets


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Problème de connexion sockets
    Bonjour à tous !

    Alors, je commence par vous expliquer mon projet : je cherche à faire une application sur Iphone/Ipad ou une perssone fera un dessin et l'enverra aux appareils se trouvant à proximité et ayant rejoint la partie. (C'est en très gros)

    Actuellement je cherche à faire une connection TCP serveur/client entre 2 appareils. Alors j'ai plusieurs questions et problèmes ^^

    Tout d'abord peut on faire une connection TCP serveur/client sur des Iphone/Ipad via des sockets ? (Parce que si je me casse la tête depuis 3 jours sur un truc impossible voilà quoi :p )

    Ensuite si oui j'aimerais comprendre pourquoi mon code ne fonctionne pas, je vous le met ici :

    Code serveur :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    void connectionServ()
    {
    	int erreur = 0;
     
    	/* Socket et contexte d'adressage du serveur */
        SOCKADDR_IN sin = { 0 };
        SOCKET sock;
        socklen_t recsize = sizeof(sin);
     
        /* Socket et contexte d'adressage du client */
        SOCKADDR_IN csin = { 0 };
        SOCKET csock;
        socklen_t crecsize = sizeof(csin);
     
        int sock_err;
     
     
        if(!erreur)
        {
            /* Création d'une socket */
            sock = socket(AF_INET, SOCK_STREAM, 0);
     
            /* Si la socket est valide */
            if(sock != INVALID_SOCKET)
            {
                printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
     
                /* Configuration */
                sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
                sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
                sin.sin_port = htons(PORT);               /* Listage du port */
                sock_err = bind(sock, (SOCKADDR*)&sin, recsize);
     
                /* Si la socket fonctionne */
                if(sock_err != SOCKET_ERROR)
                {
     
    				/* Démarrage du listage (mode server) */
    				sock_err = listen(sock, 5);
                    printf("Listage du port %d...\n", PORT);
                    /* Si la socket fonctionne */
    				if(sock_err != SOCKET_ERROR)
                    {
                        /* Attente pendant laquelle le client se connecte */
                        printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
                        csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
    					if(csock == INVALID_SOCKET)
    					{
    						perror("accept()");
    					}
                        printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
                    }
                    else
                        perror("listen");
                }
                else
                    perror("bind");
     
                /* Fermeture de la socket client et de la socket serveur */
                printf("Fermeture de la socket client\n");
                closesocket(csock);
                printf("Fermeture de la socket serveur\n");
                closesocket(sock);
                printf("Fermeture du serveur terminée\n");
            }
            else
                perror("socket");
        }
    }
    Code Client :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    void connectionCli(void)
    {
    	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    	if(sock == INVALID_SOCKET)
    	{
    		perror("socket()");
    		exit(errno);
    	}
    	struct hostent *hostinfo = NULL;
    	SOCKADDR_IN sin = { 0 }; /* initialise la structure avec des 0 */
    	const char *hostname = "localhost";
     
    	hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */
    	if (hostinfo == NULL) /* l'hôte n'existe pas */
    	{
    		fprintf (stderr, "Unknown host %s.\n", hostname);
    		exit(EXIT_FAILURE);
    	}
     
    	sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
     
    	sin.sin_port = htons(PORT); /* on utilise htons pour le port */
    	sin.sin_family = AF_INET;
     
    	if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
    	{
    		printf("Echec du connect(), le code d'erreur est %d\n",  errno);
    	}
    	else
    	{
    		printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
    	}
    	closesocket(sock);
    }
    Voilà donc quand je lance l'appli côté serveur sur un appareil, dans ma console j'obtiens bien ce qu'il faut :
    "La socket 4 est maintenant ouverte en mode TCP/IP
    Listage du port 23...
    Patientez pendant que le client se connecte sur le port 23..."
    Donc, le programme passe bien la création du socket, le bind et le list. Puis attend qu'un client arrive.

    Ensuite, je lance mon appli côté client sur un deuxième appareil et j'obtiens :
    "Echec du connect(), le code d'erreur est 61"

    Donc le socket se crée correctement mais lors du connect -> Erreur.

    J'ai plusieurs proposition pour ce qui peut poser problème :
    - Le fait que ce soit des Iphone/Ipad
    - Le fait que je lance l'appli côté serveur sur un Iphone et l'appli côté client sur un Ipad.
    - Le fait que j'ai mis "localhost" en nom de domaine, mais j'ai essayer avec diverse combinaison :
    - Domaine : "localhost", Port : 23
    - Domaine : "localhost", Port : 8080
    - Domaine : "developpez.net", Port : 23
    J'ai aussi essayé de mettre une adresse IP directemen :
    Suppression du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct hostent *hostinfo = NULL;
    	const char *hostname = "localhost";
     
    	hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */
    	if (hostinfo == NULL) /* l'hôte n'existe pas */
    	{
    		fprintf (stderr, "Unknown host %s.\n", hostname);
    		exit(EXIT_FAILURE);
    	}
     
    	sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
    Et ajout du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    J'ai ici aussi essayé différentes adresse IP : "127.0.0.1", "192.168.0.1", "0.0.0.1"
    Mais rien n'a fonctionné ....

    Si quelqu'un a la moindre idée, je suis preneur !

  2. #2
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Ton problème est assez simple à comprendre mais n'a pas de solution simple.

    Ton client doit se connecter au serveur et pour se connecter au serveur, il faut connaitre l'adresse IP de ton serveur. Cette adresse IP est attribuée par ton fournisseur d'accès. Ton fournisseur d'accès dans ce cas là est ton opérateur téléphonique 3G qui te donne une adresse IP.

    Le premier problème est qu'il faut que ton client se connecte à cette adresse et uniquement celle là.
    Le deuxième problème est qu'il est fort probable que cette adresse IP soit variable. Elle risque de changer d'une connexion 3G à une autre et ton client n'a aucune manière de la connaitre.

    Une première solution serait de faire une double connexion client sur un serveur qui possed une adresse IP connus (www.mon_serveur.com par exemple).

    Les 2 clients sur iPhone et iPad se connecte à se serveur et c'est ce serveur qui relie les 2 clients en établissant une passerelle entre les 2 connexion.

    Après, tu peut avoir un client "master" et un client "slave", c'est à dire que le "master" à le droit de faire des choses et le "slave" d'autre choses mais c'est purement applicatif. C'est le principe de fonctionnement des char (regarde la RFC 2810 pour plus de détails sur cette architecture.

    Une autre solution, serait que ton serveur s'enregistre sur un serveur normal (toujours www.mon_serveur.com par exemple) en donnant le nom du service ("mon_service-ipad" par exemple), son adresse IP et son numéro de port.
    Ensuite le client peut faire une requête sur le serveur (www.mon_serveur.com) et demande si le service "mon_service-ipad" est enregistré. Si oui, le serveur www.mon_serveur.com retourne le numéro de port et l'adresse IP. C'est le fonctionnement de la connexion à un service RPC
    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
    .

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Alors, je pense avoir compris ce que tu m'a expliqué mais la solution est effectivement bien compliqué ...

    Je vais tenter de comprendre bien comme il faut

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	const char *hostname = "localhost"; 
    	hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */
    "localhost" n'est sûrement pas le nom de l'hôte distant puisque c'est toi le localhost. Le problème vient aussi de ça : tu veux mettre un nom mais comment connaitre ce nom ? Sur un réseau local, ça peut encore marcher, mais dés que tu seras sur Internet, tu ne pourras pas résoudre un nom de machine en une adresse IP. D'ailleurs, tu tu affiches hostinfo, qu'est ce que cela te donne ? Tu pourrais éventuellement résoudre un nom de domaine avec un serveur DNS mais il est évident qu'aucun de tes iPhones / iPads n'aura son entrée dans un seveur DNS. Comme te l'a expliqué Raymond, tu es donc condamné à connaitre à l'avance l'adresse IP des tes petits camarades. Je vais y revenir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Echec du connect(), le code d'erreur est %d\n",  errno);
    Je lis sur le net que le code 61 est ENODATA mais pour le man de connect() ne parle pas de ce code... Pourrais-tu utiliser perror() ou stderror() pour nous confirmer le code. Et n'hésites pas à remettre ERRNO à 0 avant d'appeler connect()

    J'ai plusieurs proposition pour ce qui peut poser problème :
    - Le fait que ce soit des Iphone/Ipad
    - Le fait que je lance l'appli côté serveur sur un Iphone et l'appli côté client sur un Ipad.
    - Le fait que j'ai mis "localhost" en nom de domaine, mais j'ai essayer avec diverse combinaison :
    - Domaine : "localhost", Port : 23
    - Domaine : "localhost", Port : 8080
    - Domaine : "developpez.net", Port : 23
    J'ai aussi essayé de mettre une adresse IP directemen :
    [...]
    J'ai ici aussi essayé différentes adresse IP : "127.0.0.1", "192.168.0.1", "0.0.0.1"
    J'en ai déjà parlé. Il faut mettre l'adresse IP du serveur et le port du serveur !

    Attention : le port 23 est le port telnet : http://fr.wikipedia.org/wiki/Liste_de_ports_logiciels Tu ne devrais (pourras ?) pas l'utiliser. En général, on prend des numéros de ports assez grands et probablement inutilisés (12345 comme proposé par Raymond ^^)

    Si quelqu'un a la moindre idée, je suis preneur !
    Pendant mes études, j'avais fait un projet de jeux en réseau sur PC. Les serveur créait une partie. On rentrait alors manuellement l'adresse IP du serveur pour chacun des clients souhaitant se connecter. Cette méthode pourra certainement marcher dans ton cas aussi. Si ça t'intéresse : http://www.hoffmanncorporation.com/stoky/micro/ --> Snake 2008


    Tout d'abord peut on faire une connection TCP serveur/client sur des Iphone/Ipad via des sockets ?
    Pour terminer, je te dirais de faire attention. Première chose, on programme généralement en Objective-C sur ces bêtes là, soit bien sûr de pouvoir programmer en C et d'avoir accès à ce genre de services sur iOS ! Deuxième chose, si tu comptes passer par la 3G, il y a un risque que ton opérateur ne laisse pas passer n'importe quel protocole et surtout bloque certains ports. Il faut aussi que les ports soient ouverts sur l'iMachin. Ce sera sûrement plus simple dans un premier temps si tous les joueurs sont connectés au même réseau Wifi.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Bktero Voir le message
    "localhost" n'est sûrement pas le nom de l'hôte distant puisque c'est toi le localhost. Le problème vient aussi de ça : tu veux mettre un nom mais comment connaitre ce nom ? Sur un réseau local, ça peut encore marcher, mais dés que tu seras sur Internet, tu ne pourras pas résoudre un nom de machine en une adresse IP.
    Oui je me doutais que localhost ne fonctionnerait pas, c'était juste le dernier test effectué au moment où j'ai posté ^^

    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Echec du connect(), le code d'erreur est %d\n",  errno);
    Je lis sur le net que le code 61 est ENODATA mais pour le man de connect() ne parle pas de ce code... Pourrais-tu utiliser perror() ou stderror() pour nous confirmer le code. Et n'hésites pas à remettre ERRNO à 0 avant d'appeler connect()
    Le perror me donne un : "Connection refused" ...

    Citation Envoyé par Bktero Voir le message
    J'en ai déjà parlé. Il faut mettre l'adresse IP du serveur et le port du serveur !

    Attention : le port 23 est le port telnet : http://fr.wikipedia.org/wiki/Liste_de_ports_logiciels Tu ne devrais (pourras ?) pas l'utiliser. En général, on prend des numéros de ports assez grands et probablement inutilisés (12345 comme proposé par Raymond ^^)
    Ok, bon à savoir ^^ Je change le port.

    Citation Envoyé par Bktero Voir le message
    Pendant mes études, j'avais fait un projet de jeux en réseau sur PC. Les serveur créait une partie. On rentrait alors manuellement l'adresse IP du serveur pour chacun des clients souhaitant se connecter. Cette méthode pourra certainement marcher dans ton cas aussi. Si ça t'intéresse : http://www.hoffmanncorporation.com/stoky/micro/ --> Snake 2008
    Je check ^^ <-- Je n'ai pas le droit d'y accéder ^^

    Citation Envoyé par Bktero Voir le message
    Pour terminer, je te dirais de faire attention. Première chose, on programme généralement en Objective-C sur ces bêtes là, soit bien sûr de pouvoir programmer en C et d'avoir accès à ce genre de services sur iOS !
    Aucun soucis à ce niveau là. Je code bien en objective-C. J'intégre simplement du code C à l'intérieur. Mais je sais que ça fonctionne, c'était même conseillé un peu partour d'utiliser les sockets du C plutot que les sockets de l'Objective-C car trop compliqué ^^

    Citation Envoyé par Bktero Voir le message
    Deuxième chose, si tu comptes passer par la 3G, il y a un risque que ton opérateur ne laisse pas passer n'importe quel protocole et surtout bloque certains ports. Il faut aussi que les ports soient ouverts sur l'iMachin. Ce sera sûrement plus simple dans un premier temps si tous les joueurs sont connectés au même réseau Wifi.
    A la base c'est ce qui est prévu, du moins pour commencer. Je voudrais juste avoir un réseau local avec des appareils partageant le même wifi. J'ai à ma disposition un serveur (un vrai avec des sites web dessus et tout :p ). Comment je pourrais faire en sorte qu'il devienne le serveur de mes devices ?

    Sinon, j'ai pensé : Est-ce que je pourrais utiliser le bluetooth. Je n'ai pas encore exploré cette option mais je vais regardé voir comment ça fonctionne un peu. Mais si vous avez un tuto ou un conseil à me donner je suis toujours preneur ^^

    Edit : Comme on pouvait s'y attendre, avec les modif ça n'a pas fonctionné. Je continu à rechercher.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ram-0000 Voir le message

    Une première solution serait de faire une double connexion client sur un serveur qui possed une adresse IP connus (www.mon_serveur.com par exemple).

    Les 2 clients sur iPhone et iPad se connecte à se serveur et c'est ce serveur qui relie les 2 clients en établissant une passerelle entre les 2 connexion.
    Mais comment le serveur sait quel appareil va communiquer avec quel appareil, puisqu'on ne connait pas leurs adresses ip ...

    Citation Envoyé par ram-0000 Voir le message

    Une autre solution, serait que ton serveur s'enregistre sur un serveur normal (toujours www.mon_serveur.com par exemple) en donnant le nom du service ("mon_service-ipad" par exemple), son adresse IP et son numéro de port.
    Ensuite le client peut faire une requête sur le serveur (www.mon_serveur.com) et demande si le service "mon_service-ipad" est enregistré. Si oui, le serveur www.mon_serveur.com retourne le numéro de port et l'adresse IP. C'est le fonctionnement de la connexion à un service RPC
    Si je fais mon serveur sur un serveur dont je connais l'adresse IP. Faut-il que je lui code quelque chose dessus ?

  7. #7
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Mais comment le serveur sait quel appareil va communiquer avec quel appareil, puisqu'on ne connait pas leurs adresses ip ...
    C'est pour ça qu'on inventé les systèmes d'authentification ! Les listes de contacts et tout peuvent se révéler bien utiles.

    Si je fais mon serveur sur un serveur dont je connais l'adresse IP. Faut-il que je lui code quelque chose dessus ?
    Ça pourrait être utile si tu veux qu'il fasse ce que tu attends de lui.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par imperio Voir le message
    Ça pourrait être utile si tu veux qu'il fasse ce que tu attends de lui.
    Mais du coup, je vais lancer mon programme sur le serveur et il va tourner en permanence en attente des connexions des devices ?

  9. #9
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Mais du coup, je vais lancer mon programme sur le serveur et il va tourner en permanence en attente des connexions des devices ?
    C'est le principe d'un serveur.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Nan mais oui. Mais le programme va tourner en permanence, c'est ça qui me perturbe ^^

  11. #11
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Pour te rassurer, dis-toi que ton OS est un programme et il tourne jusqu'a ce que t'eteignes ton pc ! Le seul truc sur lequel il faut particulierement faire gaffe du coup c'est la gestion de la memoire, ne pas oublier de free ce qu'on malloc (sauf si il y a un garbage collector bien entendu !) sinon on va droit au plantage.

    Autre exemple : les serveurs web, jeux, etc... Ils ne tournent pas tous 24/7 je pense, ils doivent en eteindre certains des fois pour faire de la maintenance ou autre mais dans l'ensemble on les eteint jamais (imagine la perte qu'enregistrerait un site comme facebook s'il n'etait pas dispo quelques heures !).

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ok merci. Je vais tenter de faire ça ^^

    Bon la c'est le week-end, donc du coup ça va être en pause jusqu'à lundi. Mais après je vais faire un code dans le serveur ^^

    Je reviendrais surement vous voir :p

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Alors, j'ai mis mon code serveur sur mon serveur.

    Mais j'ai toujours le même problème :
    Le programme serveur se lance bien et attend une demande de connexion, mais le programme client n'arrive pas à se connecter : j'ai un connection refused.

    Mais, j'aimerais savoir comment je fais pour connaître l'adresse ip de mon serveur ?
    On m'a dit de faire un ifconfig, mais la je n'obtiens qu'une adresse du type : 192.168.X.X
    On m'a dit de mettre celle là, mais je ne suis pas convaincu ^^
    Les 192.168 sont bien juste des adresse de surface non ? Il faut bien que je récupère une adresse unique non ?

    Edit : j'ai tenté de récupérer l'adresse ip d'un site se trouvant sur mon serveur j'ai donc les codes suivant maintenant :

    Code Serveur :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    void connectionServ()
    {
    	int erreur = 0;
     
    	/* Socket et contexte d'adressage du serveur */
        SOCKADDR_IN sin = { 0 };
        SOCKET sock;
        socklen_t recsize = sizeof(sin);
     
        /* Socket et contexte d'adressage du client */
        SOCKADDR_IN csin = { 0 };
        SOCKET csock;
        socklen_t crecsize = sizeof(csin);
     
        int sock_err;
     
     
        if(!erreur)
        {
            /* Création d'une socket */
            sock = socket(AF_INET, SOCK_STREAM, 0);
     
            /* Si la socket est valide */
            if(sock != INVALID_SOCKET)
            {
                printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
     
                /* Configuration */
                //sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
    			sin.sin_addr.s_addr = inet_addr("127.0.0.1");
                sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
                sin.sin_port = htons(PORT);               /* Listage du port */
                sock_err = bind(sock, (SOCKADDR*)&sin, recsize);
     
                /* Si la socket fonctionne */
                if(sock_err != SOCKET_ERROR)
                {
     
    				/* Démarrage du listage (mode server) */
    				sock_err = listen(sock, 1);
                    printf("Listage du port %d...\n", PORT);
                    /* Si la socket fonctionne */
    				if(sock_err != SOCKET_ERROR)
                    {
                        /* Attente pendant laquelle le client se connecte */
                        printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
                        csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
    					if(csock == INVALID_SOCKET)
    					{
    						perror("accept()");
    					}
                        printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
                    }
                    else
                        perror("listen");
                }
                else
                    perror("bind");
     
                /* Fermeture de la socket client et de la socket serveur */
                printf("Fermeture de la socket client\n");
                closesocket(csock);
                printf("Fermeture de la socket serveur\n");
                closesocket(sock);
                printf("Fermeture du serveur terminée\n");
            }
            else
                perror("socket");
        }
    Et au niveau du client :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    void connectionCli(void)
    {
    	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    	if(sock == INVALID_SOCKET)
    	{
    		perror("socket()");
    		exit(errno);
    	}
    	SOCKADDR_IN sin = { 0 }; /* initialise la structure avec des 0 */
    	struct hostent *hostinfo = NULL;
    	const char *hostname = "jiyanoTom.co";
    	hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */
    	if (hostinfo == NULL) /* l'hôte n'existe pas */
    	{
    		fprintf (stderr, "Unknown host %s.\n", hostname);
    		exit(EXIT_FAILURE);
    	}
     
    	sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
     
    	sin.sin_port = htons(PORT); /* on utilise htons pour le port */
    	sin.sin_family = AF_INET;
    	errno=0;
    	perror("Erreur :");
    	if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
    	{
    		perror("Error : ");
    	}
    	else
    	{
    		printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
    	}
    	closesocket(sock);
    }
    Donc quand je lance l'appli serveur toujours aucun soucis, il attend tranquillement une connection.
    Mais le programme client se met à tourner en boucle au niveau du "connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR" puis finit par m'afficher une erreur au bout d'une minute environ : "Operation timed out"

    Voilà, si quelqu'un a une idée ^^

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Mais, j'aimerais savoir comment je fais pour connaître l'adresse ip de mon serveur ?
    On m'a dit de faire un ifconfig, mais la je n'obtiens qu'une adresse du type : 192.168.X.X
    On m'a dit de mettre celle là, mais je ne suis pas convaincu ^^
    Les 192.168 sont bien juste des adresse de surface non ? Il faut bien que je récupère une adresse unique non ?
    Je ne sais pas trop ce que tu appelles une adresse de surface... Une telle adresse est l'adresse à l'intérieur du réseau privé et identifie ton serveur à l'intérieur de ce réseau. Tu travailles déjà sur Internet ou encore en réseau local pour le moment ?

    Une fois ton serveur démarré, peux-tu fais un netcat IP_SERVEUR PORT_ECOUTE pour vérifier que tu peux bien t'y connecter ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Oui quand je disais adresse de surface, je voulais dire adresse locale :p

    Pour l'instant je travaille en local, pour essayer. Une fois que j'aurais réussi à faire une connexion locale, je passerais via internet ^^

    C'est quoi un netcat ?

    Edit : j'ai réussi à faire un netcat (nc ADR PORT) et ça a très bien fonctionné à partir du serveur et à partir d'un autre appareil aussi.

    Edit2 : j'ai enfin réussi à faire communiquer mon device et mon serveur.

    Malgré tout, j'aimerais savoir s'il n'y a pas un moyen de récupérer l'adresse ip d'un appareil connecté sur le même réseau.
    Et j'aimerais aussi savoir comment fonctionne les sockets bluetooth :p

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est quoi un netcat ?

    Edit : j'ai réussi à faire un netcat (nc ADR PORT) et ça a très bien fonctionné à partir du serveur et à partir d'un autre appareil aussi.
    Comme tu l'as peut-être constaté, netcat est un utilitaire réseau très pratique pour faire des tests. On peut créer des serveurs et des clients avec.

    Comment as-tu fait pour faire communiquer ton client et ton serveur ?

    Malgré tout, j'aimerais savoir s'il n'y a pas un moyen de récupérer l'adresse ip d'un appareil connecté sur le même réseau.
    Question bête : imagine que tu es un outil pour convertir un nom d'appareil en adresse IP. Tu lui donnes quoi en paramètre à ton outil ? Tu souhaiterais savoir qui sont les appareils présents sur le réseau ? Une découverte automatique du réseau en quelque sorte ?

    Et j'aimerais aussi savoir comment fonctionne les sockets bluetooth :p
    Je pense que c'est un sujet qui n'a rien à voir
    En revanche, je ne pense que si le bluetooth n'est adapté à ton problème. Sauf si cela a changé depuis 2010 avec les nouvelles spécifications, la connexion bluetooth est faite entre une paire et il n'y a pas de notion de serveur.

    PS : http://www.hoffmanncorporation.com/b...controleur.php --> Snake 2008

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Comme tu l'as peut-être constaté, netcat est un utilitaire réseau très pratique pour faire des tests. On peut créer des serveurs et des clients avec.

    Comment as-tu fait pour faire communiquer ton client et ton serveur ?
    Simplement avec l'adresse ip de mon serveur en local ^^
    Mais finalement, je me rend compte que ça ne serait pas la bonne solution.
    Je vais tenter de réexpliquer mon projet plus clairement.
    Imaginons 4 machines : S, A, B et C. Ce sont tous des Ipad ou Iphone.

    S lance le programme et choisit de créer une partie. Il envoie alors des informations dans le réseau local.

    A et B veulent rejoindre la partie. Ils lancent donc eux aussi le programme et recherche les informations envoyés par S. Une fois connectés, les appareils s'envoient des informations tout au long de la partie.

    Je suis en train de me demander si les sockets sont la bonne solution ...

    Citation Envoyé par Bktero Voir le message

    Question bête : imagine que tu es un outil pour convertir un nom d'appareil en adresse IP. Tu lui donnes quoi en paramètre à ton outil ?
    ben le nom de l'appareil, mais je ne l'ai pas forcement non plus ...

    Citation Envoyé par Bktero Voir le message
    Tu souhaiterais savoir qui sont les appareils présents sur le réseau ?
    Ca pourrait servir. Mais c'est pas obligatoire. En tout cas, pas pour l'instant.

    Citation Envoyé par Bktero Voir le message
    Une découverte automatique du réseau en quelque sorte ?
    Qu'est-ce que tu entend par là ?

    Citation Envoyé par Bktero Voir le message
    Je pense que c'est un sujet qui n'a rien à voir
    En revanche, je ne pense que si le bluetooth n'est adapté à ton problème. Sauf si cela a changé depuis 2010 avec les nouvelles spécifications, la connexion bluetooth est faite entre une paire et il n'y a pas de notion de serveur.

    PS : http://www.hoffmanncorporation.com/b...controleur.php --> Snake 2008
    C'est que pour deux appareils le bluetooth ? Ouai donc ça me va pas ^^
    Et pour ton jeu, tu la codé pour windows non ? Du coup, ya quand même pas mal de chose qui change ^^

    Alors j'ai réussi à trouver un code pour récupérer l'adresse ip mais la fonction qui devait me servir ne fonctionne pas sur Ipad/Iphone .... Quelqu'un a une idée pour remplacer ioctl(3) ?

Discussions similaires

  1. Problème de connexion sockets
    Par shadma dans le forum C#
    Réponses: 5
    Dernier message: 17/02/2011, 16h53
  2. Problème de connexion Socket en TCP
    Par jerdream78 dans le forum Réseau
    Réponses: 11
    Dernier message: 26/02/2010, 12h05
  3. problème de connexion :socket
    Par alamidev dans le forum C#
    Réponses: 0
    Dernier message: 29/04/2009, 13h23
  4. Problème de connexion socket
    Par stephane.julien dans le forum C#
    Réponses: 3
    Dernier message: 24/04/2008, 18h28
  5. problème de connexion sur un socket SSL
    Par koolway dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/06/2006, 11h20

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