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 :

Erreur de NullPointerException avec un deleguate void


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 96
    Par défaut Erreur de NullPointerException avec un deleguate void
    Bonjour,

    Je suis en train de faire une .dll qui intercepte le Trafic de l'ordinateur.

    Voici mes codes:

    L'erreur est situé dans la classe AddressHandler, où c'est écrit // ERREUR NULLPOINTEREXCEPTION ICI À EVENT(P);

    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
     
    using System.Net;
    using System.Net.Sockets;
     
    namespace PacketReceiver
    {
     
        // This is the event handler. It takes a void
        // that as for parameter a Packet which contains
        // received Packet's data.
        public delegate void PacketReceivedHandler(Packet packet);
     
        // Every time a Packet is caught it will be treated
        // by this class and then sent as parameter throught
        // OnReceive.
        public class PacketReceiver
        {
     
            // This is the event, every time a Packet is caught
            // the class will fire this event.
            public event PacketReceivedHandler OnReceive;
     
            // Hosts on the current platform.
            // There might be more than 1 address
            // on the same platform.
            private IPAddress[] Hosts;
            // Handle the hosts.
            private AddressHandler[] Handlers;
     
            public PacketReceiver()
            {
                Hosts = Dns.Resolve(Dns.GetHostName()).AddressList;
                Handlers = new AddressHandler[Hosts.Length];
                if (Hosts.Length == 0)
                {
                    return;
                }
                for (int i = 0; i < Hosts.Length; i++)
                {
                    Handlers[i] = new AddressHandler(OnReceive, Hosts[i]);
                }
            }
     
            public void StartReceiving()
            {
                for (int i = 0; i < Handlers.Length; i++)
                    Handlers[i].StartReceiving();
            }
     
            public void StopReceiving()
            {
                for (int i = 0; i < Handlers.Length; i++)
                    Handlers[i].StopReceiving();
            }
     
        }
    }
    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
     
    using System;
    using System.Net;
    using System.Net.Sockets;
     
    namespace PacketReceiver
    {
        class AddressHandler
        {
     
            // This is the OnReceive event
            // is this class, and it's going to
            // be called when a Packet is caught.
            private event PacketReceivedHandler Event;
     
            // Handle the host passed as parameter.
            private IPAddress Host;
     
            // Handle bytes of incomming Packet.
            private byte[] Buffer;
     
            // Socket that handles incomming Packets.
            private Socket Entry;
     
            public AddressHandler(PacketReceivedHandler evt, IPAddress host)
            {
                Event = evt;
                Host = host;
                Buffer = new byte[65535];
            }
     
            public void StartReceiving()
            {
                Entry = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
                Entry.Bind(new IPEndPoint(Host, 0));
                Entry.IOControl(-2147483648 | 0x18000000 | 1, BitConverter.GetBytes((int)1), null);
                Entry.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.PacketReceived), null);
            }
     
            public void StopReceiving()
            {
                Entry.Close();
                Entry = null;
            }
     
            private void PacketReceived(IAsyncResult iar)
            {
                int received = Entry.EndReceive(iar);
                byte[] packet = new byte[received];
                Array.Copy(Buffer, 0, packet, 0, received);
                Packet p = new Packet(packet);
                // ERREUR DE NULLPOINTEREXCEPTION ICI À EVENT(P);
                Event(p);
                Entry.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.PacketReceived), null);
            }
     
        }
    }
    Merci de m'aider.

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Bonjour, c'est pas très lisible tout ça, il y a surement une mauvaise conception à la base (2 broacaster pour le même event ça ne sent pas bon), autrement le NullPointerException s'explique simplement : tu ne vérifies pas qu'il n'est pas null.
    D'autre part, il y a une manière standard d'utiliser les events :
    http://msdn.microsoft.com/fr-fr/libr...(v=VS.80).aspx
    Cordialement.

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il faut voir un Event comme une liste d'objets qui écoutent. Si il n'y a aucun objet qui écoute alors la liste est nulle.
    Il ne faut pas lever directement lever un évènement comme ceci dans ton code mais plutôt passer par une méthode qui lève celui ci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void RaisePacketReceived(Packet p)
    {
        if(Event!=null) // Au moins un abonné
            Event(p);
    }

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 96
    Par défaut
    Merci bien. J'y vois et je vous reviens.

Discussions similaires

  1. Erreur "java.lang.NullPointerException" avec JSF
    Par opium1er dans le forum JSF
    Réponses: 6
    Dernier message: 15/07/2013, 18h16
  2. Erreur java.lang.NullPointerException avec boîte à liste
    Par Halo2550 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 06/03/2013, 13h12
  3. Erreur sur IIS avec des cripts ASP
    Par Alin dans le forum ASP
    Réponses: 7
    Dernier message: 22/06/2004, 14h15
  4. erreur tcp/ip avec jdbc
    Par champion dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 03/04/2004, 14h32
  5. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29

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