"Server.AcceptTcpClient" abbrechen...
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.
-
-
-
-
-
-
Du könntest mit listener.Pending() prüfen ob überhaupt Verbindungen da sind, ansonsten rufst du AcceptTcpClient gar nicht auf.
-
-
-
-
-
@ThuCommix: Oh, klar. An eine whileschleife dafür habe ich garnicht gedacht.. trotzdem kriege ich das noch nicht so ganz hin.
Ich bin dann mal bereit, meinen kompletten Code hier zu posten:
Class1.vb (Public Class Client, Public Class Server):
Spoiler anzeigen VB.NET-Quellcode
- Option Strict On
- Imports System.Net.Sockets
- Imports System.IO
- Imports System.Net
- Public Class Client
- Dim Stream As NetworkStream
- Dim StreamWriter As StreamWriter
- Dim StreamReader As StreamReader
- Dim Client As TcpClient
- Dim MainThread As Threading.Thread
- Public Event LostConnection(ByVal Reason As String)
- Sub New()
- MainThread = New Threading.Thread(AddressOf Main)
- MainThread.Start()
- End Sub
- Private Sub Main()
- While True
- If Client Is Nothing Then
- Continue While
- End If
- If Client.Connected = False Then
- Return
- End If
- Dim Msg As String = Receive()
- If Msg.Contains("shutdown") Then
- Dim Reason As String = Msg.Remove(0, "shutdown ".Length)
- RaiseEvent LostConnection(Reason)
- Disconnect(Reason)
- End If
- End While
- End Sub
- Public Function Connect(ByVal IP As String, ByVal Port As Integer, Optional ByRef ExitError As String = "", Optional ByVal Timeout As Integer = 5000) As Boolean
- If Client IsNot Nothing Then
- If Client.Connected Then
- ExitError = "Der Client ist bereits mit dem Server verbunden."
- Return False
- End If
- End If
- If Client Is Nothing Then
- Client = New TcpClient
- Dim Result As IAsyncResult = Client.BeginConnect(IP, Port, Nothing, Nothing)
- Dim Connected As Boolean = Result.AsyncWaitHandle.WaitOne(Timeout, True)
- If Connected Then
- Client.EndConnect(Result)
- Else
- ExitError = "Es konnte keine Verbindung zu dem Server aufgebaut werden (Timeout)"
- Return False
- End If
- If Client.Connected Then
- Stream = Client.GetStream
- StreamWriter = New StreamWriter(Stream)
- StreamReader = New StreamReader(Stream)
- Return True
- End If
- End If
- Return False
- End Function
- Public Function Disconnect(Optional ByVal Reason As String = "") As Boolean
- If Client IsNot Nothing Then
- If Client.Connected Then
- Send("disconnect")
- Client.Close()
- Client = Nothing
- Return True
- End If
- End If
- Return False
- End Function
- Public Sub Send(ByVal Input As String)
- Try
- StreamWriter.WriteLine(Input)
- StreamWriter.Flush()
- Catch ex As Exception : GotError(ex) : End Try
- End Sub
- Public Function Receive() As String
- Try
- Return StreamReader.ReadLine
- Catch ex As Exception
- GotError(ex)
- Return "error"
- End Try
- End Function
- Private Sub GotError(ByVal ex As Exception)
- Dim FilePATH As String = String.Format("{0}\client_error-{1}.log", Directory.GetCurrentDirectory, Date.Now)
- If File.Exists(FilePATH) Then
- File.Create(FilePATH)
- End If
- MsgBox("Fehler: " & ex.Message & vbNewLine & "Wurde im aktuellem Pfad gespeichert.")
- Dim ErrorMSG As String = String.Format("{0}: {1}{2}", Date.Now, ex.Message, vbNewLine)
- My.Computer.FileSystem.WriteAllText(FilePATH, ErrorMSG, True)
- End Sub
- End Class
- Public Class Server
- Dim Stream As NetworkStream
- Dim StreamWriter As StreamWriter
- Dim StreamReader As StreamReader
- Dim Server As TcpListener
- Dim Client As TcpClient
- Dim IPEndPoint As IPEndPoint
- Dim MainThread As Threading.Thread
- Dim IsRunning As Boolean = False
- Dim Commands As List(Of String)
- Dim ClientConnected As Boolean = False
- Dim CloseFromExit As Boolean = False
- Public Event ConnectionLost(ByVal Reason As String)
- Public Event ClientConnect()
- Public Event DataReceived(ByVal Message As String)
- Public Event ConlessData(ByVal Message As String)
- Sub New(ByVal Port As Integer)
- IPEndPoint = New IPEndPoint(IPAddress.Any, Port)
- ResetCommands() ' reset or create commandlist...
- End Sub
- Private Sub ResetCommands()
- Commands = New List(Of String)
- Commands.Add("c0mm4ndl1stf4r3v3r1mb4")
- End Sub
- Public Sub AddCommand(ByVal cmd As String)
- Commands.Add(cmd)
- End Sub
- Public Sub Start()
- Try
- If IsRunning Then
- MsgBox("Der Server ist bereits gestartet. Du kannst diesen nicht doppelt starten.")
- Return
- End If
- MainThread = New Threading.Thread(AddressOf Main)
- MainThread.Start()
- Catch ex As Exception : GotError(ex) : End Try
- End Sub
- Public Sub Close(Optional ByVal FromExit As Boolean = False)
- Try
- Send("shutdown Server Shutdown")
- IsRunning = False
- Server.Stop()
- CloseFromExit = FromExit
- Catch ex As Exception : GotError(ex) : End Try
- End Sub
- Public Sub Restart()
- Close()
- Start()
- End Sub
- Private Sub Main()
- Server = New TcpListener(IPEndPoint)
- Client = New TcpClient
- Server.Start()
- IsRunning = True
- While True
- If Server.Pending Then
- Client = Server.AcceptTcpClient()
- Exit While
- End If
- If CloseFromExit Then
- Return
- End If
- End While
- RaiseEvent ClientConnect()
- ClientConnected = True
- Stream = Client.GetStream
- StreamReader = New StreamReader(Stream)
- StreamWriter = New StreamWriter(Stream)
- While True
- If IsRunning = False Then
- Return
- End If
- Dim Msg As String = StreamReader.ReadLine
- Select Case Msg
- Case CommandExists(Msg)
- RaiseEvent DataReceived(Msg)
- Case "disconnect"
- ClientConnected = False
- RaiseEvent ConnectionLost("")
- Restart()
- Case Else
- RaiseEvent ConlessData(Msg)
- End Select
- End While
- End Sub
- Private Function CommandExists(ByVal cmd As String) As String
- For Each item In Commands
- If item = cmd Then
- Return item
- End If
- Next
- Return ""
- End Function
- Public Sub Send(ByVal Input As String)
- Try
- If ClientConnected = False Then
- Exit Sub
- End If
- StreamWriter.WriteLine(Input)
- StreamWriter.Flush()
- Catch ex As Exception : GotError(ex) : End Try
- End Sub
- Private Sub GotError(ByVal ex As Exception)
- Dim FilePATH As String = String.Format("{0}\server_error.txt", Directory.GetCurrentDirectory)
- MsgBox("Fehler: " & ex.Message & vbNewLine & "Wurde im aktuellem Pfad gespeichert.")
- Dim ErrorMSG As String = String.Format("{0}: {1}{2}", Date.Now, ex.Message, vbNewLine)
- My.Computer.FileSystem.WriteAllText(FilePATH, ErrorMSG, True)
- End Sub
- End Class
Form1.vb:
Spoiler anzeigen VB.NET-Quellcode
- Option Strict On
- Imports WindowsApplication1.Client
- Imports WindowsApplication1.Server
- Public Class Form1
- Dim OwnIP As String = "snip"
- Dim WithEvents Client As Client
- Dim WithEvents Server As Server
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- Client.Disconnect()
- Server.Close(True)
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Client = New Client
- Server = New Server(8)
- Server.Start()
- Server.AddCommand("test")
- Dim pError As String = ""
- If Not Client.Connect(OwnIP, 8, pError) Then
- MsgBox(pError)
- End If
- End Sub
- Sub Client_ConnectionLost(ByVal Reason As String) Handles Client.LostConnection
- MsgBox("Der Client hat die Verbindung zum Server verloren (" & Reason & ")")
- End Sub
- Sub Server_ConnectionLost(ByVal Reason As String) Handles Server.ConnectionLost
- MsgBox("Der Server hat die Verbindung zum Client verloren (" & Reason & ")")
- End Sub
- Sub Server_ClientConnected() Handles Server.ClientConnect
- MsgBox("Server: Client hat Verbindung mit Server erfolgreich aufgebaut.")
- End Sub
- Sub Server_DataReceived(ByVal Message As String) Handles Server.DataReceived
- End Sub
- Sub Server_GotInvalidMessage(ByVal Message As String) Handles Server.ConlessData
- MsgBox("Server: Kenne Befehl '" & Message & "' nicht.")
- End Sub
- End Class
Tim -
Das While darf nicht exited werden, lass die Schleife einfach weiter laufen. Eventuell kannst du da noch ein Thread.Sleep(3) setzten, damit die CPU ein bisschen gespart wird.
-
-
Weswegen? Nur wenn dein abbruch Befehl kommt sollte sie verlassen werden. Ansonsten ist die dafür da, um Clients anzunehmen.
-
-
Ach jetzt verstehe ich, du musst das anders machen. Starte einen neuen Thread (in diesen Main Thread nach den der Client angenommen wurde) der dann den neuen TcpClient händelt, sprich Events usw. Dann musst du auch den AcceptThread nicht exiten, so wird es eigentlich gemacht.
-
-
@ThuCommix: backtothetoast:
Ihr wisst, dass es Blödsinn ist, andauernd zu checken, ob eine Verbindungsanfrage vorliegt? Erstens treibt es die CPU-Last unnötig in die Höhe, zweitens ist es wohl daneben, wenn ohnehin signalisiert wird, wenn eine Verbindung zustande gekommen ist. Ich arbeite nun schon lange mit Sockets und diese Pending-Property habe ich noch niemals gebraucht. Der Aufruf von .Stop() tut genau das, was ich sagte und ebenso sagt es MSDN:
msdn.microsoft.com/en-us/libra…ets.tcplistener.stop.aspxDie Unendlichkeit ist weit. Vor allem gegen Ende.
Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. -
Mag sein, aber damit kann man dynamisch ohne Exception aufhören Clients anzunehmen. Deine Variante lässt ja den Server stoppen und nicht nur die Client annahme.
-
Ja aber das ist ja genau das Prinzip. Ich stoppe den Server, da ich keine Clients mehr annehmen will. Ich starte den Server wieder, wenn ich wieder Verbindungen möchte. Auch mit Exceptions kann man den Programmfluss wunderbar steuern. Aber gut, Dir muss ich das nicht sagen. Ich wollte das nur nochmal klar gestellt haben.Die Unendlichkeit ist weit. Vor allem gegen Ende.
Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken.
-
Ähnliche Themen
-
Bowserkoopa - - Internet- und Netzwerkprogrammierung