User Passwort
 Passwort speichern Passwort vergessen?
 
 
 
 Alle Foren
 PDA-Dev :: Windows Mobile
 Windows Mobile - Allgemeines
 tcpClient funktioniert nicht richtig...???
Nächste Seite
Autor Vorheriges Thema Thema Nächstes Thema
Seite: von 2

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt am: 30.06.2010 :  17:12:28 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Hallo erstmal an alle hier...
Ich hoffe hier ein bisschen Unterstützung zu kriegen...
Ich versuche schon seit Stunden, den tcpclient auf meinem Windows Mobile Gerät zum Laufen zu kriegen... Er soll nur Strings verschicken und empfangen, verhält sich aber ganz komisch... Er funktioniert meistens nur das erste Mal (manchmal auch 2 Mal), danach kann ich bis zu einem Neustart des Programms keine Verbindung mehr herstellen...
Der Fehler lautet immer:
"Fehler beim Herstellen der Verbindung, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung konnte nicht aufrechterhalten werden, da der verbundene Host nicht reagiert hat"
Ich habe auch auf dem PC ein kleines Clientprogramm mit dem selben Code geschrieben, das ohne Probleme funktioniert, also denke ich mal ich kann davon ausgehen, dass der TCPListener (Server) keine Probleme macht... (PC verbindet auf localhost, WM6.5 Dev. verbindet auf die "ActiveSync-IP" (nenne ich mal so... =) 169.254.2.2 (Port 27000)...
Hier mein verwendeter Code:
 
Imports System.Net.Sockets
Imports System.Text
Imports System.Net
Public Class RemoteBAT
Dim _Server As String
Dim _Port As String
Public Sub New(ByVal Server As String, ByVal Port As Integer)
_Server = Server
_Port = Port
End Sub
Function RemoteBAT(ByVal command As String) As String
Try
Dim client As New TcpClient(_Server, CInt(_Port))
Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(command)
Dim stream As NetworkStream = client.GetStream
stream.Write(data, 0, data.Length)
data = New [Byte](256) {}
Dim responseData As String = String.Empty
Dim bytes As Int32 = stream.Read(data, 0, data.Length)
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
Return responseData
stream.Close()
client.GetStream.Close()
client.Close()
Catch e As Exception
MsgBox("Fehler RemoteBAT: " & vbNewLine & e.Message)
Return "Fehler RemoteBAT: " & vbNewLine & e.Message
End Try
End Function
End Class
 
Und diese Klasse rufe ich dann auf mittels:
 
Dim GettedData As String
Dim rb As New RemoteBAT("169.254.2.2", 27000)
GettedData = rb.RemoteBAT("get The Thing =)"
 
Der eben erwähnte Code funktioniert genau einmal, danach dauert die Verbindungsherstellung ewig und endet mit der obigen Fehlermeldung. Vielleicht weiß ja der eine oder andere was da los sein kann...???
   

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 30.06.2010 :  22:39:17 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Das kann ich dir genau sagen: Die Return-Anweisung spring aus deiner Funktion raus und stream.Close und Co werden niemals ausgeführt!
Damit sowas nicht passiert am besten sich die Verwendung von using angewöhnen:
Using client As New TcpClient(_Server, CInt(_Port))
' client nutzen
Using stream As NetworkStream = client.GetStream
' stream nutzen
End Using
End Using
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 01.07.2010 :  08:45:56 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Vielen Dank für die Antwort...
Da habe ich wohl einen Copy-Paste Fehler gemacht, denn im Programm habe ich das eh richtig.
Leider ändert das nichts an der Tatsache, dass die Fehlermeldung kommt. Das erste Mal funktioniert es anstandslos, danach gar nicht mehr... Hast du oder jemand anderes vielleicht noch einen Tipp für mich?
Vielen Dank im Voraus...
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 01.07.2010 :  08:52:35 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Jetzige angepasste Funktion:
Function RemoteBAT(ByVal command As String) As String
Try
Dim responseData As String = String.Empty
Using client As New TcpClient(_Server, CInt(_Port))
Using stream As NetworkStream = client.GetStream
Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(command)
stream.Write(data, 0, data.Length)
data = New [Byte](256) {}
Dim bytes As Int32 = stream.Read(data, 0, data.Length)
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
End Using
End Using
Return responseData
Catch e As Exception
MsgBox("Fehler RemoteBAT: " & vbNewLine & e.Message)
Return "Fehler RemoteBAT: " & vbNewLine & e.Message
End Try
End Function
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 01.07.2010 :  12:37:22 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
In welcher Zeile tritt der Fehler auf? Bei client.GetStream?
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 01.07.2010 :  13:33:08 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Nein, bei client = new tcpClient(_Server, CInt(_Port))...
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 01.07.2010 :  22:54:38 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Häh? Das ist aber seltsam! Und wenn du den Konstruktor ohne Parameter nimmst und dann Server und Client über einen Aufruf der Connect-Funktion übergibst?
- Nicht das ich erwarten würde das das etwas ändert, aber probiere es besser mal aus!
Wie sieht eigentlich der Code deines TcpListeners aus?
By the way:
Speicher den Port doch auch als Int und nicht als String! Spart 2x Konvertierung.
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 02.07.2010 :  08:43:04 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Guten Morgen, Useless user...
Leider hat das gar nichts gebracht... Es funktioniert noch immer nicht...
Code TCP-Listener, der als Service läuft unter meinem Benutzeraccount = Admin (, falls relevant...):
 
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System
Imports System.IO
Imports System.Windows.Forms
Public Class ShutDownPCs
Private t As Threading.Thread
Dim WithEvents timer1 As New Timers.Timer(5000)
Private portNumber As Integer
Private tcpListener As TcpListener
Private tcpClient As TcpClient
Sub Timer_Tick() Handles timer1.Elapsed
If Not IsNothing(tcpListener) Then
'passt alles --> Serverthread
Else
end_conn()
network_conn()
End If
End Sub
Protected Overrides Sub OnStart(ByVal args() As String)
' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
' ausführen, damit der Dienst gestartet werden kann.
'Beim(Öffnen)
Dim sm As New SettingsManager
SettingFileName = System.IO.Path.Combine(Application.StartupPath, "ShutDownPCs_config.xml")
Try
Settings = sm.Load(SettingFileName)
Catch exc As Exception
Settings = New Konfiguration
End Try
portNumber = Settings.Port
'sm.Save(Settings, SettingFileName)
timer1.Enabled = True
End Sub
Protected Overrides Sub OnStop()
' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
end_conn()
End Sub
Sub network_conn()
If timer1.Interval = 60000 Then
timer1.Interval = 5000
End If
Try
tcpListener = New TcpListener(IPAddress.Any, portNumber)
tcpListener.Start()
t = New Threading.Thread(New Threading.ThreadStart(AddressOf Daten_empfangen))
t.IsBackground = True
t.Start()
Catch e As Exception
end_conn()
Dim MyLog As New EventLog() ' create a new event log
' Check if the the Event Log Exists
If Not MyLog.SourceExists("ShutDownPCs") Then
MyLog.CreateEventSource("ShutDownPCs", "Error_Log!!!") ' Create Log
End If
MyLog.Source = "ShutDownPCs"
' Write to the Log
MyLog.WriteEntry("ShutDownPCs Log", "Error network_conn: " & e.Message & CStr(TimeOfDay) & vbNewLine & "Waiting a minute, afterwards trying again...", EventLogEntryType.Error)
timer1.Interval = 60000
timer1.Enabled = True
End Try
End Sub
Sub Daten_empfangen()
Dim case_bool As Boolean
Try
While True
'Accept the pending client connection and return a TcpClient initialized for communication.
tcpClient = tcpListener.AcceptTcpClient()
' Get the stream
Dim networkStream As NetworkStream = tcpClient.GetStream()
' Read the stream into a byte array
Dim bytes(tcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
Dim clientdata As String = Encoding.ASCII.GetString(bytes)
clientdata = clientdata.Replace(Chr(0), "")
'Auswertung clientdata...
tcpClient.GetStream.Close()
End While
Catch e As Exception
end_conn()
Dim MyLog As New EventLog() ' create a new event log
' Check if the the Event Log Exists
If Not MyLog.SourceExists("ShutDownPCs") Then
MyLog.CreateEventSource("ShutDownPCs", "Error_Log!!!") ' Create Log
End If
MyLog.Source = "ShutDownPCs"
' Write to the Log
MyLog.WriteEntry("ShutDownPCs Log", "Error Daten_empfangen: " & e.Message & CStr(TimeOfDay) & vbNewLine & "Waiting a minute, afterwards trying again...", EventLogEntryType.Error)
timer1.Interval = 60000
timer1.Enabled = True
End Try
End Sub
Sub restart_conn()
end_conn()
network_conn()
End Sub
Sub end_conn()
Try
If Not IsNothing(tcpClient) Then
If t.IsAlive Then
t.Abort()
End If
If timer1.Enabled = True Then
timer1.Enabled = False
End If
tcpClient.Close()
tcpClient = Nothing
End If
If Not IsNothing(tcpListener) Then
If t.IsAlive Then
t.Abort()
End If
If timer1.Enabled = True Then
timer1.Enabled = False
End If
tcpListener.Stop()
tcpListener = Nothing
End If
Catch e As Exception
Dim MyLog As New EventLog() ' create a new event log
' Check if the the Event Log Exists
If Not MyLog.SourceExists("ShutDownPCs") Then
MyLog.CreateEventSource("ShutDownPCs", "Error_Log!!!") ' Create Log
End If
MyLog.Source = "ShutDownPCs"
' Write to the Log
MyLog.WriteEntry("ShutDownPCs Log", "Error end_conn: " & e.Message & CStr(TimeOfDay) & vbNewLine & "Waiting a minute, afterwards trying again...", EventLogEntryType.Error)
timer1.Interval = 60000
End Try
End Sub
End Class
 
Vielleicht erkennst du jetzt etwas??
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 02.07.2010 :  11:56:39 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
In der Funktion Daten_empfangen hätte ich die Schleife While True anders gemacht: den TCPClient würde ich nicht auf Klassenebene deklarieren sondern nur lokal in der Daten_empfangen - Methode. Der Thread den du hier laufen lässt sollte resourcenmäßig in sich geschlossen sein. Du erstellt mit tcpClient = tcpListener.AcceptTcpClient() ein Objekt und das solltest du auch nach dem Lesen der Daten wieder schließen (natürlich über ein using-Block ). Kann sein das es daher kommt.
Außerdem brennt mir in den Augen das dein Worker-Thread das EventLog erstellt - das gehört in das OnStart und nicht in den Catch-Block!
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 02.07.2010 :  16:53:38 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Meine Daten_empfangen - Methode sieht nun so aus...
 
Sub Daten_empfangen()
Dim case_bool As Boolean
Try
While True
Dim tcpClient As TcpClient
'Accept the pending client connection and return a TcpClient initialized for communication.
TcpClient = tcpListener.AcceptTcpClient()
' Get the stream
Using networkStream As NetworkStream = TcpClient.GetStream()
' Read the stream into a byte array
Dim bytes(TcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(TcpClient.ReceiveBufferSize))
Dim clientdata As String = Encoding.ASCII.GetString(bytes)
clientdata = clientdata.Replace(Chr(0), "")
Select Case case_bool
Case Not clientdata.StartsWith("get")
Dim sendBytes As [Byte]() = Bat_List()
networkStream.Write(sendBytes, 0, sendBytes.Length)
Case Not clientdata.StartsWith("exe")
Dim sendBytes As [Byte]() = exe_file(clientdata)
networkStream.Write(sendBytes, 0, sendBytes.Length)
Case Else
Dim sendBytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes("Invalid command!")
networkStream.Write(sendBytes, 0, sendBytes.Length)
End Select
End Using
tcpClient.Close()
End While
Catch e As Exception
end_conn()
EventLog.WriteEntry("ShutDownPCs", "Error Daten_empfangen: " & e.Message & CStr(TimeOfDay) & vbNewLine & "Waiting a minute, afterwards trying again...", EventLogEntryType.Error)
timer1.Interval = 60000
timer1.Enabled = True
End Try
End Sub
 
Problem bleibt leider bestehen... =(
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 04.07.2010 :  22:25:27 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Was sagt denn dein Ereignisprotokoll? Treten beim Server Exceptions auf wenn du versuchst mit ihm zu kommunizieren`?
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 04.07.2010 :  22:31:51 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Nope... der Server läuft wie er soll... Keine Exceptions, oder sonstiges...
Meiner Meinung nach muss es wirklich ein Problem auf der Handy Seite sein... weil mit dem Programm, dass ich für den PC geschrieben habe, funktioniert es ja auch...
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 05.07.2010 :  13:15:12 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Spielt es eine Rolle wie lange du wartest zwischen dem ersten und dem zweiten Versuch?
0, 1, 10 Minuten?
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 05.07.2010 :  14:15:15 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Ja... spielt es, glaube ich...
Wenn ich schnell genug drücke, schaff ich 2 mal, manchmal sogar 3 mal... Das erste Mal funktioniert aber immer!
Danke nochmal für deine Hilfe... =)
Zum Anfang der Seite

LichtiMC

PDA-Interessierter


12 Beiträge

Erstellt  am: 05.07.2010 :  15:58:54 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
By the way... Wie kann ich eigentlich testen, ob der TCPListener noch "listened"?
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 05.07.2010 :  23:04:34 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Irgendwie ist das alles aus multithreading-Sicht noch ziemlich gruselig. Was du mit deinen Timer bezweckst ist mir nicht ganz klar. Wozu ständig alle Objekte verwerfen und neu aufbauen? Irgendwann beharken sich die Threads bestimmt. Kann man den TCPListener nicht wiederverwenden? Die goldene Regel beim Multithreading ist die Ressource möglichst nicht über deine Klasse zu verteilen sondern alles in einer Funktion ablaufen zu lassen:
1. TcpListener instanzieren (Using tcpListener = New TcpListener(IPAddress.Any, portNumber))
Beginn der Schleife:
2. TcpClient durch TcpListener.Accept erstellen (using TcpClient as TcpClient = TcpListener.AcceptTcpClient)
3. Stream holen, Daten lesen und verarbeiten
4. End Using vom TcpClient-Objekt
Ende der Schleife
5. End Using vom TcpListener-Objekt
Diese Funktion kann dann solange laufen wie dein Dienst läuft.
Zum Anfang der Seite
Seite: von 2 Vorheriges Thema Thema Nächstes Thema  
Nächste Seite
Springe nach:
 
  Bookmark & Share  
 
 
 
  Tags  
   
 

 



pda-dev.de

Quicklinks: Foren-Übersicht | Developer-News | Suche | Impressum

© just-works! Software

Zum Anfang der Seite

Snitz Forums 2000