Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TrashAmbishion en 23 Septiembre 2016, 20:17 pm



Título: Socket - Desconectando correctamente !!
Publicado por: TrashAmbishion en 23 Septiembre 2016, 20:17 pm
Código
  1. Public Class Form1
  2.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.  
  4.    End Sub
  5.  
  6.    Dim clientSocket As Socket
  7.    Dim byteData(1023) As Byte
  8.  
  9.    Private Sub OnConnect(ByVal ar As IAsyncResult)
  10.        clientSocket.EndConnect(ar)
  11.        clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), clientSocket)
  12.    End Sub
  13.  
  14.    Private Sub OnDisconnect(ByVal ar As IAsyncResult)
  15.        Dim client As Socket = ar.AsyncState
  16.        client.EndDisconnect(ar)
  17.  
  18.        clientSocket.Close()
  19.        clientSocket = Nothing
  20.    End Sub
  21.  
  22.    Private Sub OnRecieve(ByVal ar As IAsyncResult)
  23.  
  24.        Dim client As Socket = ar.AsyncState
  25.        client.EndReceive(ar)
  26.        Dim bytesRec As Byte() = byteData
  27.        Dim message As String = System.Text.Encoding.ASCII.GetString(bytesRec)
  28.        Read(message)
  29.        clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), clientSocket)
  30.  
  31.    End Sub
  32.  
  33.    Delegate Sub _Read(ByVal msg As String)
  34.    Private Sub Read(ByVal msg As String)
  35.        If InvokeRequired Then
  36.            Invoke(New _Read(AddressOf Read), msg)
  37.            Exit Sub
  38.        End If
  39.        RichTextBox1.Text &= msg
  40.    End Sub
  41.  
  42.  
  43.    Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
  44.        clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
  45.        Dim ipAddress As IPAddress = IPAddress.Parse("127.0.0.1")
  46.        Dim ipEndPoint As IPEndPoint = New IPEndPoint(ipAddress, 8800)
  47.        clientSocket.BeginConnect(ipEndPoint, New AsyncCallback(AddressOf OnConnect), Nothing)
  48.    End Sub
  49.  
  50.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  51.        clientSocket.BeginDisconnect(False, New AsyncCallback(AddressOf OnDisconnect), clientSocket)
  52.    End Sub
  53. End Class

Cada vez que doy en el Boton desconectar me salta una exepcion en OnReceive de que el objeto esta Dispose, alguien me puede explicar porque es que se dispara ese evento.

Lo otro es que en el lado del servidor no se entera de que el socket fue cerrado, para que el se percatara de esto tendria que hacer una especie de thread cada cierto tiempo verificando si el socket esta vivo ??

Como explican aqui

http://stackoverflow.com/questions/722240/instantly-detect-client-disconnection-from-server-socket

Salu2

Lo que busco es detectar cuando un cliente se conecta y desconecta tanto para el cliente como el servidor.