Private Sub ChangeState(ByVal new_state As WinsockStates)
_Status = new_state
End Sub
''' <summary>
''' gibt den Zustand der Socket-Verbindung zurück
''' </summary>
<Browsable(False)> Public ReadOnly Property Status() As WinsockStates
Get
Return _Status
End Get
End Property
''' <summary>
''' Tritt auf, wenn ein Verbindung geschlossen wird.
''' </summary>
Public Sub Close()
If _Protokoll = WinsockProtocol.TCP Then
Try
Select Case Status
Case WinsockStates.Listening
ChangeState(WinsockStates.Closing)
_SocketListTCP.Close()
Case WinsockStates.Connected, WinsockStates.Connecting, _
WinsockStates.ConnectionPending, _
WinsockStates.HostResolved, WinsockStates.Open, _
WinsockStates.ResolvingHost
ChangeState(WinsockStates.Closing)
_ClientServerTCP.Close()
Case WinsockStates.Closed
'do nothing
End Select
ChangeState(WinsockStates.Closed)
Catch ex As Exception
ChangeState(WinsockStates.Error)
CrossThread.RunGui(AddressOf DoHandleError, ex.HResult, _
ex.Message)
End Try
ElseIf _Protokoll = WinsockProtocol.UDP Then
Beep()
End If
End Sub
#End Region
End Class
#Region " WinsockStates "
Public Enum WinsockStates
Closed = 0
Open = 1
Listening = 2
ConnectionPending = 3
ResolvingHost = 4
HostResolved = 5
Connecting = 6
Connected = 7
Closing = 8
[Error] = 9
'Listening = 1
'Connected = 2
End Enum
Public Enum WinsockProtocol
''' <summary>
''' ist eine sicher Verbindung
''' </summary>
TCP = 0
''' <summary>
''' ist ein unsicher Verbindung
''' </summary>
UDP = 1
End Enum
#End Region
Public Class UdpReceiveState
''' <summary>
''' The incoming socket information - allows UDP to determine the sender.
''' </summary>
Public SendingSocket As Object
''' <summary>
''' The EndPoint on which the data was received (server side).
''' </summary>
Public ReceivingEndpoint As EndPoint
End Class
#Region "Um keine Threadübergreifend zu verursachen"
Public Class CrossThread
Public Shared Sub RunAsync(Of T1, T2, T3)(ByVal Action As Action(Of T1, T2, _
T3), ByVal Arg1 As T1, ByVal Arg2 As T2, ByVal Arg3 As T3)
' Aufruf von Action.EndInvoke() gewährleisten, indem er als
' Callback-Argument mitgegeben wird
Action.BeginInvoke(Arg1, Arg2, Arg3, AddressOf Action.EndInvoke, _
Nothing)
End Sub
Public Shared Sub RunAsync(Of T1, T2)(ByVal Action As Action(Of T1, T2), _
ByVal Arg1 As T1, ByVal Arg2 As T2)
Action.BeginInvoke(Arg1, Arg2, AddressOf Action.EndInvoke, Nothing)
End Sub
Public Shared Sub RunAsync(Of T1)(ByVal Action As Action(Of T1), ByVal Arg1 _
As T1)
Action.BeginInvoke(Arg1, AddressOf Action.EndInvoke, Nothing)
End Sub
Public Shared Sub RunAsync(ByVal Action As Action)
Action.BeginInvoke(AddressOf Action.EndInvoke, Nothing)
End Sub
Private Shared Function GuiCrossInvoke(ByVal Action As [Delegate], ByVal _
ParamArray Args() As Object) As Boolean
If Application.OpenForms.Count = 0 Then
' Wenn kein Form mehr da ist, so tun, als ob das Invoking
' ausgeführt wäre
Return True
End If
If Application.OpenForms(0).InvokeRequired Then
Application.OpenForms(0).BeginInvoke(Action, Args)
Return True
End If
Return False
End Function
Public Shared Sub RunGui(Of T1, T2, T3)(ByVal Action As Action(Of T1, T2, _
T3), ByVal Arg1 As T1, ByVal Arg2 As T2, ByVal Arg3 As T3)
' Falls Invoking nicht erforderlich, die Action direkt ausführen
If Not GuiCrossInvoke(Action, Arg1, Arg2, Arg3) Then
Action(Arg1, Arg2, Arg3)
End If
End Sub
Public Shared Sub RunGui(Of T1, T2)(ByVal Action As Action(Of T1, T2), _
ByVal Arg1 As T1, ByVal Arg2 As T2)
If Not GuiCrossInvoke(Action, Arg1, Arg2) Then Action(Arg1, Arg2)
End Sub
Public Shared Sub RunGui(Of T1)(ByVal Action As Action(Of T1), ByVal Arg1 _
As T1)
If Not GuiCrossInvoke(Action, Arg1) Then Action(Arg1)
End Sub
Public Shared Sub RunGui(ByVal Action As Action)
If Not GuiCrossInvoke(Action) Then Action()
End Sub
End Class
#End Region |