Кардар жөнөтүүнү бүтүрөт, прокси 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 релесинен жогору кармаңыз.

Тектеш макалалар