Hallo,
kann mir das jemand so optimieren, dass ich keine 99% Auslastung habe? Und wenn es möglich ist ohne Erklärungen, einfach überarbeitet und dann danke ich euch 1000x.
Also hier ist der Source für die Konsolenanwendung - Port 1009 mit Telnet draufgehen oder so:
Imports System.Net.Sockets, System.Net, System.Text
Module modMain
Dim mySockets As Hashtable
Dim mySock(1000) As clsSocket
Public Sub Main()
Dim myListen As New TcpListener(IPAddress.Any, 1009)
Dim myID As Int32 = 0
myListen.Start()
While True
If myListen.Pending Then
myID = FindSocket()
mySock(myID) = New clsSocket(myListen.AcceptSocket)
mySock(myID).myID = myID
AddHandler mySock(myID).OnReceiveComplete, AddressOf _
OnReceiveComplete
AddHandler mySock(myID).OnClose, AddressOf OnClose
Console.WriteLine(myID & ": CONNECTED")
End If
End While
Console.Read()
End Sub
Private Sub OnClose(ByVal mySocket As clsSocket)
Console.WriteLine(mySocket.myID & ": --- CLOSED CONNECTION")
End Sub
Private Sub OnReceiveComplete(ByVal mReceiveLength As Int32, ByVal myBuffer( _
) As Byte, ByVal mySocket As clsSocket)
If myBuffer Is Nothing Then Exit Sub
Console.WriteLine(mySocket.myID & ": " & Encoding.ASCII.GetString( _
myBuffer))
End Sub
Private Function FindSocket() As Int32
For I As Int32 = 0 To mySock.GetUpperBound(0)
If mySock(I) Is Nothing Then Return I
If Not mySock(I).Used Then Return I
Next
End Function
End Module
Public Class clsSocket
#Region "Events"
Public Event OnReceiveBegin()
Public Event OnReceiveComplete(ByVal mReceiveLength As Int32, ByVal _
myBuffer() As Byte, ByVal sender As clsSocket)
Public Event OnSendBegin(ByVal mSendLength As Int32)
Public Event OnSendComplete(ByVal mSentLength As Int32, ByVal sender As _
Socket)
Public Event OnClose(ByVal mySocket As clsSocket)
#End Region
#Region "Objekte"
Public myID As Int32
Public mySock As Socket
Public myBytes() As [Byte]
Dim WithEvents myTimer As New Timers.Timer(250)
Dim mTotalSend As Int32
Dim myThread As New Threading.AutoResetEvent(False)
#End Region
'Instanzierung
Public Sub New(ByVal mySocket As Socket)
myTimer.Start()
mySock = mySocket
End Sub
'In gebrauch?
Public Function Used() As Boolean
If mySock.Connected Then Return True
End Function
'Senden
Public Sub Send(ByVal myBytes() As Byte)
mTotalSend = myBytes.Length
RaiseEvent OnSendBegin(myBytes.Length)
mySock.BeginSend(myBytes, 0, myBytes.Length, SocketFlags.Partial, New _
AsyncCallback(AddressOf _Send), mySock)
End Sub
'Sende ENDE
Private Sub _Send(ByVal ar As IAsyncResult)
Dim mResult As Int32 = mySock.EndSend(ar)
If mResult = mTotalSend Then
RaiseEvent OnSendComplete(mResult, mySock)
mTotalSend = 0
End If
End Sub
'Empfangen
Public Sub Receive()
myThread.Set()
If mySock.Available = 0 Then Exit Sub
RaiseEvent OnReceiveBegin()
ReDim myBytes(mySock.Available - 1)
mySock.BeginReceive(myBytes, 0, mySock.Available, SocketFlags.Partial, _
New AsyncCallback(AddressOf _Receive), mySock)
End Sub
'Empfangen ENDE
Public Sub _Receive(ByVal ar As IAsyncResult)
Dim mResult As Int32 = mySock.EndReceive(ar)
RaiseEvent OnReceiveComplete(mResult, myBytes, Me)
Erase myBytes
myThread.WaitOne()
Receive()
End Sub
Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As _
System.Timers.ElapsedEventArgs) Handles myTimer.Elapsed
If mySock.Connected = False Then
RaiseEvent OnClose(Me)
Exit Sub
End If
If mySock.Available > 0 Then
Receive()
End If
End Sub
End Class MfG.
Fabian Stern
-
info@smart-coding.com
http://www.smart-coding.com |