2009-02-24 8 views
5

Ich erkenne diese Art von Frage hat eine lange Geschichte, aber die Art, wie ich dies verwende, muss die richtige '.net Weg' sein und doch scheint es nicht zu funktionieren.C# /. Net Socket.Shutdown

Ich habe einen trivialen synchronen IP-Server-Daemon, der eine einfache AcceptSocket, tun einige Sachen, socket.send, socket.shutdown, socket.close. Mein Client ist eine weitere triviale C# -App, die URLDownloadToFile ausführt.

Was passiert ist, dass ein Teil der Zeit URLDownloadToFilefails fehlschlägt mit (0x800C0008) .. denkt, dass seine Download-Ressource fehlgeschlagen ist.

Mein Server-Seite Endsequenz ist:

socket.Shutdown(Both); 
socket.Close(); 

Wenn ich das

socket.Disconnect(); 
socket.Close(); 

(Ich öffne mit sockopt Linger wahr, Timeout 5 s die oben)

ändern

diese Werke groß.

Ich vermisse etwas auf der Shutdown-Methode .. es klingt wie die "magische Kugel" MS möchte Sie für anmutig einen Ausgang verwenden, die letztlich alle verbleibenden senden Daten senden wird.

Grob, (und das kann nicht richtig sein) es scheint wie der Abschluss .. tötet alle Async-Verarbeitung, die von shutdown() ausgeführt werden kann.

Irgendwelche Ideen?

Antwort

3

Basierend auf Socket.Disconnect

Wenn Sie trennen, ohne zuerst anruf Shutdown aufrufen müssen, Sie können die DontLinger Socket-Option auf false, und geben Sie eine von Null verschiedene Überschreitungszeitintervall eingestellt, dass die Daten, um sicherzustellen, Warteschlange Für ausgehende Übertragung wird gesendet. Die Verbindung wird getrennt, bis die Daten gesendet werden oder bis das angegebene Zeitlimit abgelaufen ist. Wenn Sie DontLinger auf false setzen und ein Zeitüberschreitungsintervall von null angeben, gibt Close die -Verbindung frei und verwirft automatisch die ausgehenden Daten in der Warteschlange .

Schlägt vor, die Shutdown bestenfalls überflüssig ...

ist
+0

gar nicht unnötig vor dem Aufruf Trennen. Der zitierte Text besagt, dass Sie Einstellungen ändern müssen, bevor Sie auf Trennen klicken. Wenn nicht, werden Daten gelöscht. – usr

+0

Ist das nicht meine Antwort? Wenn Sie die Einstellungen ändern (die die OP zeigt sie taten) du nicht das Herunterfahren benötigen, wenn Sie mit dem Timeout Verhalten zufrieden sind ... – ShuggyCoUk

2

für den Sockel Verwendung Wiederverwendung:

socket.Shutdown(SocketShutdown.Both); 
socket.Disconnect(true); 

Für Schließkraft Gebrauch:

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 
+3

die Steckdose Wiederverwendung funktioniert nicht. Versuchen Sie es erneut, es wird eine InvalidOperationException auslösen. –