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

C++ Discussion :

Violation d'accès memcpy - socket ( client TCP )


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant en 2ème année de BTS IRIS
    Inscrit en
    Juillet 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant en 2ème année de BTS IRIS

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2
    Par défaut Violation d'accès memcpy - socket ( client TCP )
    Salut tout le monde,

    Alors voilà mon problème, je m'entraîne pour mon projet de deuxième année de BTS en réalisant un client TCP codé en C++.
    Pour ça j'ai créé ma propre classe clientTCP qui se contente d'utiliser l'API socket de windows.

    D'après mon RAD ( C++ Builder XE7 ) tout le code semble correct sauf la ligne où j'utilise le memcpy pour copier les informations de ma structure hostent dans ma structure in_addr.

    Voici le code de l'implémentation du constructeur :

    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
    clientTCP::clientTCP(const char* adresse_ip, unsigned long port)
    {
     
    	//On vérifie que le port est valide
    	if ( port >= 0 )
    	{
     
    	        //On affecte le port passé en paramètre
        	        this->port = port;
     
                    //On initialise la zone mémoire de la structure d'adresse
    		memset(&client_addr, 0, sizeof(struct sockaddr_in));
     
    		//On commence à renseigner les structures
    		client_addr.sin_family = AF_INET;
    		client_addr.sin_port = htons(port);
    		serveur_host = gethostbyname(adresse_ip);
    		memcpy(&client_addr.sin_addr, serveur_host->h_addr, serveur_host->h_length);
     
    		//On crée une nouvelle socket
    		sock = socket(AF_INET, SOCK_STREAM, 0);
     
    	}
    }
    Voici l'en-tête de la classe :

    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
    #ifndef clientTCPH
    #define clientTCPH
     
    #include <string>
    #include <winsock2.h>
     
    using namespace std;
     
    class clientTCP
    {
     
    	private:
    		unsigned long port;
    		SOCKET sock;
    		SOCKADDR_IN client_addr;
    		hostent* serveur_host;
     
    	public:
    		clientTCP();
    		clientTCP(const char* adresse_ip, unsigned long port);
    		int connectWithServer();
    		int sendData(const char* buf, unsigned long taille);
    		int readData(char* buf, unsigned long taille);
    		int closeConnexion();
    		~clientTCP();
     
    };
     
    #endif
    L'instance de ma classe dans le programme principale ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Instance du client TCP
    clientTCP* client = new clientTCP(adresse_ip, port); //adresse_ip = "192.168.1.26" et port = 6666
    Mon RAD me renvoie cette erreur :

    Violation d'accès à l'adresse 0040301E dans le module 'Project1.exe'.
    Lecture de l'adresse 0000000A.
    Je n'arrive pas à voir d'où vient le problème, à priori j'essai de lire à une adresse dont je n'ai pas l'accès mais vraiment, je ne vois pas d'où vient le problème.
    J'espère que quelqu'un pourra m'aider à comprendre mon erreur !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    gethostbyname peut retourner NULL.

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Il faut toujours tester les valeurs de retour (ou utiliser des librairies avec des API C++ et non C).

Discussions similaires

  1. [Débutant] Envoie de socket - Serveur TCP > Client.
    Par taiuzer dans le forum VB.NET
    Réponses: 0
    Dernier message: 05/10/2013, 16h52
  2. client tcp socket
    Par khawlita dans le forum C#
    Réponses: 5
    Dernier message: 19/04/2009, 21h47
  3. discussion entre socket client et serveur (TCP)
    Par xokami35x dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 08/06/2008, 19h21
  4. ServerSocket, socket cliente et acces par navigateur
    Par vincent62149 dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 22/01/2008, 14h55
  5. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26

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