SOCKS rukovanje je uspelo. Sada relej čita od klijenta, piše ka odredištu, čeka potpun odgovor i tek onda ponovo čita od klijenta. Taj sled može da blokira sasvim validnu aplikaciju.

Kada je TCP tunel uspostavljen, SOCKS ne definiše poruke unutar njega. Odredište može da pošalje prvo. Obe strane mogu da šalju nezavisno. Jedna strana može da pošalje kratak zapis i zatim čeka odgovor druge.

Prenosite bajtove, a ne nagađane transakcije

Poziv prijema vraća dostupne bajtove u skladu sa zastavicama i stanjem soketa. On ne govori opštem releju da je odgovor aplikacije potpun. Čekanje da se napuni proizvoljno veliki bafer može da spreči prosleđivanje male poruke koja je partneru potrebna da nastavi.

Koristite postojeći model konkurentnosti aplikacije za opsluživanje oba smera: petlju događaja, asinhroni I/O ili drugi namerno izabran dizajn. Važno ponašanje je da napredak u jednom smeru ne zahteva izmišljenu granicu poruke u drugom.

Držite dva ograničena bafera na čekanju

Podaci pročitani od klijenta možda još čekaju da stignu do odredišta, dok podaci sa odredišta čekaju da stignu do klijenta. Pratite te bajtove na čekanju odvojeno.

Slanje može da upiše manje bajtova nego što je zatraženo. Zadržite neupisani deo; ne odbacujte ga i ne puštajte ceo bafer ponovo. Privremeno neupisiv soket je razlog da se čeka ispravan događaj spremnosti, a ne da se neprestano vrti.

Ograničite bafore. Ako je odredište sporo, nastavljanje čitanja neograničenih podataka klijenta samo premešta red u memoriju releja. Povratni pritisak znači pauziranje čitanja kada je odgovarajući bafer na čekanju pun i nastavljanje kada upisi oslobode prostor.

Kraj u jednom smeru zahteva politiku

TCP može da zatvori smer slanja dok drugi smer još ima korisne podatke. Odlučite kako da se to stanje prenese nakon što se baferovani bajtovi isprazne, i razlikujte uredno zatvaranje od greške ili roka.

Ništa od ovoga ne zahteva da relej dešifruje ili parsira korisni teret aplikacije. Potrebno je ispravno rukovanje tokom. Samo povećanje veličine bafera ne može da popravi relej koji čeka pogrešnu stranu ili pretpostavlja da svako čitanje odgovara jednom celom zahtevu.

Povezani članci