Ich probiere mich seit ein paar Tagen an einem Socket Programm, jedoch habe Ich das Problem dass das Programm immer einfriert wenn Ich es starte. Im Internet bin Ich darauf gestoßen, es mit mehreren Threads zu lösen, aber auch das hat nicht funktioniert. Hat von euch jemand eine Idee was man da machen könnte?
Im Anhang findet ihr die beiden Projekte Server und Client.
Also ich hab den code mal gerade überflogen. Bin jetzt auch nicht wirklich vb coder aber vlt kann ich trotzdem helfen.
Ich vermute dein Programm friert ein weil darauf gewartet wird das eine Nachricht ankommt und erst dann etwas passiert.
Dafür würde sich ein eigener thread eignen der Nachrichten empfängt.
Das Programm sieht mir nach nem copy paste aus such dir lieber ein tutorial auf YouTube die den code erklären nicht einfach einen code kopieren.
Außerdem würde ich dir utf8 als encoding empfehlen. Ascii hat seine Probleme mit Sonderzeichen und umbauten.
Also ich hab den code mal gerade überflogen. Bin jetzt auch nicht wirklich vb coder aber vlt kann ich trotzdem helfen.
Ich vermute dein Programm friert ein weil darauf gewartet wird das eine Nachricht ankommt und erst dann etwas passiert.
Dafür würde sich ein eigener thread eignen der Nachrichten empfängt.
Das Programm sieht mir nach nem copy paste aus such dir lieber ein tutorial auf YouTube die den code erklären nicht einfach einen code kopieren.
Außerdem würde ich dir utf8 als encoding empfehlen. Ascii hat seine Probleme mit Sonderzeichen und umbauten.
Erstmal danke für deine Antwort
Der Code ist copy & paste da Ich nach einem Code gesucht hatte, wo das soweit funktioniert. Der Server war am Anfang eine Konsole, aber als Ich es in eine Windows Form umgeschrieben habe, ist es halt so komisch eingefroren und das selbe Problem habe Ich halt auch mit meinem ursprünglichem Programm. Ich weiß also auch was der Code tut, nur das mit dem Threading erschließt sich mir noch nicht völlig. Es ist aber auch allgemein unlogisch dass es jetzt in der Windows Form nicht mehr funktioniert.....
Von hier habe Ich die ursprüngliche Source (mit der Konsolen Application) gehabt:
Dein Problem ist das der serverSocket.AcceptTcpClient() eine Blockende Funktion ist
Entweder Asynchron machen (serverSocket.AcceptTcpClientAsync()) oder überprüfen ob überhaupt Daten angefragt werden, so hab ich das Problem gelöst ()
Der Code enthält noch weitere unzählige Fehler die du noch Fixen musst!
Bitte beachte, ich hab schon seit Ewigkeiten kein vb mehr benutzt
ps. lösche noch die Zeile " MsgBox("Client Connected")" vorher heraus xD , hab die vergessen zu entfernen D;
@tooti Danke für deine Antwort, jetzt weiß Ich wo der Hund begraben liegt Wie funktioniert denn diese Async Methode?
Ich habe es jetzt mal so gemacht wie in deinem Vorschlag, es klappt auch alles Super außer das im Server nicht angezeigt wird wenn der Client etwas geschickt hat D: Ist das bei mir ein grundsätzlicher Fehler oder hat das damit zu tun?
@Heaven
Was genau soll Ich alles in nen Thread packen? D:
Das du eine Methode machst, in der du alles, was mit dem Socket zu tun hat behandelt.
Die Methode rufst du dann in einem neuem Thread auf.
In Z.48-50 wird z.B. ein Thread genutzt, um die eingehenden Pakete zu lesen, in Z.52-54 werden die Pakete in einem neuem Thread behandelt. So blockiere diese sich nicht gegenseitig und können unabhängig voneinander arbeiten
Ok Leute, es klappt jetzt alles soweit danke für eure Hilfe. Ich habe nur noch ein Problem auf eine Textbox zuzugreifen die in einem anderen Thread und einer anderen Klasse ist. Wenn da noch jemand einen hilfreichen Link oder eine Idee hätte, hätte Ich soweit keine Fragen mehr ^^
Danke, ich habe mich jetzt mal ein bisschen in das Invoken eingelesen und sorry wenn Ich noch mal nerve, aber Irgendwie funktioniert es immer noch nicht.
Hier der Code:
Code:
Private Delegate Sub AppendTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)
Private Sub AppendTextBox(ByVal TB As TextBox, ByVal txt As String)
If TB.InvokeRequired Then
TB.Invoke(New AppendTextBoxDelegate(AddressOf AppendTextBox), New Object() {TB, txt})
Else
TB.AppendText(txt)
End If
End Sub
nur am rande, ne textbox kannst du nicht per byval übergeben weil ein objekt eine referenz ist und kein value type, das sollte der compiler aber berichtigen
das gebilde was du dort gepostet hast funktioniert, aber nur wenn man es richtig verwendet. form1 ist ein typ und kein objekt, wenn du diesen code also aus dem aktuellen form1 objekt aufruftst, dann wird er funktionieren weil .net dann weiß das du das standartojekt meinst, wenn du ihn aber aus einer anderen klasse aufrust funktioniert er nicht mehr. das ganze ist eher weniger deine schuld, als die der .net entwickler die versucht haben winforms so einsteiger freundlich wie möglich zu machen und so einige fallen produziert haben.
also wenn der thread im aktuellen form1 objekt erzeugt und gestartet wird dann verwende Me. statt Form1. wenn das nicht der fall ist musst du eine referenz zur aktuellen Form1 haben und diese nutzen
nur am rande, ne textbox kannst du nicht per byval übergeben weil ein objekt eine referenz ist und kein value type, das sollte der compiler aber berichtigen
das gebilde was du dort gepostet hast funktioniert, aber nur wenn man es richtig verwendet. form1 ist ein typ und kein objekt, wenn du diesen code also aus dem aktuellen form1 objekt aufruftst, dann wird er funktionieren weil .net dann weiß das du das standartojekt meinst, wenn du ihn aber aus einer anderen klasse aufrust funktioniert er nicht mehr. das ganze ist eher weniger deine schuld, als die der .net entwickler die versucht haben winforms so einsteiger freundlich wie möglich zu machen und so einige fallen produziert haben.
also wenn der thread im aktuellen form1 objekt erzeugt und gestartet wird dann verwende Me. statt Form1. wenn das nicht der fall ist musst du eine referenz zur aktuellen Form1 haben und diese nutzen
Ok, das ist zwar verwirrend aber Ich glaube Ich verstehe ^^ Ich werde das mal ausprobieren, Vielen Dank Komischerweise wird mir das mit dem ByVal der TextBox überhaupt nicht als Fehler angezeigt, dem Compiler gefällt eigentlich alles soweit D: Wie kann man eine TextBox denn dann übergeben? Und eine Referenz ist
Socket ID von einem Programm herausfinden , über die verbunden wird ? 08/29/2011 - General Coding - 7 Replies Also ich habe ein kleines Problem :
Ich möchte die Socket ID , von z.b. Firefox.exe herausfinden , über die es mit dem Internet verbunden ist .
WPE kann es ja anzeigen , aber ich kann den Benutzer schlecht jedesmal auffordern , dass er erst mit WPE die Socket Id herausfinden soll und danach diese eingeben soll .
Also ich nehmen gerne Beispiele in folgenden Sprachen entgegen :
C++
C
Visual basic
AutoIT ( Eher unwarscheinlich , dass es etwas derartiges ohne Dlls gibt)