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?
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
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