పెండింగ్ బైట్లను ఖాళీ చేసిన తర్వాత 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 రిలే పైన ఉంచండి.