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

VB.NET Discussion :

Problème avec les Sockets


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut Problème avec les Sockets
    Bonjour à tous,

    Je suis confronté a un problème que je n'arrive malheureusement pas à résoudre.

    Alors voilà, j'ai une class "Serveur", et une classe "Client" contenant des sockets avec lesquels j'envoi et reçoi des message. Mon problème est le suivant : Lors de l'envoi d'un message du client vers le serveur, le premier envoi s'effectue correctement (Par exemple, j'envoi BONJOUR, le serveur reçois bien BONJOUR). La ou ça coince, c'est si dans un second temps, j'envoi APPHELLO, le serveur reçois : HELLOUR !

    Voici les class en question :

    Le serveur :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Namespace Server
        Public Class ServerClass
            Private SocketServer As Socket
            Private SocketClient As Socket
            Private LocalsocketClientIsShutingDown As Boolean = False
            Private readbuf As Byte()
            Private sendbuf As Byte()
            Public infos As ClassInfos
            Public ipAddr As IPAddress
            Private Delegate Sub DelegateDisplay(ByVal message As String)
            Private dlgDisplay As DelegateDisplay = New DelegateDisplay(AddressOf DisplayMessage)
     
            Public Sub New(ByVal _eventLog As EventLogEntry)
                infos = New ClassInfos
                Me.infos.m_eventLog = _eventLog
                Me.readbuf = New Byte(100) {}
            End Sub
            Public Sub RunServer()
                Me.SocketServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                Me.SocketServer.Bind(New IPEndPoint(ipAddr, 48888))
                Me.SocketServer.Listen(100)
                Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
                DisplayMessage("Serveur lancé")
            End Sub
            Private Sub ConnectionAcceptCallback(ByVal asyncResult As IAsyncResult)
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    If Not (socket.Handle.ToInt32 = -1) Then
                        Me.SocketClient = socket.EndAccept(asyncResult)
                        Me.LocalsocketClientIsShutingDown = False
                        DisplayMessage("Un client s'est connecté")
                        Me.readbuf = New Byte(100) {}
                        Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
                    End If
                Catch ex As SocketException
                    DisplayError(ex.Message)
                End Try
            End Sub
            Public Sub ReceiveMessage()
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    Me.readbuf = New Byte(100) {}
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
                Else
                    DisplayMessage("Client non connecté")
                End If
            End Sub
            Private Sub ReceiveMessageCallback(ByVal asyncResult As IAsyncResult)
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    Dim read As Integer = socket.EndReceive(asyncResult)
                    If read > 0 Then
                        DisplayMessage("Client dit : " + Encoding.UTF8.GetString(Me.readbuf))
                        '----------------------------------------------------------------------------------------------
                        Dim request As String = Encoding.UTF8.GetString(Me.readbuf)
                        request = request.Replace(vbNullChar, "")
                        '------------------------------------------------------------------------------------------------
                        buffer.SetByte(Me.readbuf, 0, 0)
                        '----------
                        Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
                    End If
                    If read = 0 AndAlso Not Me.LocalsocketClientIsShutingDown Then
                        socket.Close()
                        DisplayMessage("Socket distante fermée.")
     
                        Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
                    End If
                Catch ex As SocketException
                    DisplayError(ex.Message)
                End Try
            End Sub
            Public Sub Send(ByVal message As String)
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    Me.sendbuf = Encoding.ASCII.GetBytes(message)
                    Me.SocketClient.BeginSend(Me.sendbuf, 0, Me.sendbuf.Length, SocketFlags.None, AddressOf SendCallback, Me.SocketClient)
                Else
                    DisplayMessage("Client non connecté")
                End If
            End Sub
            Private Sub SendCallback(ByVal asyncResult As IAsyncResult)
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    Dim send As Integer = socket.EndSend(asyncResult)
                    DisplayMessage("Message envoyé (" + send.ToString() + " octets)")
                Catch ex As SocketException
                    DisplayError(ex.Message)
                End Try
            End Sub
            Public Sub CloseClient()
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    Me.LocalsocketClientIsShutingDown = True
                    Me.SocketClient.Shutdown(SocketShutdown.Both)
                    Me.SocketClient.Close()
                    Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
                End If
                DisplayMessage("Client arrêté")
            End Sub
            Public Sub CloseServer()
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    CloseClient()
                End If
                If Not (Me.SocketServer Is Nothing) AndAlso Not (Me.SocketServer.Handle.ToInt32 = -1) Then
                    Me.SocketServer.Close()
                End If
                DisplayMessage("Serveur arrêté")
            End Sub
            Private Sub DisplayMessage(ByVal message As String)
                infos.MyLog.WriteEntry(message, EventLogEntryType.Information)
            End Sub
            Private Sub DisplayError(ByVal message As String)
                infos.MyLog.WriteEntry(message, EventLogEntryType.Error)
            End Sub
        End Class
    End Namespace
    Client :
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Namespace Client
        Public Class ClientClass
            Private SocketClient As Socket
            Private LocalsocketClientIsShutingDown As Boolean
            Private readbuf As Byte()
            Private sendbuf As Byte()
            Private listview As ListView
            Private Delegate Sub DelegateDisplay(ByVal message As String)
            Private dlgDisplay As DelegateDisplay = New DelegateDisplay(AddressOf DisplayMessage)
            Private currentProcess As Process
            Public Sub New(ByVal list As System.Windows.Forms.ListView)
                listview = list
                readbuf = New Byte(100) {}
                currentProcess = Process.GetCurrentProcess
            End Sub
            Public Sub ConnectToServer(ByVal ServerName As String)
                If Me.SocketClient Is Nothing OrElse Not Me.SocketClient.Connected Then
                    Me.SocketClient = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
     
                    Me.SocketClient.BeginConnect(New IPEndPoint(IPAddress.Parse("192.168.60.2"), 48888), AddressOf ConnectCallback, Me.SocketClient)
                Else
                    Dim obj As String() = New String() {"Déjà connecté au serveur"}
                    listview.Invoke(dlgDisplay, obj)
                End If
            End Sub
            Private Sub ConnectCallback(ByVal asyncResult As IAsyncResult)
                Dim obj As String()
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    Me.SocketClient = socket
                    socket.EndConnect(asyncResult)
                    obj = New String() {"Connecté au serveur"}
                    'frmMain.func.WriteLog(4, obj(0))
                    'listview.Invoke(dlgDisplay, obj)
                    Me.LocalsocketClientIsShutingDown = False
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                Catch ex As SocketException
                    obj = New String() {ex.Message}
                    listview.Invoke(dlgDisplay, obj)
                End Try
            End Sub
            Public Sub SendMessage(ByVal message As String)
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    Me.sendbuf = New Byte(100) {}
                    Me.sendbuf = Encoding.UTF8.GetBytes(message)
                    Me.SocketClient.BeginSend(Me.sendbuf, 0, Me.sendbuf.Length, SocketFlags.None, AddressOf SendCallback, Me.SocketClient)
                Else
                    DisplayMessage("Non connecté au serveur.")
                End If
            End Sub
            Private Sub SendCallback(ByVal asyncResult As IAsyncResult)
                Dim obj As String()
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    Dim send As Integer = socket.EndSend(asyncResult)
                    obj = New String() {"Message envoyé (" + send.ToString() + " bytes envoyés )"}
                    'listview.Invoke(dlgDisplay, obj)
                Catch ex As SocketException
                    obj = New String() {ex.Message}
                    listview.Invoke(dlgDisplay, obj)
                End Try
            End Sub
            Public Sub ReceiveMessage()
                If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                Else
                    DisplayMessage("Non connecté au serveur.")
                End If
            End Sub
            Private Sub ReceiveCallback(ByVal asyncResult As IAsyncResult)
                Dim obj As String()
                Try
                    Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                    Dim read As Integer = socket.EndReceive(asyncResult)
                    If read > 0 Then
                        obj = New String() {" Réponse : " + Encoding.UTF8.GetString(Me.readbuf)}
                        listview.Invoke(dlgDisplay, obj)
                        Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                    End If
                    If read = 0 AndAlso Not Me.LocalsocketClientIsShutingDown Then
                        Me.SocketClient.Close()
                        obj = New String() {"Fermeture socket distante"}
                        listview.Invoke(dlgDisplay, obj)
                    End If
                    Buffer.SetByte(Me.readbuf, 0, 0)
                Catch ex As SocketException
                    obj = New String() {ex.Message}
                    listview.Invoke(dlgDisplay, obj)
                End Try
            End Sub
     
     
    End Class
    End Namespace

  2. #2
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Bon et bien j'ai trouvé mon problème ! Il fallait rajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    readbuf = New Byte(100) {}
    Avant le BeginReceive

  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    bon, j'ai encore une erreur, lorsque que quitte le client, j'ai l'erreur suivante :

    Impossible d'accéder à un objet supprimé.
    Nom de l'objet : 'System.Net.Sockets.Socket'.

    à System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult, SocketError& errorCode)
    à System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
    à ArkMail.Client.ClientClass.ReceiveCallback(IAsyncResult asyncResult) dans C:\Documents and Settings\saarkadmin\Mes documents\Visual Studio 2010\Projects\ArkView\ArkView\ClientClass.vb:ligne 93
    à System.Net.LazyAsyncResult.Complete(IntPtr userToken)
    à System.Net.ContextAwareResult.CompleteCallback(Object state)
    à System.Threading.ExecutionContext.runTryCode(Object userData)
    à System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
    à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Net.ContextAwareResult.Complete(IntPtr userToken)
    à System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
    à System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
    à System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
    Si quelqu'un a une idée svp...

    Merci !

  4. #4
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Il faudrait pas faire un socket.Close() quelque part ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Euh en fait, c'est ça qui cause l'erreur...
    Si je retire la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If func.isConnectedToServer = True Then
     func.client.Close()
    End If
    
    je n'ai plus d'erreur... Bizarre...

  6. #6
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Tu le fait où ça ? Dans le client ou le serveur ?

    Parce que si tu le fais côté serveur après que ton client ait été supprimé, c'est normal.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Malheureusement non, c'est du côté client quand le Form se ferme...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Try
                If func.isConnectedToServer = True Then
                    func.client.Close()
                End If
    ....
    ....

  8. #8
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Fais voir le code d'appel du client...parce là apparemment, tu le supprime avant d'arriver sur ton "FormClosing".

  9. #9
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Alors moi je m'y prends comme ceci :

    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
    Public Class frmMain
        'Fonctions
        Public func As New Functions
        Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
     
                func.client = New ClientClass(lvLogs)
     
             func.client.ConnectToServer(ip)
             func.isConnectedToServer = True
            
    Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical, "Erreur lors du chargement")
            End Try
        End Sub
    .....
    .....
    End Class
    Public Class Functions
        'Socket Client
        Public client As ClientClass
        'Stock l'état de connexion
        Public isConnectedToServer As Boolean = False
    .....
    .....
    End Class
    Merci !

  10. #10
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Par contre, maintenant dès que je quitte l'application, j'ai l'erreur suivante sur le serveur :

    Une connexion existante a dû être fermée par l'hôte distant
    Une idée ? Merci !

Discussions similaires

  1. un serieux problème avec les sockets
    Par dc.sara dans le forum Réseau
    Réponses: 4
    Dernier message: 23/01/2008, 16h11
  2. problèmes avec les sockets
    Par lukbutor dans le forum Réseau
    Réponses: 24
    Dernier message: 23/04/2007, 01h12
  3. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  4. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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