2009-02-24 9 views
5

Rozumiem, że tego typu pytanie ma długą historię, ale sposób, w jaki go używam, musi być prawidłowym ".net way", a mimo to nie działa.C# /. Net Socket.Shutdown

Mam trywialnego synchronicznego demona serwera IP, który wykonuje prosty AcceptSocket, zrób coś, socket.send, socket.shutdown, socket.close. Mój klient to kolejna trywialna aplikacja C#, która wykonuje URLDownloadToFile.

Co się dzieje, że część czasu URLDownloadToFilefails kończy się niepowodzeniem (0x800C0008) .. uważa, że ​​jego zasób pobierania nie powiódł się.

Moja sekwencja końca po stronie serwera jest:

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

Jeśli zmienię to

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

(I otworzyć powyżej sockopt Linger prawdziwego, limit czasu 5 sek)

to działa wspaniały.

Czy brakuje mi czegoś w metodzie Shutdown .. brzmi jak "magiczny pocisk" MS chce, abyś użył do wdzięcznego zrobienia wyjścia, które ostatecznie wyśle ​​wszystkie pozostałe dane do wysłania.

Poważnie, (i to nie może być prawda) wygląda na to, że zamyka .. zabija wszelkie przetwarzanie asynchroniczne, które może być w toku od wyłączenia().

Wszelkie pomysły?

Odpowiedz

3

podstawie Socket.Disconnect

Jeśli trzeba zadzwonić Disconnect bez pierwszego wywołującego Shutdown, ty można ustawić opcję DontLinger Socket false i określ niezerową time-out interwał do zapewnienia, że ​​dane kolejce dla transmisji wychodzącej wysłano . Odłącz następnie blokuje do momentu wysłania danych lub do wyczerpania limitu czasu określonego na . Jeśli ustawisz DontLinger na wartość false i określisz przedział limitu czasu zerowego , Close zwalnia połączenie i automatycznie odrzuca dane oczekujące w kolejce wychodzące z.

sugeruje Shutdown jest w najlepszym wypadku niepotrzebna ...

+0

wcale niepotrzebna przed wywołaniem Rozłączyć się. Cytowany tekst mówi, że musisz zmienić ustawienia przed wywołaniem Disconnect. Jeśli nie, odrzuci dane. – usr

+0

Czy nie jest to moja odpowiedź? Jeśli zmienisz ustawienia (które OP oznacza, że ​​zrobiły), nie potrzebujesz zamknięcia, jeśli jesteś zadowolony z zachowania limitu czasu ... – ShuggyCoUk

2

Na ponowne wykorzystanie Gniazdo:

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

Do stosowania zamknięcia życie:

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

ponowne użycie gniazda nie działa. Spróbuj połączyć ponownie, spowoduje to wyjątek InvalidOperationException. –