Tuneli inapanda, ikoni ya ufunguo inaonekana, lakini kila ombi kwenye kivinjari bado linaisha kwa muda. Katika programu ya VpnService mchanganyiko huo kwa kawaida humaanisha kuwa mzunguko wa kusoma uko hai na nusu ya pato imevunjika, si kwamba seva ilikataa kupeana mkono. Android tayari imeunda kiolesura, imehamishia trafiki ya programu ndani yake na kumpa mchakato wako kielekezi cha faili. Kila kitu baada ya kielekezi hicho ni msimbo wako, na wito mmoja unaokosekana unatosha kumeza mtiririko wote.

Mfumo unakupa nini na haukupi nini

establish() hurudisha ParcelFileDescriptor kwa kiolesura cha tun. Mfumo huandika pakiti za IP zinazotoka ndani yake na hutegemea mchakato wako uzisome, uamue zinaenda wapi na uzitume kupitia socket ya kawaida. Chini yake hakuna usambazaji wa kernel, kwa hiyo wakati hakuna anayesoma pakiti hutupwa na vihesabu vya kiolesura havina kamwe kusonga.

Anza kwa kuhesabu badala ya kukisia. Ongeza kihesabu kwa kila usomaji uliofanikiwa na uandike mwisho na itifaki ya pakiti za kwanza. Ikiwa kihesabu kinabaki sifuri wakati trafiki inazalishwa, hitilafu iko juu ya msimbo wako wa usambazaji, jambo ambalo hupunguza utafutaji kwenye usanidi wa builder na hali ya kusoma. Ikiwa kihesabu kinasonga na kivinjari bado kinashindikana, hitilafu iko kwenye njia ya kutuma au ya kurudi.

Usomaji wa kuzuia huamua kama mzunguko unasonga

setBlocking(true) huweka kielekezi katika hali ya kuzuia na imekuwepo tangu API 21. Katika matoleo ya zamani suluhisho ni msaidizi mdogo wa JNI anayefuta O_NONBLOCK kwa fcntl kwenye kielekezi ghafi. Hali hiyo ni muhimu kwa sababu huamua usomaji usio na pakiti inayosubiri unaruhusiwa kufanya nini.

Katika hali isiyozuia usomaji huo hurudi mara moja na thamani hasi, na mzunguko unaopuuza matokeo huzungusha kiini bila kusonga trafiki yoyote. Katika hali ya kuzuia usomaji husubiri, jambo ambalo thread ya usambazaji inataka, lakini thread haiwezi kusimamishwa tena. Kufunga kielekezi ndiyo njia inayotumika kufanya usomaji ushindikane ili mzunguko uweze kutoka. Kuua mchakato au kusimamisha thread kunaweza kuacha uanzishaji unaofuata na kielekezi kisicholingana tena na kiolesura.

Soma pakiti moja kwa kila wito kwenye bafa ya ukubwa wa MTU ya kiolesura, na chukua sifuri au kurudi hasi kama hitilafu, si pakiti tupu.

protect() kabla ya kutuma kwanza, si baada

Kila socket inayobeba pakiti iliyofungwa lazima ilindwe kwanza. Socket isiyolindwa inafuata kanuni zile zile za uelekezaji ulizoweka, kwa hiyo pakiti zake zinarudi kwenye tuneli na mzunguko wako wa kusoma unazichukua tena. Kisha tuneli husambaza pato lake mwenyewe bila mwisho, na kutoka nje inaonekana kama muunganisho unaofunguka na kamwe haujibu.

Mpangilio ni protect, kisha connect au bind, kisha send. Kuita protect baada ya connect kunaweza kuacha uamuzi wa awali wa njia, kwa hiyo socket inaendelea kutumia njia isiyo sahihi ingawa wito ulirudisha true. Angalia boolean inayorudishwa na ushindikane kwa sauti wakati ni false, badala ya kuingia kwenye utumaji ambao hauwezi kufanya kazi.

Hitilafu ya ruhusa kutoka sendto kwenye socket ambayo haijawahi kugusa protect() ni alama ya kawaida ya hitilafu hii.

Mfano wa UDP haubebi HTTPS

Mfano wa usambazaji ambao mafunzo mengi hunakili hushughulikia UDP pekee. TCP inahitaji kupeana mkono, namba za mfululizo, uthibitisho na kutuma tena, na mzunguko unaonakili mzigo kati ya kielekezi cha tun na socket hautoi kitu chochote kati ya hivyo. Ndiyo sababu ombi la DNS kwa UDP linaweza kupita wakati kila ombi la HTTPS linakwama. Ama endesha stack ya TCP kwenye nafasi ya mtumiaji au kabidhi miunganisho kwa proksi ya ndani inayomaliza TCP kwenye kifaa na kusambaza mtiririko.

Jaribu mgawanyiko kabla ya kuandika upya chochote: tuma ombi moja la UDP na ufungue muunganisho mmoja wa TCP kwa mwenyeji yule yule. Ikiwa njia ya UDP inafanya kazi na njia ya TCP inakwama kwenye SYN ya kwanza, tatizo ni msimbo wa usambazaji na si seva. Ulinganisho huo mmoja huokoa muda mwingi unaotumika kusoma kumbukumbu za seva zisizo na kitu cha manufaa.

Orodha ya njia na vichungi kwa kila programu hupunguza unachokiona

addAddress, addRoute na addDns huamua kile mfumo unatuma kwenye tuneli. Mwisho nje ya orodha ya njia haufiki kamwe kwenye kielekezi chako, kwa hiyo hakuna kiasi cha mantiki ya usambazaji kitakachoirekebisha. Andika wito za builder unazofanya na uzilinganishe na anwani ambazo programu inajaribu kufikia kwa kweli.

Uchaguzi kwa kila programu una kiwango chake cha chini: addAllowedApplication na addDisallowedApplication zinahitaji API 21, na katika matoleo ya zamani mbinu hizo hazipo kabisa. Muundo unaochuja kwa pakiti hauwezi kufanya kazi hapo hata kidogo.

Kuweka upya kunaacha vielekezi vilivyopitwa na wakati

Wito mpya wa establish() hurudisha kielekezi kipya na kufunga kiolesura kilichopita. Kielekezi cha zamani sasa si halali, kwa hiyo thread iliyozuiwa juu yake hupata hitilafu, na socket zilizoundwa kwa njia ya zamani zinaweza kuhitaji kubadilishwa. onRevoke ni wito wa kurudi kwa tuneli ambayo mtumiaji au mfumo umeichukua. Kuweka mzunguko wa maisha kwa mmiliki mmoja, anayesimamisha msomaji kabla ya kuweka upya, huzuia hali nyingi za kuunganishwa-lakini-wamekufa.

Soma kila hitilafu kwa hatua inayohusika. Kuweka upya muunganisho kutoka recvfrom humaanisha upande wa mbali ulifunga wakati msimbo wako bado ulikuwa unasoma. Hitilafu ya anwani mbaya inaelekeza kwenye uchanganuzi wa kichwa au hitilafu ya offset, si kwenye mtandao.

Mpangilio wa kazi: hali ya kuzuia imewashwa, pakiti moja kwa usomaji, kichwa kimechanganuliwa, socket imelindwa, mzigo umetumwa, kufunga safi wakati wa makabidhiano na orodha ya njia inayofunika mwisho.

Makala zinazohusiana