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 :

[Réseau] [Socket] Se connecter à partir d'une socket ID


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Points : 6
    Points
    6
    Par défaut [Réseau] [Socket] Se connecter à partir d'une socket ID
    Bonjour à tous, après plusieures recherches, je m'en remet à vous..

    J'essaye d'apprendre un maximum de choses sur les socket en C d'où le fait que je fasse pleins de programmes inutiles en pratique mais très instructif à la création !

    Aujourd'hui j'ai essayé de m'adonner à un sujet précis : les Socket ID, en effet lorsque l'on connect la socket en question, la variable de type SOCKET contient alors son ID (la socket id de la connexion). Elle est à chaques fois différentes puisque le programme en prend une disponible, et tant qu'on ne ferme pas la socket, la connexion reste établit sur l'id en question.


    Voici donc mon probléme (ou ma question):

    Comment faire, pour envoyer des packet avec un socket déjà connectée et avec sa socket ID (donc sans créer de socket) ?

    En effet, si la socket ID est déjà connectée, il n'est plus la peine de créer de SOCKADDR contenant l'ip de destination et le port. Mais comment communiquer avec simplement une ID de socket? ??

    J'ai essayer d'intégrer mon ID dans send () au premier argument, mais ça me retourne l'erreure 10038 qui dit que ce n'est pas un socket (en effet j'ai mit l'id, donc un int). J'ai alors tenté de faire un SOCKET sock=988 (988 c'est l'ID à laquelle je désire me connecter) et de mettre mon sock dans le send directement mais j'ai toujours l'erreur 10038.

    Donc je n'ai plus d'issue, sur internet je ne trouve rien et il n'existe pas de fonction permetant de se connecter à partir d'un Socket ID ou qui permet de retourner une SOCKADDR à partir d'une socket ID non plus.. Peut être il me faut une nouvelle librairire ?


    Merci de votre aide !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Le terme "Socket ID" n'existe pas.
    • Sous un système unixoïde, la valeur retournée par les fonctions socket() et accept() n'est qu'un descripteur de fichiers, tout comme beaucoup de ressources sous POSIX. En tant que descripteur, c'est donc une valeur locale à un processus, qui n'a de sens que dans ce processus-là. Une fois le processus terminé, le socket est fermé.
    • Sous Windows, cette valeur est un handle (on le sait car DuplicateHandle() marche dessus) et les mêmes restrictions s'appliquent.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tacos Voir le message
    Aujourd'hui j'ai essayé de m'adonner à un sujet précis : les Socket ID, en effet lorsque l'on connect la socket en question, la variable de type SOCKET contient alors son ID (la socket id de la connexion). Elle est à chaques fois différentes puisque le programme en prend une disponible, et tant qu'on ne ferme pas la socket, la connexion reste établit sur l'id en question.

    Voici donc mon probléme (ou ma question):

    Comment faire, pour envoyer des packet avec un socket déjà connectée et avec sa socket ID (donc sans créer de socket) ?

    En effet, si la socket ID est déjà connectée, il n'est plus la peine de créer de SOCKADDR contenant l'ip de destination et le port. Mais comment communiquer avec simplement une ID de socket? ??

    J'ai essayer d'intégrer mon ID dans send () au premier argument, mais ça me retourne l'erreure 10038 qui dit que ce n'est pas un socket (en effet j'ai mit l'id, donc un int). J'ai alors tenté de faire un SOCKET sock=988 (988 c'est l'ID à laquelle je désire me connecter) et de mettre mon sock dans le send directement mais j'ai toujours l'erreur 10038.

    Donc je n'ai plus d'issue, sur internet je ne trouve rien et il n'existe pas de fonction permetant de se connecter à partir d'un Socket ID ou qui permet de retourner une SOCKADDR à partir d'une socket ID non plus.. Peut être il me faut une nouvelle librairire ?
    J'ai du mal à saisir ta question. Le numéro de socket retourné par la fonction 'socket()' est un numéro qui n'est valide qu'entre l'appel de socket() et l'appel de close() (ou closesocket() ). Sa valeur (si >0) importe peu. Tout ce qu'il faut faire, c'est s'en souvenir dans une variable et passer sa valeur à toutes les fonctions qui en ont besoin, à savoir, bind(), connect, listen(), accept(), send(), recv(), sendto(), recvfrom(), shutdown() etc.

    Je conseille une initiation détaillée et pas à pas, comme ici :

    http://emmanuel-delahaye.developpez.com/reseaux.htm

    Je pense que tu te fais des noeuds au cerveau pour rien...
    Montre ton code...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Très bien alors admettons que nous avons deux programmes, l'un ouvre un socket et se connecte à une serveur smtp par telnet ou quelque chose comme ça on va dire. J'aimerais que le second programme, puisse se connecter aussi à ce même serveur, mais sans avoir à insérer l'ip et le port, et sans avoir à ouvrir un deuxième socket : mais en utilisant le socket du programme numéro 1 (le socket n'a pas été fermé).

    Est-ce possible ?

    EDIT : En faite, la fonction connect();, une fois utilisée, change la valeure de son premier argument (la socket ouverte) par ce que j'appéle la "Socket ID" ou numéro descriptif, ou d'identification de la socket. J'aimerais pouvoir retrouver appeler ou ouvrir la socket simplement en l'appelant par cette identification qui n'est effectivement valable qu'en local bien entendu (mais je doute qu'elle soit locale au processus uniquement), je vois plutôt ça comme les pID des appli ouvertes : en locale, une id est unique, elle se close et s'ouvre ..


    EDIT 2 :

    1e code :

    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
     
    char buffer[10]="Mon.packet"; 
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);     
    SOCKADDR_IN test; 
     
    test.sin_addr.s_addr	= inet_addr("127.0.0.1");
    test.sin_family		= AF_INET;
    test.sin_port		= htons(33333);
    connect(sock,(struct sockaddr*)&test,sizeof(test));
     
     
    if (send(sock,buffer,strlen(buffer),0) == SOCKET_ERROR )
    printf("\nerreur : %d\n",WSAGetLastError()); 
    printf("%d",sock);
    system("PAUSE");
    Le programme se connecte, et m'affiche sa "Socket ID" (le printf du bas) ici, on va dire qu'il affiche 760

    Programme numéro 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char buffer[10]="MonPacket2"; 
    SOCKET socketid=760;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);   
    int tableau;
                if (send(socketid,buffer,strlen(buffer),0) == SOCKET_ERROR )
          printf("\nerreur : %d\n",WSAGetLastError()); 
     
     
    WSACleanup();
    system("PAUSE");
    Voilà ce que j'ai tenté de faire, mais qui m'affiche l'erreur 10038.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tacos Voir le message
    Très bien alors admettons que nous avons deux programmes, l'un ouvre un socket et se connecte à un serveur smtp par telnet ou quelque chose comme ça on va dire. J'aimerais que le second programme, puisse se connecter aussi à ce même serveur, mais sans avoir à insérer l'ip et le port, et sans avoir à ouvrir un deuxième socket : mais en utilisant le socket du programme numéro 1 (le socket n'a pas été fermé).

    Est-ce possible ?
    Non.
    Une connexion par socket. C'est tout.
    (mais le tuyau est fait pour supporter des tas des connexions similtanées grâce au numéro de ports... t'occupe, c'est automatique).

    Tu devrais étudier un peu le sujet (réseaux, protocoles, adressage, services, IP, TCP, UDP, client, serveur) avant de te lancer dans la programmation réseau. Il faut avoir quelques bases...

    EDIT : En faite, la fonction connect();, une fois utilisée, change la valeure de son premier argument (la socket ouverte)
    Mais qu'est-ce que tu racontes ? Tu bricoles quoi exactement ? L'informatique, c'est pas "je fais n'importe quoi jusqu'à ce que ça marche"... On lit la théorie, on lit la doc des fonctions, on expérimente pas à pas, un concept à la fois etc. Arrête la bidouille, ça ne mène à rien.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bref, tu veux partager une connexion réseau entre deux programmes clients (apprends à formuler correctement des demandes).

    Cela n'est absolument pas recommandé, mais:
    • Sous un système unixoïde, cela n'est possible que si les deux programmes sont parents. Notamment, un programme se connecte, puis forke.
    • Sous Windows, c'est possible que les programmes soient parents ou non. C'est plus facile si les programmes sont parents (héritage de handle), mais possible également s'ils ne le sont pas (duplication de handle + IPC pour communiquer le handle d'un processus à l'autre).

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tacos Voir le message
    1e code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    OK
    Programme numéro 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SOCKET socketid=760;
    <...>
                if (send(socketid,buffer,strlen(buffer),0) == SOCKET_ERROR )
    Voilà ce que j'ai tenté de faire, mais qui m'affiche l'erreur 10038.
    Evidemment... la valeur de socketid est absurde.

    Le jour où tu auras compris quelle est la durée de vie et la portée d'un socket, tu verras que tu fais n'importe quoi. Un socket, c'est strictement local à un processus. Point.

    C'est peut être partageable entre un processus père et un processus fils, mais entre 2 processus indépendants, non. De toutes façon, utiliser une fonction socket sans être passé par la fonction socket() est aussi absurde que d'utiliser une fonction fichier sans être passé par fopen()...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Si je bidouille c'est pour apprendre, j'ai un projet là c'est de réussir ce que j'aspire dans ce poste. Grace à ce projet, j'ai la motivation d'aller chercher loin les informations pour le réussir, si j'ai dit des bétises, autant pour moi j'essaye simplement d'être le plus clair dans le projet que j'ai établit. Je n'ai jamais dit que tout ce que je disais était vrai, que je connaissait les socket sur le bout des doigts et que je vous apprends des choses, mais j'ai seulement dit ce que je pensais en espérant qu'on me dise que c'est vrai, où en espérant que l'on me dise pourquoi c'est faux.

    Je ne viens pas ici pour me faire engueler sur ma façon d'apprendre, je viens ici pour trouver des réponses sur un sujet qui me turlupine depuis pas mal de temps. Alors on me dit que c'est possible et on pourra discuter de comment, ou on me dit que c'est impossible, et j'aimerais comprendre pourquoi. Ta réponse me remet en place mais ne m'aide en rien ni dans mon projet, ni dans mes recherches, ni dans ma motivation.


    Merci à Medhinoc je comprend un peux mieux où je dois me diriger.

    EDIT : J'ai mit le socket 760 uniquement pour que vous compreniez mieux ce que je veux, je sais parfaitement que c'est complétement absurde et que ça ne pourra jamais marcher, contrairement à ce que tu pense j'ai lu la doc de toutes les fonctions de winsock2, j'ai lut ton lien depuis un bail, seulement au moins vous avez l'air d'avoir mieux compris ce que je voulais grace à ce soketid... Je pose une question pas pour qu'on me dise "C'est faux, t'est une merde reprend depuis le début ou change de voie", mais plutot pour qu'on me dise "C'est faux, tu n'a pas compris que la durée de vie d'une socket est comme celle d'une variable..blablabla"

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/02/2015, 05h50
  2. Réponses: 1
    Dernier message: 03/01/2012, 18h14
  3. Ouvrir une socket sur un PC qui ne fait pas partie du réseau local
    Par Poupinelelapin dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 03/04/2010, 23h16
  4. [Réseau] persistance d'une socket en PHP
    Par iznogoud36 dans le forum Langage
    Réponses: 4
    Dernier message: 05/10/2006, 14h47
  5. [Réseau] plusieurs flux a partir d'une socket
    Par al85 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/01/2005, 18h11

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