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 :

[Sockets-Asynchrone] Probleme d'instance de socket


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [Sockets-Asynchrone] Probleme d'instance de socket
    Bonjour

    Je tente de développer une mini application client/Serveur grâce aux sockets asynchrones mais malgré plusieurs heures de recherche, impossible de trouver la source de mon erreur.

    Lorsque le client se connecte , connexionAcceptCallback est appellée , on récupere le socket actif avec : listensock.EndAccept(asyncResult)
    jusque la pas de plantage mais dès que je mets à la suite le activesock.BeginReceive(buff, 0, buff.Length, SocketFlags.None, receiveCallback, activesock);
    ca plante ...avec comme erreur :
    "la référence d'objet n'est pas definie à une instance d'objet"

    EDIT : La fonction BeginSend fonctionne très bien pourtant elle utilise activesock aussi

    Voila le code qui provoque ce plantage:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    class C_Mysocket
        {
            //Classe socket local perso
            private int port;
            Socket listensock; 
            Socket activesock;
            IPEndPoint endpt;
            
            byte[] buff;
            
            
    
            /*** Fonctions membres ***/
            public C_Mysocket(int _port)
            {
                port = _port;
            }
    
            public int Start()
            {
                try
                {
                      //Ouverture du socket sur l'adresse locale et le port demandé
                        listensock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        IPHostEntry hostadr = Dns.GetHostEntry(Dns.GetHostName());
                        endpt = new IPEndPoint(hostadr.AddressList[0], port);
                        //Bind à un port , écoute sur ce port et démarre le thread asynchrone
                        listensock.Bind(endpt);
                        listensock.Listen(1);
                        //debut asynchrone - démarrage du thread d'accept | attente de la connection
                        listensock.BeginAccept(new AsyncCallback(connexionAcceptCallback), listensock);
                        return port;
                 }
                catch (Exception se)
                {
                    MessageBox.Show("Start method error message : "+ se.Message);
                    return 0;
                }
            }
    
     void connexionAcceptCallback(IAsyncResult asyncResult)
            {
                try
                {
                    activesock = listensock.EndAccept(asyncResult);
                    activesock.BeginReceive(buff, 0, buff.Length, SocketFlags.None, receiveCallback, activesock);
                }
                
                catch (Exception se)
                {
                    MessageBox.Show(se.Message);
                }
           }
    
    ...
    
    
     public void Send(string s)
            {
                try
                {
                    buff = ASCIIEncoding.ASCII.GetBytes(s);
                    activesock.BeginSend(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(this.sendCallback), activesock);
                }
                catch (Exception se)
                {
                    MessageBox.Show(se.Message);
                }
    
            }
    
    
       private void sendCallback(IAsyncResult asyncResult)
            {
                int send = activesock.EndSend(asyncResult);
                
            }
    ..

    Voila je desespere de trouver ou ca coince

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    quelle est la définition de receiveCallback ? quel est l'objet qui n'est pas instancié ?


  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci pour la réponse

    Voila pour receiveCallback (mais il ne rentre meme pas dans cette fonction )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      void receiveCallback(IAsyncResult asyncResult)
            {
     
                int read = activesock.EndReceive(asyncResult);
                MessageBox.Show("Données reçues");
     
            }
    et l'objet qui n'est pas instancé je crois que c'est activesock , pourtant j'ai testé avec un MessageBox.Show("Activesock" + activesock.Connected.ToString()); et il me dit True

    jcomprends plus

  4. #4
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Du code que je peux voir, il semble que l'objet activesock ne soit pas instancié. (activesock = new Socket(...); )

    Si tu l'instancie, il faut aussi le connecter et ca devrait être bon..!


  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai testé en rajoutant dans le constructeur de ma classe C_Mysocket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    activesock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    et pourtant j'ai tjrs la meme erreur...

    ce que je ne comprends pas , c est qu avec le BeginSend ca fonctionne

    je désespère la

  6. #6
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    En instanciant activesock, j'ai une autre erreur pour ma part.

    je n'ai plus l'erreur "null exception" mais une erreur de liaison car activesock n'est pas connecté.

    tu as vraiment la même erreur qu'au début ?

  7. #7
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Dans un de mes programmes, la methode asynchrones fonctionne bien :
    je te donne l'exemple si ca peut t'aider...
    private void ConnectionAcceptCallback (IAsyncResult asyncResult)
    {

    Socket m_socket = m_socketServer.EndAccept(asyncResult);
    WaitCommand(m_socket, m_clientCount);
    m_socketServer.BeginAccept(new AsyncCallback(ConnectionAcceptCallback),null);

    }

    public void WaitCommand(Socket sock, int clientNumber)
    {

    if ( m_callBack == null )
    {

    m_callBack = new AsyncCallback (OnDataReceived);
    }
    SocketPacket theSocPkt = new SocketPacket (sock, clientNumber);

    sock.BeginReceive (theSocPkt.DataBuffer, 0,
    theSocPkt.DataBuffer.Length,
    SocketFlags.None,
    m_callBack,
    theSocPkt);
    }
    }

    Bon courage

    @++

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai trouvé mon erreur...par un pur coup de chance...

    c etait mon objet buff qui etait non alloué :/

    Rha tout ca pour ca !


    En tout cas merci beaucoup pour les réponses et l'exemple

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai une autre petite question , je profite du topic que j ai ouvert pour la poser a la suite ^^

    J'ai créé donc une classe C_MySocket qui écoute en asynchrone les messages reçus par un client et j'aimerais les afficher dans 1 textbox de la fenetre principale de mon application.

    J'avais bien pensé a un return , mais comme elle tourne en boucle je ne pense pas que ce soit faisable ?

    Merci d avance ^^

Discussions similaires

  1. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  2. Probleme de création de socket
    Par Pragmateek dans le forum C++
    Réponses: 5
    Dernier message: 10/03/2006, 22h47
  3. connexion socket asynchrone
    Par jagboys dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2005, 17h04
  4. [VB.NET] Probleme pour réutiliser une sockets ??
    Par fdiedler dans le forum Windows Forms
    Réponses: 12
    Dernier message: 10/03/2005, 14h37
  5. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10

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