TCP-ის ნახევრად დახურვის გადაცემა მომლოდინე ბაიტების დაცლის შემდეგ
მართეთ EOF TCP პროქსიში რიგში მდგარი მონაცემების დაკარგვისა და მეორე მიმართულებით პასუხის შეწყვეტის გარეშე.
კლიენტი ამთავრებს გაგზავნას, პროქსი ხედავს EOF-ს და პასუხი ქრება. პროქსის ორივე სოკეტის დაუყოვნებლივ დახურვამ შეიძლება სწორედ ეს თანმიმდევრობა გამოიწვიოს. TCP რელეში ერთი მიმართულებით წესრიგიანი დასრულება არ ნიშნავს, რომ მეორე მიმართულება დასრულდა.
განვიხილოთ კლიენტი, რომელიც აგზავნის მოთხოვნას, ხურავს თავის გამგზავნ მხარეს და ელოდება პასუხს:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
პროქსის აქვს ორი TCP კავშირი და ორი დამოუკიდებლად მოძრავი ბაიტური ნაკადი. მან უნდა გადასცეს შეყვანის დასასრულის მაჩვენებელი შემდგომ, მის წინ მდებარე ბაიტების გადაცემის შემდეგ.
დაცალეთ რიგი EOF-ის გადაცემამდე
TCP ნაკადზე არანულოვანი ზომის მიღებისას ნულის დაბრუნება მიუთითებს ამ შემომავალი ნაკადის წესრიგიან დასრულებაზე. მონიშნეთ ეს კითხვის მიმართულება დასრულებულად. შეწყვიტეთ მისგან მეტი შეყვანის ლოდინი, მაგრამ შეინახეთ ბაიტები, რომლებიც უკვე რიგშია მოპირდაპირე სოკეტისთვის.
მას შემდეგ, რაც კლიენტიდან სერვისისკენ რიგი დაიცლება, გამოიძახეთ shutdown(service_socket, SHUT_WR) POSIX სოკეტზე. ეს ამთავრებს სერვისისკენ შემდგომ გადაცემას და ტოვებს სერვისიდან კლიენტისკენ მიმართულებას ხელმისაწვდომს. როცა სერვისი დაასრულებს თავის პასუხს, გამოიყენეთ სარკული ოპერაცია პასუხის რიგის დაცლის შემდეგ.
დესკრიპტორების დახურვა ეკუთვნის იმ მომენტს, როცა ორივე მიმართულება და მათი მომლოდინე ბუფერები დასრულებულია, ან როცა შეცდომა ან გაუქმება მოითხოვს შეწყვეტას. შეინახეთ შეზღუდული დროის ლიმიტი პარტნიორისთვის, რომელიც არასოდეს ასრულებს თავის დარჩენილ ნახევარს.
მზადყოფნა კითხვის მოწვევაა
წაკითხვად სოკეტს შეიძლება ჰქონდეს მონაცემები ან EOF მდგომარეობა. გამოიძახეთ recv და განმარტეთ შედეგი. დადებითი რიცხვები გადასაცემი ბაიტებია; ნული მიმართულების დასასრულია. არაბლოკირებად სოკეტზე EAGAIN ან EWOULDBLOCK ნიშნავს, რომ ამჟამად მეტი შეყვანა არ არის, ხოლო EINTR შეიძლება მოითხოვდეს ხელახლა ცდას. არც ერთი მათგანი არ არის იგივე მოვლენა, რაც EOF.
არ მოძებნოთ FIN დროშა დაბრუნებულ ბაიტურ ბუფერში. TCP ამ API-ს გადასცემს დალაგებულ ბაიტურ ნაკადს; პაკეტის საზღვრები და FIN სეგმენტი ჩვეულებრივი აპლიკაციური დატვირთვა არ არის.
ეს არის ნედლი ბაიტური გვირაბის სასიცოცხლო ციკლი. შეტყობინებების გარჩევის HTTP პროქსიმ მაინც უნდა დაიცვას HTTP ჩარჩოება, ხოლო TLS-ის დამამთავრებელ პროქსისაც აქვს TLS დახურვის პროტოკოლი. შეინახეთ ეს პროტოკოლური გადაწყვეტილებები მიმართულებიანი TCP რელეს ზემოთ.