ಬಾಕಿ ಇರುವ ಬೈಟ್ಗಳನ್ನು ಖಾಲಿ ಮಾಡಿದ ನಂತರ TCP ಅರ್ಧ-ಮುಚ್ಚುವಿಕೆಯನ್ನು ಮುಂದಕ್ಕೆ ಕಳುಹಿಸುವುದು
TCP ಪ್ರಾಕ್ಸಿಯಲ್ಲಿ ಸರತಿಯಲ್ಲಿರುವ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಳ್ಳದೆ ಮತ್ತು ಇನ್ನೊಂದು ದಿಕ್ಕಿನಲ್ಲಿ ಉತ್ತರವನ್ನು ಕಡಿತಗೊಳಿಸದೆ EOF ನಿರ್ವಹಿಸಿ.
ಕ್ಲೈಂಟ್ ಕಳುಹಿಸುವುದನ್ನು ಮುಗಿಸುತ್ತದೆ, ಪ್ರಾಕ್ಸಿ EOF ನೋಡುತ್ತದೆ, ಮತ್ತು ಉತ್ತರ ಮಾಯವಾಗುತ್ತದೆ. ಪ್ರಾಕ್ಸಿಯ ಎರಡೂ ಸಾಕೆಟ್ಗಳನ್ನು ತಕ್ಷಣ ಮುಚ್ಚುವುದು ನಿಖರವಾಗಿ ಆ ಕ್ರಮವನ್ನು ಉಂಟುಮಾಡಬಹುದು. TCP ರಿಲೇಯಲ್ಲಿ ಒಂದು ದಿಕ್ಕಿನಲ್ಲಿ ಕ್ರಮಬದ್ಧ ಅಂತ್ಯವು ಇನ್ನೊಂದು ದಿಕ್ಕು ಮುಗಿದಿದೆ ಎಂದು ಅರ್ಥವಲ್ಲ.
ವಿನಂತಿಯನ್ನು ಕಳುಹಿಸಿ, ತನ್ನ ಕಳುಹಿಸುವ ಬದಿಯನ್ನು ಮುಚ್ಚಿ ಉತ್ತರಕ್ಕಾಗಿ ಕಾಯುತ್ತಿರುವ ಕ್ಲೈಂಟ್ ಅನ್ನು ಪರಿಗಣಿಸಿ:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
ಪ್ರಾಕ್ಸಿಗೆ ಎರಡು TCP ಸಂಪರ್ಕಗಳು ಮತ್ತು ಸ್ವತಂತ್ರವಾಗಿ ಚಲಿಸುವ ಎರಡು ಬೈಟ್ ಸ್ಟ್ರೀಮ್ಗಳು ಇವೆ. ಅದು ತನ್ನ ಮೊದಲು ಬರುವ ಬೈಟ್ಗಳನ್ನು ರವಾನಿಸಿದ ನಂತರ ಒಳಹರಿವಿನ ಅಂತ್ಯದ ಸೂಚನೆಯನ್ನೂ ಮುಂದಕ್ಕೆ ಒಯ್ಯಬೇಕು.
EOF ರವಾನಿಸುವ ಮೊದಲು ಸರತಿಯನ್ನು ಖಾಲಿ ಮಾಡಿ
TCP ಸ್ಟ್ರೀಮ್ನಲ್ಲಿ ಶೂನ್ಯವಲ್ಲದ ಗಾತ್ರದ ಸ್ವೀಕೃತಿಯಲ್ಲಿ, ಶೂನ್ಯದ ಮರಳುವಿಕೆಯು ಆ ಒಳಬರುವ ಸ್ಟ್ರೀಮ್ನ ಕ್ರಮಬದ್ಧ ಅಂತ್ಯವನ್ನು ಸೂಚಿಸುತ್ತದೆ. ಆ ಓದುವ ದಿಕ್ಕನ್ನು ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಗುರುತಿಸಿ. ಅದರಿಂದ ಹೆಚ್ಚಿನ ಇನ್ಪುಟ್ಗಾಗಿ ಕಾಯುವುದನ್ನು ನಿಲ್ಲಿಸಿ, ಆದರೆ ಎದುರು ಸಾಕೆಟ್ಗಾಗಿ ಈಗಾಗಲೇ ಸರತಿಗೆ ಸೇರಿಸಿದ ಬೈಟ್ಗಳನ್ನು ಉಳಿಸಿಕೊಳ್ಳಿ.
ಕ್ಲೈಂಟ್ನಿಂದ ಸೇವೆಗೆ ಇರುವ ಸರತಿ ಖಾಲಿಯಾದ ನಂತರ, POSIX ಸಾಕೆಟ್ನಲ್ಲಿ shutdown(service_socket, SHUT_WR) ಕರೆಯಿರಿ. ಅದು ಸೇವೆಯ ಕಡೆಗಿನ ಮುಂದಿನ ಪ್ರಸಾರವನ್ನು ಕೊನೆಗೊಳಿಸುತ್ತದೆ, ಆದರೆ ಸೇವೆಯಿಂದ ಕ್ಲೈಂಟ್ಗೆ ಇರುವ ದಿಕ್ಕು ಲಭ್ಯವಾಗಿರುತ್ತದೆ. ಸೇವೆ ತನ್ನ ಉತ್ತರವನ್ನು ಮುಗಿಸಿದಾಗ, ಉತ್ತರದ ಸರತಿಯನ್ನು ಖಾಲಿ ಮಾಡಿದ ನಂತರ ಕನ್ನಡಿ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನ್ವಯಿಸಿ.
ಡಿಸ್ಕ್ರಿಪ್ಟರ್ಗಳನ್ನು ಮುಚ್ಚುವುದು ಎರಡೂ ದಿಕ್ಕುಗಳು ಮತ್ತು ಅವುಗಳ ಬಾಕಿ ಬಫರ್ಗಳು ಮುಗಿದ ಸ್ಥಳಕ್ಕೆ, ಅಥವಾ ದೋಷ ಅಥವಾ ರದ್ದತಿಯು ಅಂತ್ಯವನ್ನು ಅಗತ್ಯವಿರಿಸುವ ಸ್ಥಳಕ್ಕೆ ಸೇರಿದೆ. ತನ್ನ ಉಳಿದ ಅರ್ಧವನ್ನು ಎಂದಿಗೂ ಪೂರ್ಣಗೊಳಿಸದ ಸಹವರ್ತಿಗಾಗಿ ಸೀಮಿತ ಕಾಲಮಿತಿಯನ್ನು ಇರಿಸಿ.
ಸಿದ್ಧತೆ ಓದುವ ಆಮಂತ್ರಣ
ಓದಬಹುದಾದ ಸಾಕೆಟ್ನಲ್ಲಿ ಡೇಟಾ ಅಥವಾ EOF ಸ್ಥಿತಿ ಇರಬಹುದು. recv ಕರೆದು ಅದರ ಫಲಿತಾಂಶವನ್ನು ಅರ್ಥೈಸಿ. ಧನಾತ್ಮಕ ಸಂಖ್ಯೆಗಳು ರವಾನಿಸಬೇಕಾದ ಬೈಟ್ಗಳು; ಶೂನ್ಯವು ದಿಕ್ಕಿನ ಅಂತ್ಯ. ಬ್ಲಾಕ್ ಮಾಡದ ಸಾಕೆಟ್ನಲ್ಲಿ, EAGAIN ಅಥವಾ EWOULDBLOCK ಎಂದರೆ ಸದ್ಯಕ್ಕೆ ಹೆಚ್ಚಿನ ಇನ್ಪುಟ್ ಇಲ್ಲ, ಆದರೆ EINTR ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುವ ಅಗತ್ಯವಿರಬಹುದು. ಎರಡೂ EOF ನಂತಹ ಅದೇ ಘಟನೆ ಅಲ್ಲ.
ಮರಳಿಸಿದ ಬೈಟ್ ಬಫರ್ನಲ್ಲಿ FIN ಧ್ವಜವನ್ನು ಹುಡುಕಬೇಡಿ. TCP ಈ API ಗೆ ಕ್ರಮಬದ್ಧ ಬೈಟ್ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ; ಪ್ಯಾಕೆಟ್ ಗಡಿಗಳು ಮತ್ತು FIN ವಿಭಾಗವು ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ ಪೇಲೋಡ್ ಅಲ್ಲ.
ಇದು ಕಚ್ಚಾ ಬೈಟ್ ಸುರಂಗದ ಜೀವನ ಚಕ್ರ. ಸಂದೇಶಗಳನ್ನು ಪಾರ್ಸ್ ಮಾಡುವ HTTP ಪ್ರಾಕ್ಸಿ ಇನ್ನೂ HTTP ಚೌಕಟ್ಟನ್ನು ಗೌರವಿಸಬೇಕು, ಮತ್ತು TLS ಅನ್ನು ಕೊನೆಗೊಳಿಸುವ ಪ್ರಾಕ್ಸಿಗೂ TLS ಮುಚ್ಚುವ ಪ್ರೋಟೋಕಾಲ್ ಇರುತ್ತದೆ. ಆ ಪ್ರೋಟೋಕಾಲ್ ನಿರ್ಧಾರಗಳನ್ನು ದಿಕ್ಕಿನ TCP ರಿಲೇಯ ಮೇಲೆ ಇರಿಸಿ.