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 d'access violation.


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut Problème d'access violation.
    Bonjour,

    Je suis actuellement en train de développer un serveur en C++ (projet scolaire). Comme il doit être multi archi, je suis en train d'encapsuler les appels systèmes réseaux pour une meilleur transparence. Cependant j'ai un probleme avec mes buffer pour les fonctions WSASend et WSARecv voici le main, et le fichier contenant les fonctions:

    main.cpp:
    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
    #include <WinSock2.h>
    #include <iostream>
    #include "WinFunc.h"
     
    int		init_net(int port)
    {
    	SOCKET	s;
    	struct sockaddr_in sin;
     
    	if ((s = _socket(AF_INET, SOCK_STREAM, "TCP")) < 0)
    		return (-1);
    	sin.sin_family = AF_INET;
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_port = htons(port);
    	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) != 0)
    		return (-1);
    	if (listen(s, 20) != 0)
    		return (-1);
    	return (s);
    }
     
    int		main(int ac, char **av)
    {
    	int		port;
    	SOCKET	s;
    	SOCKET	s2;
    	struct sockaddr sock;
    	int			len;
    	char		buf[512];
    	WORD wVersionRequested;
        WSADATA wsaData;
     
        wVersionRequested = MAKEWORD(2, 2);
        WSAStartup(wVersionRequested, &wsaData);
    	len = sizeof(sock);
    	if (ac < 2)
    		return (0);
    	port = atoi(av[1]);
    	if ((s = init_net(port)) != -1)
    	{
    		s2 = _accept(s, &sock, &len);
    		while (1)
    		{
    			_recv(s2, buf, 512);
    			std::cout << buf << std::endl;
    			strcpy(buf, "Hello, World!\n");
    			_send(s2, buf, 14);
    		}
    	}
    	WSACleanup();
    	return (0);
    }
    WinFunc.h:
    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
     
    #ifndef		__WINFUNC_H__
    # define		__WINFUNC_H__
    # include		<WinSock2.h>
     
    typedef	SOCKET	T_SOCKET;	
    typedef int		T_SOCKLEN;
     
    T_SOCKET	_socket(int family, int type, char *proto);
    int			_connect(T_SOCKET sock, struct sockaddr * addr, int namelen);
    T_SOCKET	_accept(T_SOCKET sock, struct sockaddr * addr, T_SOCKLEN *namelen);
    int			_send(T_SOCKET sock, char *buf, unsigned int buff_len);
    int			_recv(T_SOCKET sock, char *buf, unsigned int buff_len);
     
    #endif
    WinFunc.cpp:
    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
     
    #include <WinSock2.h>
    #include "WinFunc.h"
     
     
    T_SOCKET		_socket(int family, int type, char *proto)
    {
    	int		p;
     
    	if (!strcmp(proto, "TCP"))
    		p = IPPROTO_TCP;
    	else
    		p = IPPROTO_UDP;
    	return (WSASocket(family, type, p, NULL, NULL, NULL));
    }
     
    int			_connect(T_SOCKET sock, struct sockaddr * addr, int namelen)
    {
    	return (WSAConnect(sock, addr, namelen, NULL, NULL, NULL, NULL));
    }
     
    T_SOCKET	_accept(T_SOCKET sock, struct sockaddr * addr, int *namelen)
    {
    	return (WSAAccept(sock, addr, namelen, NULL, NULL));
    }
     
    int			_send(T_SOCKET sock, char *buf, unsigned int buff_len)
    {
    	WSABUF	b;
    	DWORD	bytes;
    	int		ret;
     
    	b.len = buff_len;
    	b.buf = buf;
    	ret = WSASend(sock, &b, 1, &bytes, 0, NULL, NULL);
    	if (ret == SOCKET_ERROR)
    		return (-1);
    	else
    		return (bytes);
    }
     
    int			_recv(T_SOCKET sock, char *buf, unsigned int buff_len)
    {
    	WSABUF	b;
    	DWORD	bytes;
    	int		ret;
     
    	b.len = buff_len;
    	b.buf = buf;
    	ret = WSARecv(sock, &b, 1, &bytes, 0, NULL, NULL);
    	if (ret == SOCKET_ERROR)
    		return (-1);
    	else
    		return (bytes);
    }
    Les fonctions WSASend et WSARecv me balance un message de la sorte :
    Unhandled exception at 0x772915de in Server.exe: 0xC0000005: Access violation reading location 0x00000000.
    En remplaçant mes buffer avec un systeme de string (qui est assez moche) ca fonctionne. J'en deduis donc que le probleme vient des char * mais je ne comprend pas l'origine de ce probleme.

    Je bosse sous win7 avec Visual Studio 2010.

    Merci de votre aide
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Resolu le probleme venait de l'argument flags qui etait a NULL.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/12/2008, 22h30
  2. Problème d'Access Violation avec lfind
    Par beegees dans le forum C
    Réponses: 4
    Dernier message: 22/01/2008, 15h00
  3. Réponses: 22
    Dernier message: 28/11/2007, 20h39
  4. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  5. [Visual C++] Problème ADO Access violation
    Par irnbru dans le forum MFC
    Réponses: 2
    Dernier message: 24/10/2005, 11h46

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