Ich versuche einen relativ einfachen TCP-Socket-Sende-/Empfangsvorgang unter Windows CE mit .NET Compact Framework durchzuführen. Ich versuche, den Timeout-Wert so festzulegen, dass das Lesen/Schreiben bei einem langsamen Verbindungstimeout statt für immer blockiert wird. Auf dem gesamten Framework kann ich einfach die ReceiveTimeout
und SendTimeout
Eigenschaften auf dem Socket
Objekt festlegen. Leider führt das Setzen dieser Eigenschaften auf das kompakte Framework sofort zu einer SocketException über die Verwendung einer nicht unterstützten Socket-Option.Korrekte Behandlung von Netzwerk-Timeouts unter Windows CE
Nach ein wenig weiter zu graben, stieß ich auf this Seite, die das folgende sagt:
The following table shows BSD options not supported for setsockopt: Value Type Description SO_ACCEPTCONN BOOL Sets socket listening. SO_RCVLOWAT int Sets recv low watermark. SO_RCVTIMEO int Sets time-out for recv. SO_SNDLOWAT int Sets send low watermark. SO_SNDTIMEO int Sets time-out value for send. SO_TYPE int Sets socket type.
So sieht es nicht wie Windows CE Timeouts unterstützt. Bei einer nicht mehr reagierenden Verbindung kommt es zu einem Timeout, aber es dauert ungefähr eine Minute (muss in WinCE fest codiert sein). Jetzt versuche ich herauszufinden, wie man das manuell implementiert. Mein erster Gedanke ist, asynchrone IO zu verwenden, die mir erlaubt. Dies wird jedoch nicht den asynchronen Thread stoppen, der auf EndSend()
oder EndReceive()
stecken wird. Selbst wenn ich meinen Hauptthread aussetzen kann, werden immer noch Threads herumstehen, bis das festgeschriebene Timeout erreicht ist. Während dieser Zeit wird meine Anwendung nicht ordnungsgemäß heruntergefahren. Die einzige Möglichkeit, um dieses Problem zu umgehen, wäre, den asynchronen Thread abzubrechen, aber das scheint eine sehr schlechte Idee zu sein, und würde ich gerne vermeiden.
Also, was ist der richtige Weg, damit umzugehen? Es muss einen einfachen Weg geben, da andere Anwendungen (z. B. IE auf WinCE) scheinbar keine Schwierigkeiten haben, ausstehende Netzwerkoperationen zu terminieren oder zu löschen, und sie scheinen in der Lage zu sein, auch ohne Probleme herunterzufahren.
Könnten Sie bitte den Beispielcode teilen? –
Ordentlich Lösung, aber ich nehme an, Sie haben das Timeout-Problem in Windows CE nicht gelöst? Wenn ich dies auf Windows CE 6.0 versuche, erhalte ich nach ca. 20s eine Zeitüberschreitung, und ich war nicht in der Lage, das zu optimieren. Siehe zum Beispiel: https://stackoverflow.com/questions/44566777/tweak-timeout-period-for-socket-connections-on-windows-ce – AlainD