20250623 커밋
This commit is contained in:
583
Sub/WinsockOracs/Backup/Winsock.vb
Normal file
583
Sub/WinsockOracs/Backup/Winsock.vb
Normal file
@@ -0,0 +1,583 @@
|
||||
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
|
||||
Reference in New Issue
Block a user