Închiderea corectă a soclului este o pistă cu închidere ()

Închiderea corectă a soclului este o pistă cu închidere ()

Scriu clasa FTPClient.
Confruntată cu următoarea problemă.

În protocolul FTP, diferite conexiuni sunt utilizate pentru a transfera fișiere și comenzi. Să presupunem că un client dorește să încarce un fișier pe server. După executarea unor comenzi, clientul primește de la serverul gazdă: portul c pe care îl (clientul) stabilește o conexiune pentru transferul fișierului. Apoi, clientul scrie conținutul fișierului la soclul corespunzător, închide soclul și așteaptă ca serverul să trimită mesajul "226 Transfer complete" prin canal pentru trimiterea comenzilor.

Dacă vă uitați la MSDN, puteți afla că closesocket () nu închide imediat conexiunea. Acest lucru este în general logic, deoarece unele date pot rămâne în coada de așteptare.

Situația este următoarea: este transferat un fișier mic (16 octeți). Totul este bine, până când clientul încearcă să închidă conexiunea de date. De fapt, nu este închis, clientul începe să aștepte un mesaj de la serverul 226, dar nu este, poate, date de conectare este încă deschisă, iar dimensiunea fișierului a serverului nu este cunoscut, adică, el crede că fișierul este încă în curs de transmitere. După un interval de timp de 10 secunde, clientul se deconectează de la mesajul de eroare, protocolul TCP a fost întrerupt.

Am modificat închiderea soclului după cum urmează:


Aici TCPClient este clasa de bază FTPClient. Efectul este atins, fișierul este transmis cu succes, protocolul nu este încălcat. Dar decizia mi se pare murdară. Funcționează pe mașina mea, dar nu există nicio garanție că va funcționa pentru toți utilizatorii. Funcțiile Sleep și closesocket nu sunt conectate între ele.

Spuneți-mi, vă rog, cum să așteptați până când conexiunea este complet închisă?
În MSDN, această întrebare este descrisă foarte vag, de exemplu se recomandă utilizarea opririi, dar în realitate nu m-am ajutat. Există o anumită opțiune cu structură de tip linger, dar, după cum înțeleg, în acest caz există posibilitatea ca datele să nu fie trimise până la sfârșit. Poate că mi-a lipsit ceva, pentru că nu prea știu engleza. Nu pot posta codul, deoarece acesta face parte din proiectul de curs.

Da, după cum am înțeles, problema este larg răspândită, de exemplu, în conformitate cu http: # 047; # 047; community.livejournal.com/csharp_ru/59977.html și faptul că, în Google, puteți găsi o mulțime de surse pentru a provoca somn după aproape sau closesocket.

Winda cumva închide conexiunea foarte repede. Greseala mea a fost că nu mă conectasem în acel moment. Am făcut acest lucru după comenzi Stor și server este permisă (Quick'n Easy FTP Server Lite 3.1, Nee lui Pablo server FTP), dar a reacționat așa cum este descris mai sus. Celălalt server pur și simplu nu a răspuns la STOR, așa că am încercat să stabilesc o conexiune imediat după PASV și a ajutat-o.







Trimiteți-le prietenilor: