Megfelelő lezárását a foglalat - Problémák closesocket ()

Megfelelő lezárását a foglalat - Problémák closesocket ()

FTPClient írás osztály.
Szembesülnek a következő probléma.

Az FTP protokoll fájlok átvitelére és használt parancsok különböző vegyületek. Tegyük fel, hogy az ügyfél akar feltölteni egy fájlt a szerverre. Ezután néhány ügyfél parancsainak kapott a gazda kiszolgáló: port c, amit (az ügyfél) kapcsolatot létesít a fájlátvitel. Az ügyfél ezután azt írja, hogy a megfelelő aljzatba a fájl tartalmát, és bezárja a foglalat vár egy üzenetet a szerver „226 Transfer teljes” csatorna a parancsokat.

Ha viszont az MSDN, akkor megtudja, mi closesocket () valójában nem zárja be a kapcsolatot azonnal. Ez általában logikus, hiszen néhány adat a sorban maradnak.

A helyzet a következő: át egy kis fájl (16 bájt). Minden jól van, amíg az ügyfél nem próbálja meg bezárni az adatokkal kapcsolatban. Tény, hogy nincs lezárva, az ügyfél elkezd várni egy üzenetet a szerver 226, de nem, talán, adat-kapcsolat még mindig nyitott, és a fájl mérete a kiszolgáló ismeretlen, hogy van, aki úgy véli, hogy a fájl még mindig továbbítják. Várakozás után a kliens bontja a hibaüzenettel, talán, a protokoll felbomlott 10 másodperc alatt.

Én módosította a lezárását a foglalat a következőképpen:


Itt TCPClient - alap osztály FTPClient. A hatás elérésekor a fájl sikeresen továbbított, a protokoll nem sérül. De a döntés úgy tűnik számomra, piszkos. Úgy működik a gépemen, de nincs rá garancia, hogy működni fog az összes felhasználó számára. Alvás és closesocket funkciók csak köze egymáshoz nem csatlakozik.

Kérem, mondja meg, hogyan kell várni a teljes lezárás a kapcsolat?
Az MSDN ezt a kérdést nagyon homályosan leírt, például ajánlott használni a leállást, de a valóságban nem segít. Vannak változata időzzön szerkezet, de ha jól értem, ebben az esetben, akkor valószínű, hogy az adatok nem kerülnek elküldésre, amíg a végén. Talán valami kimaradt, talán az angol nem szabad beszélni. A kód nem feküdt ki, mert ez része a kurzus projekt.

Igen, ha jól értem, a probléma széles körben elterjedt, például a szerint a http: # 047; # 047; community.livejournal.com/csharp_ru/59977.html és az a tény, hogy a Google megtalálja a sok forrásból megtámadni alvás után közel vagy closesocket.

A Windows egyébként lezárja a kapcsolatot nagyon gyors. Az én hibám volt, hogy a kapcsolat nem jön létre abban az időben. Én ezt követően STOR parancsok és server (Quick'n Easy FTP szerver Lite 3.1, nee Pablo FTP szerver), de reagált a fent leírtak szerint. Tovább szerver egyszerűen nem reagál a Stor, mert megpróbáltam, hogy kapcsolatot létesítsen után azonnal PASV és ez segített.