.NET Compact Framework: Gibt es bei der Herstellung einer TCP-Verbindung die Möglichkeit ein anderes Timeout einzustellen?

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    .NET Compact Framework: Gibt es bei der Herstellung einer TCP-Verbindung die Möglichkeit ein anderes Timeout einzustellen?

    Hallo,

    ich baue von einem Handheld (.NET CF 2.0) eine TCP Verbindung zu einem PC auf um dann Daten auszutauschen.
    Das funktioniert soweit auch einwandfrei.

    Ist die PC-Serveranwendung jedoch nicht aktiv, dann dauert die nächste Zeile sehr lange:

    VB.NET-Quellcode

    1. Dim client As New TcpClient(ProgrammSettings.Serveradresse, ProgrammSettings.Portnummer)


    Gibt es hier irgend eine Möglichkeit den TCP-Aufbau mit einem Timeout (z.B. 5 Sekunden) zu versehen? Denn die PDA-Anwendung steht auch, wenn lediglich die WLAN-Verbindung schwach oder kurzzeitig ausgefallen ist. Dann soll der User aber nicht so lange warten müssen bis ein erneuter Verbindungsaufbau versucht wird.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Vielleicht nimmst Du einen anderen Konstruktor von TcpClient und probierst dann, Dich mit .Connect(...) zu verbinden.
    Da kannst Du vorher .ReceiveTimeout und .SendTimeout setzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab ich auch schon versucht. Bringt das selbe Ergebnis.
    Und irgendwie hat die Timeout-Einstellung keinen Einfluss auf den Verbindungsaufbau selbst. Egal was ich als Timeout eingebe - es ändert sich an der zu wartenden Zeitspanne nicht.

    Wie gesagt. Es handelt sich dabei um .NET Compact Framework - da gibts angeblich da auch irgendwelche Probleme bei den Timeouts.
    Es wäre mir schon geholfen wenn ich irgendwie anders vor diesem TCP-Aufbau prüfen könnte ob der Zielcomputer erreichbar ist (ein Ping z.B.).

    VB.NET-Quellcode

    1. Dim client As New TcpClient
    2. client.ReceiveTimeout = 1000
    3. client.SendTimeout = 1000
    4. client.Connect(ProgrammSettings.Serveradresse, ProgrammSettings.Portnummer)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    ein Ping z.B.
    Jou. Allerdings weiß ich nicht, ob das über Compact Framework geht.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe es jetzt anders hinbekommen. Über BeginnConnect und einem eigenen Timeout. Fand ich zuerst sehr kompliziert, das Verständnis ist aber mittlerweile da ;)

    VB.NET-Quellcode

    1. '#### neu
    2. Dim targetHost As IPHostEntry = Dns.GetHostEntry(ProgrammSettings.Serveradresse)
    3. Dim ipAddr As IPAddress = targetHost.AddressList(0)
    4. Dim targetEndPoint As New IPEndPoint(ipAddr, ProgrammSettings.Portnummer)
    5. Dim myTimeout As Integer = 3000 '3 seconds
    6. '#### neu


    VB.NET-Quellcode

    1. Dim client As New TcpClient
    2. Try
    3. Dim cliConnect As New cliConnector
    4. client = cliConnect.Connect(targetEndPoint, myTimeout)
    5. Catch ex As Exception
    6. End Try


    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.Text
    4. Imports System.Threading
    5. Public Class cliConnector
    6. Private IsConnectionSuccessful As Boolean = False
    7. Private socketexception As Exception
    8. Private TimeoutObject As New ManualResetEvent(False)
    9. Public Function Connect(ByVal serverendpoint As EndPoint, ByVal timeoutMSec As Integer) As TcpClient
    10. TimeoutObject.Reset()
    11. socketexception = Nothing
    12. Dim tcpCli As New TcpClient
    13. tcpCli.SendTimeout = timeoutMSec
    14. tcpCli.ReceiveTimeout = timeoutMSec
    15. tcpCli.Client.BeginConnect(serverendpoint, New AsyncCallback(AddressOf CallBackMethod), tcpCli)
    16. If TimeoutObject.WaitOne(timeoutMSec, False) Then
    17. If IsConnectionSuccessful Then
    18. Return tcpCli
    19. Else
    20. Throw socketexception
    21. End If
    22. Else
    23. tcpCli.Close()
    24. Throw New TimeoutException("Connection Timed Out")
    25. End If
    26. End Function
    27. Private Sub CallBackMethod(ByVal asyncResult As IAsyncResult)
    28. Try
    29. IsConnectionSuccessful = False
    30. Dim tcpCli As TcpClient = CType(asyncResult.AsyncState, TcpClient)
    31. If Not tcpCli Is Nothing Then
    32. tcpCli.Client.EndConnect(asyncResult)
    33. IsConnectionSuccessful = True
    34. End If
    35. Catch ex As Exception
    36. IsConnectionSuccessful = False
    37. socketexception = ex
    38. Finally
    39. TimeoutObject.Set()
    40. End Try
    41. End Sub
    42. End Class
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at