584 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
			
		
		
	
	
			584 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
| Option Strict On
 | |
| 
 | |
| Imports System.ComponentModel
 | |
| Imports System.ComponentModel.Design
 | |
| Imports System.Drawing
 | |
| Imports System.Net
 | |
| 
 | |
| <ToolboxBitmap(GetType(Winsock), "Winsock.png")> _
 | |
| <DefaultEvent("ErrorReceived")> _
 | |
| <DesignerAttribute(GetType(WinsockDesigner), GetType(IDesigner))> _
 | |
| Public Class Winsock
 | |
|     Inherits Component
 | |
|     Implements IWinsock
 | |
| 
 | |
|     Public Sub New()
 | |
|         _localPort = 8080
 | |
|         _remotePort = 8080
 | |
|         _remoteHost = "localhost"
 | |
|         _maxPendingConnections = 1
 | |
|         _legacySupport = False
 | |
|         _protocol = WinsockProtocol.Tcp
 | |
|         _wsState = WinsockStates.Closed
 | |
|         _asSock = New AsyncSocket(Me)
 | |
|     End Sub
 | |
| 
 | |
| #Region " Events "
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Triggers an event declared at module level within a class, form, or document in a thread-safe manner.
 | |
|     ''' </summary>
 | |
|     ''' <param name="ev">The event to be raised.</param>
 | |
|     ''' <param name="args">The arguements for the event.</param>
 | |
|     Private Sub RaiseEventSafe(ByVal ev As System.Delegate, ByRef args() As Object)
 | |
|         Dim bFired As Boolean
 | |
|         If ev IsNot Nothing Then
 | |
|             For Each singleCast As System.Delegate In ev.GetInvocationList()
 | |
|                 bFired = False
 | |
|                 Try
 | |
|                     Dim syncInvoke As ISynchronizeInvoke = CType(singleCast.Target, ISynchronizeInvoke)
 | |
|                     If syncInvoke IsNot Nothing AndAlso syncInvoke.InvokeRequired Then
 | |
|                         bFired = True
 | |
|                         syncInvoke.BeginInvoke(singleCast, args)
 | |
|                     Else
 | |
|                         bFired = True
 | |
|                         singleCast.DynamicInvoke(args)
 | |
|                     End If
 | |
|                 Catch ex As Exception
 | |
|                     If Not bFired Then singleCast.DynamicInvoke(args)
 | |
|                 End Try
 | |
|             Next
 | |
|         End If
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Occurs when connection is achieved (client and server).
 | |
|     ''' </summary>
 | |
|     Public Event Connected(ByVal sender As Object, ByVal e As WinsockConnectedEventArgs) Implements IWinsock.Connected
 | |
|     ''' <summary>
 | |
|     ''' Occurs on the server when a client is attempting to connect.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Client registers connected at this point. Server must Accept in order for it to be connected.</remarks>
 | |
|     Public Event ConnectionRequest(ByVal sender As Object, ByVal e As WinsockConnectionRequestEventArgs) Implements IWinsock.ConnectionRequest
 | |
|     ''' <summary>
 | |
|     ''' Occurs when data arrives on the socket.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Raised only after all parts of the data have been collected.</remarks>
 | |
|     Public Event DataArrival(ByVal sender As Object, ByVal e As WinsockDataArrivalEventArgs) Implements IWinsock.DataArrival
 | |
|     ''' <summary>
 | |
|     ''' Occurs when disconnected from the remote computer (client and server).
 | |
|     ''' </summary>
 | |
|     Public Event Disconnected(ByVal sender As Object, ByVal e As System.EventArgs) Implements IWinsock.Disconnected
 | |
|     ''' <summary>
 | |
|     ''' Occurs when an error is detected in the socket.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>May also be raised on disconnected (depending on disconnect circumstance).</remarks>
 | |
|     Public Event ErrorReceived(ByVal sender As Object, ByVal e As WinsockErrorReceivedEventArgs) Implements IWinsock.ErrorReceived
 | |
|     ''' <summary>
 | |
|     ''' Occurs while the receive buffer is being filled with data.
 | |
|     ''' </summary>
 | |
|     Public Event ReceiveProgress(ByVal sender As Object, ByVal e As WinsockReceiveProgressEventArgs) Implements IWinsock.ReceiveProgress
 | |
|     ''' <summary>
 | |
|     ''' Occurs when sending of data is completed.
 | |
|     ''' </summary>
 | |
|     Public Event SendComplete(ByVal sender As Object, ByVal e As WinsockSendEventArgs) Implements IWinsock.SendComplete
 | |
|     ''' <summary>
 | |
|     ''' Occurs when the send buffer has been sent but not all the data has been sent yet.
 | |
|     ''' </summary>
 | |
|     Public Event SendProgress(ByVal sender As Object, ByVal e As WinsockSendEventArgs) Implements IWinsock.SendProgress
 | |
|     ''' <summary>
 | |
|     ''' Occurs when the state of the socket changes.
 | |
|     ''' </summary>
 | |
|     Public Event StateChanged(ByVal sender As Object, ByVal e As WinsockStateChangedEventArgs) Implements IWinsock.StateChanged
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the Connected event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnConnected(ByVal e As WinsockConnectedEventArgs) Implements IWinsock.OnConnected
 | |
|         RaiseEventSafe(ConnectedEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the ConnectionRequest event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnConnectionRequest(ByVal e As WinsockConnectionRequestEventArgs) Implements IWinsock.OnConnectionRequest
 | |
|         RaiseEventSafe(ConnectionRequestEvent, New Object() {Me, e})
 | |
|         If e.Cancel Then
 | |
|             e.Client.Disconnect(False)
 | |
|             e.Client.Close()
 | |
|         End If
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the DataArrival event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnDataArrival(ByVal e As WinsockDataArrivalEventArgs) Implements IWinsock.OnDataArrival
 | |
|         RaiseEventSafe(DataArrivalEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the Disconnected event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnDisconnected() Implements IWinsock.OnDisconnected
 | |
|         RaiseEventSafe(DisconnectedEvent, New Object() {Me, New System.EventArgs})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the ErrorReceived event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnErrorReceived(ByVal e As WinsockErrorReceivedEventArgs) Implements IWinsock.OnErrorReceived
 | |
|         RaiseEventSafe(ErrorReceivedEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the ReceiveProgress event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnReceiveProgress(ByVal e As WinsockReceiveProgressEventArgs) Implements IWinsock.OnReceiveProgress
 | |
|         RaiseEventSafe(ReceiveProgressEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the SendComplete event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnSendComplete(ByVal e As WinsockSendEventArgs) Implements IWinsock.OnSendComplete
 | |
|         RaiseEventSafe(SendCompleteEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the SendProgress event.
 | |
|     ''' </summary>
 | |
|     Public Sub OnSendProgress(ByVal e As WinsockSendEventArgs) Implements IWinsock.OnSendProgress
 | |
|         RaiseEventSafe(SendProgressEvent, New Object() {Me, e})
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Raises the StateChanged event.
 | |
|     ''' </summary>
 | |
|     Private Sub OnStateChanged(ByVal e As WinsockStateChangedEventArgs) 'Implements IWinsock.OnStateChanged
 | |
|         If _wsState <> e.New_State Then
 | |
|             _wsState = e.New_State
 | |
|             RaiseEventSafe(StateChangedEvent, New Object() {Me, e})
 | |
|         End If
 | |
|     End Sub
 | |
| 
 | |
| #End Region
 | |
| 
 | |
| #Region " Private Members "
 | |
| 
 | |
|     Private _asSock As AsyncSocket
 | |
|     Private _wsState As WinsockStates
 | |
|     Private _localPort As Integer
 | |
|     Private _maxPendingConnections As Integer
 | |
|     Private _remoteHost As String
 | |
|     Private _remotePort As Integer
 | |
|     Private _legacySupport As Boolean
 | |
|     Private _protocol As WinsockProtocol
 | |
| 
 | |
| #End Region
 | |
| 
 | |
| #Region " Helper Methods "
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Encapsulates the OnStateChanged methods so the AsyncSocket
 | |
|     ''' doesn't have to build the EventArgs parameter all the time.
 | |
|     ''' </summary>
 | |
|     ''' <param name="new_state">The new state of the Winsock.</param>
 | |
|     Protected Friend Sub ChangeState(ByVal new_state As WinsockStates) Implements IWinsock.ChangeState
 | |
|         OnStateChanged(New WinsockStateChangedEventArgs(_wsState, new_state))
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' When the port is set dynamically by using port 0, the socket can now update the property of the component.
 | |
|     ''' </summary>
 | |
|     ''' <param name="new_port">The port we are now listening on.</param>
 | |
|     Protected Friend Sub ChangeLocalPort(ByVal new_port As Integer) Implements IWinsock.ChangeLocalPort
 | |
|         _localPort = new_port
 | |
|     End Sub
 | |
| 
 | |
| #End Region
 | |
| 
 | |
| #Region " Public Properties "
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value indicating the interal size of the byte buffers.
 | |
|     ''' </summary>
 | |
|     Public Property BufferSize() As Integer
 | |
|         Get
 | |
|             Return _asSock.BufferSize
 | |
|         End Get
 | |
|         Set(ByVal value As Integer)
 | |
|             _asSock.BufferSize = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets a value indicating whether the buffer has data for retrieval.
 | |
|     ''' </summary>
 | |
|     <Browsable(False)> _
 | |
|     Public ReadOnly Property HasData() As Boolean
 | |
|         Get
 | |
|             Return _asSock.BufferCount > 0
 | |
|         End Get
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value indicating if Legacy support should be used or not.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Legacy support is to support older winsock style connections.</remarks>
 | |
|     Public Property LegacySupport() As Boolean Implements IWinsock.LegacySupport
 | |
|         Get
 | |
|             Return _legacySupport
 | |
|         End Get
 | |
|         Set(ByVal value As Boolean)
 | |
|             If Not value AndAlso Protocol = WinsockProtocol.Udp Then
 | |
|                 Throw New Exception("LegacySupport is required for UDP connections.")
 | |
|             End If
 | |
|             _legacySupport = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the local machine's IP address(es).
 | |
|     ''' </summary>
 | |
|     <Browsable(False)> _
 | |
|     Public ReadOnly Property LocalIP() As String()
 | |
|         Get
 | |
|             Dim h As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName)
 | |
|             Dim s(h.AddressList.Length - 1) As String
 | |
|             For i As Integer = 0 To h.AddressList.Length - 1
 | |
|                 s(i) = CType(h.AddressList.GetValue(i), Net.IPAddress).ToString
 | |
|             Next
 | |
|             Return s
 | |
|         End Get
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value indicating the port the <see cref="Winsock" /> control should listen on.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Cannot change while listening, connected, or connecting - but can change while closing.</remarks>
 | |
|     Public Property LocalPort() As Integer
 | |
|         Get
 | |
|             Return _localPort
 | |
|         End Get
 | |
|         Set(ByVal value As Integer)
 | |
|             Select Case State
 | |
|                 Case WinsockStates.Listening
 | |
|                     Throw New Exception("Cannot change the local port while already listening on a port.")
 | |
|                 Case WinsockStates.Connected
 | |
|                     Throw New Exception("Cannot change the local port of a connection that is already active.")
 | |
|                 Case Else
 | |
|                     If State <> WinsockStates.Closed AndAlso State <> WinsockStates.Closing Then
 | |
|                         Throw New Exception("Cannot change the local port while the component is processing, it may have adverse effects on the connection process.")
 | |
|                     End If
 | |
|             End Select
 | |
|             _localPort = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value that control the length of the maximum length of the pending connections queue.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Cannot change while listening.</remarks>
 | |
|     Public Property MaxPendingConnections() As Integer
 | |
|         Get
 | |
|             Return _maxPendingConnections
 | |
|         End Get
 | |
|         Set(ByVal value As Integer)
 | |
|             Select Case State
 | |
|                 Case WinsockStates.Listening
 | |
|                     Throw New Exception("Cannot change the pending connections value while already listening.")
 | |
|             End Select
 | |
|             _maxPendingConnections = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets a NetworkStream that this Winsock object is based on.
 | |
|     ''' </summary>
 | |
|     <Browsable(False)> _
 | |
|     Public ReadOnly Property NetworkStream() As System.Net.Sockets.NetworkStream
 | |
|         Get
 | |
|             Return _asSock.UnderlyingStream
 | |
|         End Get
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets the winsock protocol to use when communicating with the remote computer.
 | |
|     ''' </summary>
 | |
|     <RefreshProperties(RefreshProperties.All)> _
 | |
|        Public Property Protocol() As WinsockProtocol Implements IWinsock.Protocol
 | |
|         Get
 | |
|             Return _protocol
 | |
|         End Get
 | |
|         Set(ByVal value As WinsockProtocol)
 | |
|             If State <> WinsockStates.Closed Then
 | |
|                 Throw New Exception("Cannot change the protocol while listening or connected to a remote computer.")
 | |
|             End If
 | |
|             _protocol = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value that determines what remote computer to connect to, or is currently connected to.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Can only change if closed or listening.</remarks>
 | |
|     Public Property RemoteHost() As String Implements IWinsock.RemoteHost
 | |
|         Get
 | |
|             Return _remoteHost
 | |
|         End Get
 | |
|         Set(ByVal value As String)
 | |
|             If State <> WinsockStates.Closed AndAlso State <> WinsockStates.Listening Then
 | |
|                 Throw New Exception("Cannot change the remote host while already connected to a remote computer.")
 | |
|             End If
 | |
|             _remoteHost = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value that determines which port on the remote computer to connect on, or is currently connected on.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Can only change if closed or listening.</remarks>
 | |
|     Public Property RemotePort() As Integer Implements IWinsock.RemotePort
 | |
|         Get
 | |
|             Return _remotePort
 | |
|         End Get
 | |
|         Set(ByVal value As Integer)
 | |
|             If State <> WinsockStates.Closed AndAlso State <> WinsockStates.Listening Then
 | |
|                 Throw New Exception("Cannot change the remote port while already connected to a remote computer.")
 | |
|             End If
 | |
|             _remotePort = value
 | |
|         End Set
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the state of the <see cref="Winsock">Winsock</see> control.
 | |
|     ''' </summary>
 | |
|     <Browsable(False)> _
 | |
|     Public ReadOnly Property State() As WinsockStates Implements IWinsock.State
 | |
|         Get
 | |
|             Return _wsState
 | |
|         End Get
 | |
|     End Property
 | |
| 
 | |
| #End Region
 | |
| 
 | |
| #Region " Public Methods "
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Places a <see cref="Winsock">Winsock</see> in a listening state.
 | |
|     ''' </summary>
 | |
|     Public Sub Listen()
 | |
|         _asSock.Listen(LocalPort, MaxPendingConnections)
 | |
|     End Sub
 | |
|     ''' <summary>
 | |
|     ''' Places a <see cref="Winsock">Winsock</see> in a listening state.
 | |
|     ''' </summary>
 | |
|     ''' <param name="port">The port <see cref="Winsock">Winsock</see> should listen on.</param>
 | |
|     Public Sub Listen(ByVal port As Integer)
 | |
|         If port < 0 Then
 | |
|             Throw New ArgumentException("Port cannot be less than zero.", "port")
 | |
|         End If
 | |
|         LocalPort = port
 | |
|         Listen()
 | |
|     End Sub
 | |
|     ''' <summary>
 | |
|     ''' Places a <see cref="Winsock">Winsock</see> in a listening state.
 | |
|     ''' </summary>
 | |
|     ''' <param name="ip">The IP address the <see cref="Winsock">Winsock</see> should listen on.  This must be an ip address.</param>
 | |
|     Public Sub Listen(ByVal ip As String)
 | |
|         If ip Is Nothing Then
 | |
|             Listen()
 | |
|         Else
 | |
|             Dim ipAddr As IPAddress = Nothing
 | |
|             If Not IPAddress.TryParse(ip, ipAddr) Then
 | |
|                 Throw New ArgumentException("IP address specified is not a valid IP address.", "ip")
 | |
|             End If
 | |
|             _asSock.Listen(LocalPort, MaxPendingConnections, ipAddr)
 | |
|         End If
 | |
|     End Sub
 | |
|     ''' <summary>
 | |
|     ''' Places a <see cref="Winsock">Winsock</see> in a listening state.
 | |
|     ''' </summary>
 | |
|     ''' <param name="ip">The IP address the <see cref="Winsock">Winsock</see> should listen on.</param>
 | |
|     ''' <param name="port">The port <see cref="Winsock">Winsock</see> should listen on.</param>
 | |
|     Public Sub Listen(ByVal ip As String, ByVal port As Integer)
 | |
|         If port < 0 Then
 | |
|             Throw New ArgumentException("Port cannot be less than zero.", "port")
 | |
|         End If
 | |
|         LocalPort = port
 | |
|         If ip Is Nothing Then
 | |
|             Listen()
 | |
|         Else
 | |
|             Dim ipAddr As IPAddress = Nothing
 | |
|             If Not IPAddress.TryParse(ip, ipAddr) Then
 | |
|                 Throw New ArgumentException("IP address specified is not a valid IP address.", "ip")
 | |
|             End If
 | |
|             _asSock.Listen(LocalPort, MaxPendingConnections, ipAddr)
 | |
|         End If
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Accepts a client connect as valid and begins to monitor it for incoming data.
 | |
|     ''' </summary>
 | |
|     ''' <param name="client">A <see cref="System.Net.Sockets.Socket">System.Net.Sockets.Socket</see> that represents the client being accepted.</param>
 | |
|     Public Sub Accept(ByVal client As Sockets.Socket)
 | |
|         If _asSock.Accept(client) Then
 | |
|             _localPort = _asSock.LocalPort
 | |
|             ' also set remote host and port
 | |
|         End If
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Creates an new <see cref="Winsock">Winsock</see> and accepts the client connection on it.
 | |
|     ''' </summary>
 | |
|     ''' <param name="client">A <see cref="System.Net.Sockets.Socket">System.Net.Sockets.Socket</see> that represents the client being accepted.</param>
 | |
|     ''' <remarks>
 | |
|     ''' This was created to be used by the listener, to keep the listener listening while
 | |
|     ''' also accepting a connection.
 | |
|     ''' </remarks>
 | |
|     Public Function AcceptNew(ByVal client As Sockets.Socket) As Winsock
 | |
|         Dim wskReturn As New Winsock()
 | |
|         wskReturn.Protocol = Me.Protocol
 | |
|         wskReturn.LegacySupport = Me.LegacySupport
 | |
|         wskReturn.Accept(client)
 | |
|         Return wskReturn
 | |
|     End Function
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Closes an open <see cref="Winsock">Winsock</see> connection.
 | |
|     ''' </summary>
 | |
|     Public Sub Close()
 | |
|         _asSock.Close()
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Establishes a connection to a remote host.
 | |
|     ''' </summary>
 | |
|     Public Sub Connect()
 | |
|         _asSock.Connect(RemoteHost, RemotePort)
 | |
|     End Sub
 | |
|     ''' <summary>
 | |
|     ''' Establishes a connection to a remote host.
 | |
|     ''' </summary>
 | |
|     ''' <param name="remoteHostOrIP">A <see cref="System.String">System.String</see> containing the Hostname or IP address of the remote host.</param>
 | |
|     ''' <param name="remote_port">A value indicating the port on the remote host to connect to.</param>
 | |
|     Public Sub Connect(ByVal remoteHostOrIP As String, ByVal remote_port As Integer)
 | |
|         RemoteHost = remoteHostOrIP
 | |
|         RemotePort = remote_port
 | |
|         Connect()
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Sends an object to a connected socket on a remote computer.
 | |
|     ''' </summary>
 | |
|     ''' <param name="data">The object to send.</param>
 | |
|     ''' <remarks>
 | |
|     ''' The object is first serialized using a BinaryFormatter - unless
 | |
|     ''' it is already a byte array, in which case it just sends the byte array.
 | |
|     ''' </remarks>
 | |
|     Public Sub Send(ByVal data As Object)
 | |
|         Dim byt() As Byte
 | |
|         If LegacySupport AndAlso data.GetType Is GetType(String) Then
 | |
|             byt = System.Text.Encoding.Default.GetBytes(CStr(data))
 | |
|         Else
 | |
|             byt = ObjectPacker.GetBytes(data)
 | |
|         End If
 | |
|         _asSock.Send(byt)
 | |
|     End Sub
 | |
|     ''' <summary>
 | |
|     ''' Sends a file to a connected socket on a remote computer.
 | |
|     ''' </summary>
 | |
|     ''' <param name="filename">The full path to the file you want to send.</param>
 | |
|     ''' <remarks>
 | |
|     ''' Creates a special file object to send, so the receiving end knows what to do with it.
 | |
|     ''' </remarks>
 | |
|     Public Sub SendFile(ByVal filename As String)
 | |
|         Dim wsf As New WinsockFileData()
 | |
|         Try
 | |
|             If Not wsf.ReadFile(filename) Then
 | |
|                 Throw New Exception("File does not exist, or there was a problem reading the file.")
 | |
|             End If
 | |
|             If LegacySupport Then
 | |
|                 Send(wsf.FileData)
 | |
|             Else
 | |
|                 Send(wsf)
 | |
|             End If
 | |
|         Catch ex As Exception
 | |
|             SharedMethods.RaiseError(Me, ex.Message)
 | |
|         End Try
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the next object from the buffer, removing it from the buffer.
 | |
|     ''' </summary>
 | |
|     ''' <returns>
 | |
|     ''' A Deserialized object or if it can't be deserialized the byte array.
 | |
|     ''' </returns>
 | |
|     Public Function [Get]() As Object
 | |
|         Dim byt() As Byte = _asSock.GetData()
 | |
|         If byt Is Nothing Then Return Nothing
 | |
|         Return ObjectPacker.GetObject(byt)
 | |
|     End Function
 | |
|     ''' <summary>
 | |
|     ''' Gets the next object from the buffer as the supplied type, removing it from the buffer.
 | |
|     ''' </summary>
 | |
|     ''' <typeparam name="dataType">The System.Type you wish to have the data returned as.</typeparam>
 | |
|     ''' <returns>
 | |
|     ''' A Deserialized object converted to the data type you wish.
 | |
|     ''' </returns>
 | |
|     ''' <remarks>
 | |
|     ''' This function was added to make it easier for Option Strict users.
 | |
|     ''' It allows for easier conversion instead of the user using CType, DirectCast, or the like.
 | |
|     ''' Can throw an error if you specify the wrong type.
 | |
|     ''' </remarks>
 | |
|     Public Function [Get](Of dataType)() As dataType
 | |
|         Dim byt() As Byte = _asSock.GetData()
 | |
|         If byt Is Nothing Then Return Nothing
 | |
|         Dim obj As Object
 | |
|         If LegacySupport AndAlso GetType(dataType) Is GetType(String) Then
 | |
|             obj = System.Text.Encoding.Default.GetString(byt)
 | |
|         Else
 | |
|             obj = ObjectPacker.GetObject(byt)
 | |
|         End If
 | |
|         Return DirectCast(obj, dataType)
 | |
|     End Function
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the next object from the buffer, leaving it ing the buffer.
 | |
|     ''' </summary>
 | |
|     ''' <returns>
 | |
|     ''' A Deserialized object or if it can't be deserialized the byte array.
 | |
|     ''' </returns>
 | |
|     Public Function Peek() As Object
 | |
|         Dim byt() As Byte = _asSock.PeekData()
 | |
|         If byt Is Nothing Then Return Nothing
 | |
|         Return ObjectPacker.GetObject(byt)
 | |
|     End Function
 | |
|     ''' <summary>
 | |
|     ''' Gets the next object from the buffer as the supplied type, leaving it in the buffer.
 | |
|     ''' </summary>
 | |
|     ''' <typeparam name="dataType">The System.Type you wish to have the data returned as.</typeparam>
 | |
|     ''' <returns>
 | |
|     ''' A Deserialized object converted to the data type you wish.
 | |
|     ''' </returns>
 | |
|     ''' <remarks>
 | |
|     ''' This function was added to make it easier for Option Strict users.
 | |
|     ''' It allows for easier conversion instead of the user using CType, DirectCast, or the like.
 | |
|     ''' Can throw an error if you specify the wrong type.
 | |
|     ''' </remarks>
 | |
|     Public Function Peek(Of dataType)() As dataType
 | |
|         Dim byt() As Byte = _asSock.PeekData()
 | |
|         If byt Is Nothing Then Return Nothing
 | |
|         Dim obj As Object
 | |
|         If LegacySupport AndAlso GetType(dataType) Is GetType(String) Then
 | |
|             obj = System.Text.Encoding.Default.GetString(byt)
 | |
|         Else
 | |
|             obj = ObjectPacker.GetObject(byt)
 | |
|         End If
 | |
|         Return DirectCast(obj, dataType)
 | |
|     End Function
 | |
| 
 | |
| #End Region
 | |
| 
 | |
| End Class
 | 
