Anfon hanner-cau TCP ar ôl draenio'r beitiau sy'n aros
Trin EOF mewn proxy TCP heb ollwng data sydd yn y ciw nac atal yr ateb yn y cyfeiriad arall.
Mae'r cleient yn gorffen anfon, mae'r proxy yn gweld EOF, ac mae'r ateb yn diflannu. Gall cau'r ddau soced proxy ar unwaith achosi'r union ddilyniant hwnnw. Mewn relái TCP, nid yw diwedd trefnus mewn un cyfeiriad yn dweud bod y cyfeiriad arall wedi gorffen.
Ystyriwch gleient sy'n anfon cais, yn cau ei ochr anfon ac yn aros am yr ateb:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Mae gan y proxy ddau gysylltiad TCP a dau ffrwd beitiau sy'n symud yn annibynnol. Mae angen iddo gario'r arwydd diwedd mewnbwn ymlaen, ar ôl cario'r beitiau sy'n dod o'i flaen.
Draeniwch y ciw cyn anfon EOF ymlaen
Ar gyfer derbyniad o faint nad yw'n sero ar ffrwd TCP, mae dychwelyd sero yn dynodi diwedd trefnus y ffrwd fewnol honno. Marciwch y cyfeiriad darllen hwnnw fel un wedi gorffen. Stopiwch aros am fwy o fewnbwn ohono, ond cadwch y beitiau sydd eisoes yn y ciw ar gyfer y soced gyferbyn.
Unwaith y bydd y ciw cleient-i-wasanaeth wedi draenio, galwch shutdown(service_socket, SHUT_WR) ar soced POSIX. Mae hynny'n diweddu trosglwyddiad pellach tuag at y gwasanaeth tra'n gadael y cyfeiriad gwasanaeth-i-gleient ar gael. Pan fydd y gwasanaeth yn gorffen ei ateb, cymhwyswch y gweithrediad drych ar ôl draenio'r ciw ateb.
Mae cau'r disgrifyddion yn perthyn i'r pwynt lle mae'r ddau gyfeiriad a'u byfferau sy'n aros wedi gorffen, neu lle mae gwall neu ganslo yn gofyn am derfynu. Cadwch derfyn amser cyfyngedig ar gyfer cyfoed na fydd byth yn cwblhau ei hanner sy'n weddill.
Mae parodrwydd yn wahoddiad i ddarllen
Gall soced darllenadwy fod â data neu gyflwr EOF. Galwch recv a dehonglwch ei ganlyniad. Cyfrifon positif yw beitiau i'w hanfon ymlaen; sero yw diwedd y cyfeiriad. Ar soced anflociedig, mae EAGAIN neu EWOULDBLOCK yn golygu nad oes mwy o fewnbwn ar hyn o bryd, tra gall EINTR fod angen ailgynnig. Nid yw'r naill na'r llall yr un digwyddiad â EOF.
Peidiwch â chwilio'r byffer beitiau a ddychwelwyd am faner FIN. Mae TCP yn danfon ffrwd beitiau trefnus i'r API hwn; nid yw ffiniau pecynnau a'r segment FIN yn llwyth normal i'r rhaglen.
Dyma gylch bywyd twnnel beitiau crai. Rhaid i proxy HTTP sy'n dosrannu negeseuon barchu fframwaith HTTP o hyd, ac mae gan proxy sy'n terfynu TLS brotocol cau TLS hefyd. Cadwch y penderfyniadau protocol hynny uwchben y relái TCP cyfeiriadol.