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

Langage C++ Discussion :

Problème socket en distant


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Problème socket en distant
    Bonjour à tous,
    Le socket fonctionne avec une adresse IP locale mais quand j'essaye avec celle distante le socket "s'éteint apparemment car il ne sait plus le lire dans la mémoire:
    Nom : 1446805901-screen.png
Affichages : 193
Taille : 8,6 Ko
    Je ne comprends pas pourquoi ça ne le fait pas avec une adresse locale.
    Merci d'avance.

  2. #2
    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
    Il nous manque beaucoup d'information là... Qu'est-ce que tu appelles "à distance" pour commencer ? Réseau local ? PC distant en dehors de ton réseau ? Dans le deuxième cas, si c'est un pc derrière une box, il te faudra ouvrir le port que tu veux binder.

    Ensuite, nous montrer un peu de code nous aiderait grandement.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    C'est apparemment de cette fonction que vient le problème :
    Et je viens d'essayer avec un deuxième ordinateur en utilisant une addresse IP locale (donc 192.168.0.x)
    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
     
    bool Network::Download(std::string filename, std::string type)
    {
    	char Exist[16] = "";
    	send(sock, "Send", 128, 0);
    	send(sock, filename.c_str(), 128, 0);
    	send(sock, type.c_str(), 8, 0);
    	recv(sock, Exist, 64, 0);
    	if (Exist[0] == 'E')
    	{
    		std::ofstream file;
     
    		if (type == "Song")
    			file.open("song.mp3", std::ios::binary | std::ios::trunc);
    		else if (type == "Text")
    			file.open("text.txt", std::ios::binary | std::ios::trunc);
    		else if (type == "Image")
    			file.open("img.png", std::ios::binary | std::ios::trunc);
    		else if (type == "List")
    			file.open("list.txt", std::ios::binary | std::ios::trunc);
    		else if (type == "Playlist")
    			file.open("playlist.txt", std::ios::binary | std::ios::trunc);
     
     
     
    		char lenght[64];
     
    		recv(sock, lenght, 64, 0); long long int l = atoi(lenght) + 1;
    		std::vector<char> v(l);
     
    		recv(sock, v.data(), l, 0);
     
    		file.write(v.data(), l);
    		file.close();
    	}
    	return true;
    }
    Et le port utilisé est bien ouvert.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    • c'est du C++, on est dans le forum C (NdlM : discussion déplacée)
    • c'est quoi sock ? une variable globale ? déclarée et initialisée comment ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Oui c'est du c++ mais comme le problème viens du socket je me suis dit que le forum c était plus adapté.
    Et sock c'est une variable de type SOCKET.

    Déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Network
    {
    	public:
    		Network();
    		bool Connect(std::string username, std::string serverip);
    		bool Download(std::string filename, std::string type);
    		~Network();
    		SOCKET sock;
     
    	private:
    		WSADATA WSAData;
    		SOCKADDR_IN sin;
    };
    Initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool Network::Connect(std::string username, std::string serverip)
    {
    	WSAStartup(MAKEWORD(2, 2), &WSAData);
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    	sin.sin_addr.s_addr = inet_addr(serverip.c_str());
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(25565);
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    	send(sock, (username).c_str(), 64, 0);
     
    	return true;
    }

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par kickflip1408 Voir le message
    comme le problème viens du socket je me suis dit que le forum c était plus adapté.
    je vois pas le rapport

    aussi tu notes plus haut que tu test sur 192.168.0.x, ce n'est pas une IP locale à proprement parler, c'est une IP de ton réseau local, mais pour le système c'est bien une IP distante (ça sort de la carte réseau, pas comme 127.0.x.x)
    tu es sûr que le serveur en face était bien joignable (chemin ok + port ouvert, => netcat ?) ?

    sinon ne causant pas C++ pour deux sous je pourrai pas t'aider plus pour ma part dsl

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Oui, les deux ordinateurs sont connectés car mon serveur lui envoie bien des fichiers mais après plusieurs envois (2-3 fichiers), le socket se déconnecte, je pense. Et j'ai vérifié les fichiers reçus qui était correctement reçus (identique au fichier source). Mais je ne sais pas pourquoi car quand je fais serveur + client sur le même ordinateur tout se passe bien.

  8. #8
    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
    Bonjour,

    Je déplace la discussion dans le forum C++.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    On va se répéter mais bon...
    ton code est loin d'être bon, tes symptomes n'ont aucun sens et ton "problème" ne veut rien dire.
    Un socket TCP ne se ferme pas tout seul par magie, s'il se ferme c'est qu'un des 2 côtés le ferme, ou que le réseau est mort (cable arraché, ..). Tu peux toujours essayer de choper l'erreur aussi.
    Tu utilises surtout des buffers au petit bonheur la chance et dois avoir bien de la chance que ça marche ne serait-ce qu'une fois. Parce que faire un send(sock, "Send", 128, 0); c'est plutôt périlleux.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Pourquoi est-ce périlleux ? (Je suis débutant donc tout conseil est le bienvenu)
    Et j'ai trouvé l'erreur le programme se coupe car "libpng error bad adaptive filter value".
    Donc c'est le fichier reçu qui est modifié mais seulement les .png, les .txt sont identiques aux fichiers sources.
    Mais ce que je n'arrive pas à comprendre c'est pourquoi quand je le fait sur un seul ordinateur ça fonctionne alors qu'avec deux ça me fait cette erreur.

  11. #11
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Bonjour,

    Déjà tu peux te reporter à la discussion que tu as ouvert sur le même sujet, lire mes commentaires et en tenir compte, en particulier les points 2 et 3. Une fois que tu auras fait tout ça, tu pourras redemander de l'aide.

    Cordialement.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par kickflip1408 Voir le message
    Pourquoi est-ce périlleux ? (Je suis débutant donc tout conseil est le bienvenu)
    Un conseil ? Lis la doc
    Quand c'est précisé sur tout internet que le 3° paramètre est la longueur du buffer passé en 2° paramètre, et que tu mets un 128 pour une chaîne de.. 4 caractères...
    Non vraiment, rien ne te choque ?

    Citation Envoyé par kickflip1408 Voir le message
    Et j'ai trouvé l'erreur le programme se coupe car "libpng error bad adaptive filter value".
    Donc c'est le fichier reçu qui est modifié mais seulement les .png, les .txt sont identiques aux fichiers sources.
    Mais ce que je n'arrive pas à comprendre c'est pourquoi quand je le fait sur un seul ordinateur ça fonctionne alors qu'avec deux ça me fait cette erreur.
    Si le problème vient de la libpng, sur un même ordinateur tu utilises.. la même lib. Ton ordinateur distant pas forcément.

    http://lmgtfy.com/?q=socket+C+send
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ok merci je modifierais ça mais en farfouillant un peu avec Notepad ++, j'ai remarqué que toute une partie du fichier était manquante et les caractères manquants étaient remplacés par des "void". Donc ce n'est pas vraiment libpng ce sont bien les sockets le problèmes donc j'ai aussi vérifié si c'était dû à la lecture du fichier sur le serveur (on ne sait jamais) mais là tout le fichier y était. Donc ça ne peut-être que les sockets. J'ai donc essayé d'envoyer le fichier en de plus petits paquets (plus de bugs en-dessous de 128 octets par paquet). Ce qui est étonnant c'est que je n'ai besoin de faire ça qu'avec l'IP "distante" (sur le même ordinateur)
    ou avec deux ordinateurs différents. Le TCP ne garantit-il pas l'intégralité des données envoyées ?
    Edit : Fenkys, je ne l'avait pas vu excuse moi, j'avais cru avoir résolu ce problème là en ayant celui-ci qui finalement est encore le même problème.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le TCP ne garantit-il pas l'intégralité des données envoyées
    A que non !
    Il garantie que les données seront reçu en séquence, si elles sont reçues.
    Il ne garantie pas non plus que l'envoie d'une série d'octet sera reçu en un coup de l'autre coté.
    Lisez cette foutue documentation.

  15. #15
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Citation Envoyé par kickflip1408 Voir le message
    Le TCP ne garantit-il pas l'intégralité des données envoyées ?
    A que non !
    enfin, sans garantir l'intégrité il effectue quand même une somme de contrôle, en pratique perdre des paquets UDP est assez rare, mais tomber sur des paquets TCP "endommagés" et ayant un checksum valide qui passent le driver et remontent endommagés à l'application doit être encore plus bien plus rare

    je plussoie le fait de lire la doc cela dit

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    TCP ne garantit pas la bonne réception des données, somme de contrôle ou pas.
    Quand vous utilisez une socket TCP en émission, au retour de l'envoie, la seule garantie, c'est que le Kernel a bien enregistré les données à transmettre et qu'il va essayer de les transmettre, pas plus de garanties que ça.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos conseils je vais lire la doc' et refaire mon programme plus proprement avec ce que vous m'avez dit.

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    TCP garantit que les données envoyées seront reçues, et dans l'ordre. Tant que la connexion est maintenue, des deux côtés, "assez longtemps pour tout transférer".
    Il reste que si tu veux t'assurer que les données ont vraiment été reçues, le destinataire doit t'envoyer un ack. Tu ne peux pas ouvrir la boîte noire TCP pour vérifier le ack utilisé en interne pour t'en assurer. Il faut passer par un ack applicatif.

    en pratique perdre des paquets UDP est assez rare
    On estime cette perte à <5% en temps normal. C'est loin d'être rare en pratique, vu qu'on utilisera UDP pour faire du P2P, souvent du hole punching, où on l'envoit ~10-100 packet/s, ça fait déjà une poignée de paquets perdus par seconde.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    TCP garantit que les données envoyées seront reçues, et dans l'ordre. Tant que la connexion est maintenue, des deux côtés, "assez longtemps pour tout transférer".
    Ça garantie donc que dalle. On n'ai donc d'accord. Surtout avec l'algorithme Nagle activé.
    https://fr.wikipedia.org/wiki/Algorithme_de_Nagle
    Merci pour vos pouces rouges, ça fait toujours plaisir.

    Comme l'indique @Bousk, il vous faut un acquittement applicatif pour garantir une bonne réception des données par l'application distance. (niveau 5 "session" du modèle OSI de l'ISO).

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Avec les garanties de TCP citées par Bousk, ça veut au moins dire qu'un seul acquittement applicatif suffit, à la fin du transfert; pas besoin de gymnastique bizarre de correction d'erreurs avancée, à moins de données vraiment sensibles.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème socket raw ? bizarre :~
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 12/07/2005, 14h12
  2. [MFC] Problème Socket + Connexion SQL
    Par BananaUltra3C dans le forum MFC
    Réponses: 6
    Dernier message: 20/05/2005, 16h41
  3. [Réseau] Problème socket
    Par neenee dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 18/01/2005, 15h26
  4. Problème de connexion distante
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2005, 14h03
  5. problème de connexion distante
    Par nico31120 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/12/2004, 12h58

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