TCP/IP Verbindung hängt sich auf Verfasst am: 09.06.2010, 19:51
Datenübertragung funktioniert nur manchmal
Hallo ersteinmal denn ich bin neu hier.
Ich habe ein Tool geschrieben mit dem es möglich sein soll Prozesse von einem anderen Rechner zu sehen und diese gegebenenfalls zu beenden. Die Prozesse sendet die Clientanwendung auf Anfrage an die Serveranwendung. Mein Problem ist, dass wenn ich einen Prozess beende oder mehrmals die Prozessliste neu lade sich die Liste nicht mehr aktualisiert sondern einfach leer bleibt. Da ich den Fehler leider nicht auf einen bestimmten Abschnitt eingrenzen kann muss ich den ganzen Quelltext geben. Ich programmiere noch nicht so lange mit Visual-Basic und würde mich deshalb auch freuen wenn ihr mir eine Rückmeldung geben könntet wie der Quelltext sonst so ist.
Dim startkillProzess As String = "/functionkillProzess"
Dim startTaskmgr As String = "/functionTaskmgr"
Dim EndgetProzess As String = "/endgetprozess"
Dim prozessbuffer As String
Dim readbuffer As String
Dim taskmgrbuffer As String
Dim adresse As String
Dim port As Integer = 4000
Dim stream As NetworkStream
Dim Server As TcpListener
Public client As New TcpClient
Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)
Dim readThread As Threading.Thread
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AktionenToolStripMenuItem.Enabled = False
End Sub
Private Sub ServerStartenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ServerStartenToolStripMenuItem.Click
If client.Connected = True Then
MsgBox("Server ist schon verbunden")
Else
mainserver()
End If
End Sub
Private Sub mainserver()
Server = New TcpListener(ipendpoint)
Server.Start()
Sub Auswertung()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf Auswertung))
Else
Dim Selectbuffer() As String = Split(readbuffer, "$")
Select Case Selectbuffer(0)
Case "/functionTaskmgr"
taskmgrbuffer = readbuffer
Taskmgr()
Case Else
MsgBox(Selectbuffer(0))
End Select
End If
End Sub
Private Sub TaskmangenerStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TaskmangenerToolStripMenuItem.Click
Dim i As Integer = 0
While i <> ProzessListe.Items.Count
ProzessListe.Items.RemoveAt(i)
End While
SendStartTaskmgr()
End Sub
Sub SendStartTaskmgr()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf SendStartTaskmgr))
Else
stream = client.GetStream
Dim writebuffer() As Byte
writebuffer = System.Text.Encoding.ASCII.GetBytes(startTaskmgr & "$")
stream.Write(writebuffer, 0, writebuffer.Length)
stream.Flush()
End If
End Sub
Sub Taskmgr()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf Taskmgr))
Else
Dim Prozesssplit() As String = Split(taskmgrbuffer, "$")
Dim i As Integer = 1
While String.Compare(Prozesssplit(i), EndgetProzess) <> 0
ProzessListe.Items.Add(New ListViewItem(New String() {Prozesssplit(i), Prozesssplit(i + 1), Prozesssplit(i + 2)}))
i = i + 3
End While
ProzessListe.Sort()
End If
End Sub
Private Sub ProzessBeenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProzessBeendenToolStripMenuItem.Click
If MsgBox("Sind sie sicher das sie den Prozess beenden möchten", vbYesNo) = vbYes Then
Dim writebuffer() As Byte
writebuffer = System.Text.Encoding.ASCII.GetBytes("/functionkillProzess$" & ProzessListe.FocusedItem.Text & "$")
stream.Write(writebuffer, 0, writebuffer.Length)
stream.Flush()
Else
End If
End Sub
Private Sub ProzessListe_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProzessListe.DoubleClick
MsgBox(ProzessListe.FocusedItem.Text)
MsgBox(ProzessListe.FocusedItem.Index)
End Sub
Private Sub Beenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BeendenToolStripMenuItem.Click
Try
client.Client.Shutdown(SocketShutdown.Both)
Catch
End Try
Try
client.Close()
Catch
End Try
Try
Server.Stop()
Catch
End Try
End
End Sub
Private Sub FensterSchließen_FormClosing(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Try
client.Client.Shutdown(SocketShutdown.Both)
Catch
End Try
Public Class Form1
Dim stream As NetworkStream
Dim Client As New TcpClient
Dim IP As String = "gambo.selfip.com"
Dim Port As Integer = 4000
Dim getMessage As Threading.Thread
Dim startTaskmgr As String = "/functionTaskmgr"
Dim startkillProzess As String = "/functionkillProzess"
Dim EndgetProzess As String = "/endgetprozess"
Dim restart As String = "/restart"
Dim stringexit As String
Dim readbuffer As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
getMessage = New Threading.Thread(AddressOf read)
mainserver()
End Sub
Sub mainserver()
newconnect:
Try
Client.Connect(IP, Port)
stream = Client.GetStream
stream = Client.GetStream
getMessage.Start()
Catch
Sleep(1000)
GoTo newconnect
End Try
End Sub
Sub read()
For infiniteCounter = 1 To 3
infiniteCounter = 1
stream = Client.GetStream()
Dim buffsize As Integer
Dim instreambuffer(10024) As Byte
buffsize = Client.ReceiveBufferSize
Sub Auswertung()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf Auswertung))
Else
Dim Selectbuffer() As String = Split(readbuffer, "$")
Select Case Selectbuffer(0)
Case "/functionTaskmgr"
Taskmgr()
Case "/functionkillProzess"
Taskkill(Selectbuffer(1))
Case Else
End Select
End If
End Sub
Sub Taskmgr()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf Taskmgr))
Else
Dim Prozesslistbuffer As String = ""
For Each Prozess As Process In Process.GetProcesses()
Dim Prozessname As String = Prozess.ProcessName
Dim Prozessid As String = Prozess.Id
Dim Prozessbeschreibung As String = "testbeschreibung"
Dim Prozessbuffer As String = Prozessname & "$" & Prozessid & "$" & Prozessbeschreibung & "$"
Prozesslistbuffer = Prozesslistbuffer & Prozessbuffer
Next Prozess
Dim writebuffer() As Byte
writebuffer = System.Text.Encoding.ASCII.GetBytes("/functionTaskmgr$" & Prozesslistbuffer & EndgetProzess & "$")
stream.Write(writebuffer, 0, writebuffer.Length)
stream.Flush()
Prozesslistbuffer = ""
End If
End Sub
Sub Taskkill(ByVal Prozessname As String)
Dim proc As System.Diagnostics.Process
Dim pList() As Process
pList = Process.GetProcessesByName(Prozessname)
For Each proc In pList
proc.Kill()
Next
End Sub
End Class
Da dies mein erster Post ist hoffe ich, dass ich alles richtig gemacht habe und keine Regeln verletzt habe.
Anderenfalls bitte ich mach auf meinen Fehler hinzuweisen. _________________