O cliente remata de enviar, o proxy ve EOF e a resposta desaparece. Pechar ambos os sockets do proxy de inmediato pode provocar exactamente esa secuencia. Nun relé TCP, un final ordenado nunha dirección non significa que a outra dirección rematase.

Considere un cliente que envía unha solicitude, pecha o seu lado de envío e agarda a resposta:

client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service

O proxy ten dúas conexións TCP e dous fluxos de bytes que avanzan de xeito independente. Debe levar a indicación de fin de entrada cara adiante, despois de levar os bytes que a preceden.

Baleire a cola antes de reenviar o EOF

Nunha recepción de tamaño distinto de cero nun fluxo TCP, un retorno de cero indica un final ordenado dese fluxo entrante. Marque esa dirección de lectura como rematada. Deixe de agardar máis entrada dela, pero conserve os bytes xa encolados para o socket oposto.

Unha vez baleirada a cola de cliente a servizo, chame shutdown(service_socket, SHUT_WR) nun socket POSIX. Iso remata a transmisión posterior cara ao servizo e deixa dispoñible a dirección de servizo a cliente. Cando o servizo remate a súa resposta, aplique a operación simétrica tras baleirar a cola de resposta.

Pechar os descritores corresponde ao punto no que ambas as direccións e os seus buffers pendentes remataron, ou no que un erro ou unha cancelación esixen terminar. Manteña un tempo de espera limitado para un par que nunca completa a súa metade restante.

A dispoñibilidade é unha invitación a ler

Un socket lexible pode ter datos ou unha condición de EOF. Chame recv e interprete o resultado. As contas positivas son bytes que reenviar; cero é o final direccional. Nun socket non bloqueante, EAGAIN ou EWOULDBLOCK significan que agora non hai máis entrada, mentres que EINTR pode esixir reintentar. Ningún dos dous é o mesmo evento que EOF.

Non busque un indicador FIN no búfer de bytes devolto. TCP entrega un fluxo de bytes ordenado a esta API; os límites de paquete e o segmento FIN non son carga útil normal da aplicación.

Este é o ciclo de vida dun túnel de bytes en bruto. Un proxy HTTP que analiza mensaxes segue tendo que respectar o enmarcado HTTP, e un proxy que termina TLS tamén ten un protocolo de peche TLS. Manteña esas decisións de protocolo por riba do relé TCP direccional.

Artigos relacionados