Pielikums C: sock programma
Pielikums C: sock programma
Vienkārša eksperimentāla programma, ko sauc sock ir lietota visā grāmatā, lai ģenerētu TCP un UDP datus. To izmanto gan kā klienta, gan ka servera procesu. Ja ir šāda programma, kas ir izpildāma no čaulas komandrindas, nav vajadzīgs rakstīt jaunas klientu un serveru programmas valodā C katrai īpatnībai, ko vēlamies pārbaudīt. Tā kā šīs grāmatas mērķis ir saprast tīklošanās protokolus nevis tīklu programmēšanu, šajā pielikumā mēs aprakstām šo programmu un tās daudzās opcijas.
Ir daudzas citas programmas ar līdzīgu funkcionalitāti kā sock. Juergen Nickelsen uzrakstīja programmu, ko sauc socket un Dave Yost uzrakstīja programmu, ko sauc sockio. Abas satur daudzas līdzīgas iezīmes. Arī sock programmas atsevišķi gabali ir bijuši iedvesmoti no atvērtās ttcp programmas, ko uzrakstījuši Mike Muuss un Terry Slattery.
Programma sock darbojas vienā no 4 režīmiem:
- Interaktīvais klients (noklusētais režīms). Programma pievienojas serverim un tad kopē standarta ievadi uz serveri, toties visus no servera saņemtos datus kopē uz standarta izvadi. Tas ir attēlots C.1. attēlā.
a test line we type this line
a test line and the echo server returns a copy
^D type our end-of-file character to terminate
- Interaktīvs serveris: jānorāda opcija sun % sock -s 5555 act as server listening on port 5555
- Avoita klients: jānorāda opcija sun % sock -i -n12 -w4096 bsdi discard
- Ietekas serveris: jānorāda opcijas
-b n Piesaistīt n kā klienta lokālo porta numuru. (Pēc noklusēšanas klients lieto gaistošu porta numuru, ko piešķir sistēma.) -c Pārveidot rindas pārneses (NL) simbolus standartievadē par rakstatgriezi un rindas pārnesi (CR+NL). Un arī otrādi - lasot no tīkla pārveidot virkni CR+NL, prveido to par vienu NL simbolu. Daudzas Interneta aplikācijas sagaida NVT ASCII (26.04.nodaļa), kas rindas beigu apzīmēšanai lieto CR+NL. -f a.b.c.d.p Norādīt svešo IP adresi (a.b.c.d) un svešo porta numuru (p) UDP galapunktam (11.12.nodaļa). -h Implementēt TCP pusslēgšanas funkciju (18.5.nodaļa). T.i. nebeigt tad, kad standartievadē parādās EOF. Tai vietā TCP savienojumam dot pusslēgšanas komandu, bet turpināt lasīt no tīkla kamēr partneris slēdz savienojumu. -i Iztekas klients vai ietekas serveris. Vai nu rakstīt datus tīklā (pēc noklusēšanas), vai arī, ja to lieto kopā ar -s opciju, lasīt datus no tīkla. Opcija -n var norādīt buferu skaitu, ko rakstīt (vai lasīt), opcija -w var norādīt katras rakstīšanas izmēru un -r opcija var norādīt katra nolasījuma izmēru. -n n Lietojot kopā ar opciju -i, n norāda buferu skaitu, ko lasīt vai rakstīt. Mainīgā n noklusētā vērtība ir 1024. -p n Norādīt sekunžu skaitu, kas jāpauzē starp katru lasīšanu vai rakstīšanu. To var izmantot ar iztekas klientu (-i) vai ietekas serveri (-is), lai radītu novēlojumu starp katru tīkla lasīšanu vai rakstīšanu. Sk. arī -P opciju, lai pauzētu pirms pirmās lasīšanas vai rakstīšanas. -q n Norādīt TCP servera nenokārtoto savienojumu rindas garumu: akceptēto savienojumu skaitu, kuras TCP saliks rindā dotajai lietotnei (#picref("f_18_23.gif", "18.23.attēls")). Noklusētā vērtība ir 5. -r n Ja šo lieto kopā ar opciju -is, tad n norāda nolasījuma izmēru no tīkla. Noklusētā vērtība ir 1024 baiti uz nolasījumu. -s Darboties kā serverim nevis kā klientam. -u Lietot nevis TCP, bet UDP. -v Daudzvārdīgs režīms. Izdrukā papildu ziņas (piemēram klienta un servera gaistošos portu numurus standartkļūdas plūsmā. -w n Lietojot kopā ar opciju -i, norāda izmēru katram rakstījumam tīklā. Noklusētā vērtība ir 1024 baiti uz rakstījumu. -A Iespējot soketa opciju SO_REUSEADDR. Lietojot ar TCP tas ļauj procesam piešķirt sev porta numuru, kurš ir daļa no savienojuma, kurš atrodas 2MSL gaidīšanā. Lietojot ar UDP uz sistēmas, kura atļauj multiraidi, tā ļauj vairākiem procesiem lietot to pašu lokālo portu, lai saņemtu apraides vai multiraides datagrammas. -B Iespējot soketa opciju SO_BROADCAST lai atļautu UDP datagrammām tikt nosūtītām uz apraides IP adresi. -D Iespējot soketa opciju SO_DEBUG. Tā rezultātā kodols uzkrāj papildu atkļūdošanas informāciju konkrētajam TCP savienojumam (A.6.nodaļa). Šo informāciju vēlāk var izvadīt, lietojot trpt(8) programmu. -E Iespējot soketa opciju IP_RECVDSTADDR, ja implementācija to atbalsta (11.12.nodaļa). Tas ir domāts UDP serveriem, lai drukātu saņemto UDP datagrammu adresātu. -F Norāda, ka TCP serviss ir daudzpavedienu. T.i. serveris izveido jaunu procesu, izmantojot fork funkciju katram klienta savienojumam. -K Iespējot TCP soketa opciju SO_KEEPALIVE (23.nodaļa). -L n Uzstāda Vilcināšanās laika (soketa opcija SO_LINGER) vērtību uz n dotajam TCP galapunktam. Vilcināšanās laiks 0 nozīmē, ka tad, ja tīkla savienojumu slēdz, visi dati, kuri sastājušies rindā nosūtīšanai tiek izmesti un partnerim nosūta "reset" (18.07.nodaļa). Pozitīvs vilcināšanās laiks (to norāda sekunžu simtdaļās) norāda, ka pēc tīkla savienojuma slēgšanas ir jāgaida norādītais laika sprīdis, kamēr sakrātie dati tiek nosūtīti un apstiprināti. Ja pēc tīkla savienojuma slēgšanas un vilcināšanās laika notecēšanas visi dati nav nosūtīti un apstiprināti, slēgšana atgriež kļūdu. -N Uzstāda soketu opciju TCP_NODELAY, lai atspējotu Nagle algoritmu (19.4.nodaļa). -O n Norāda sekunžu skaitu, ko TCP serveris pauzē pirms pieņem pirmo klienta savienojumu. -P n Norāda sekunžu skaitu, ko pauzē, pirms pirmā nolasījuma vai rakstījuma. To var izmantot kopā ar ietekas serveri (-is), lai novēlotu pēc konekcijas pieprasījuma pieņemšanas no klienta, bet pirms pirmā lasījuma pieņemšanas no tīkla. Kad to lieto kopā ar iztekas klientu (-i), tas rada novēlojumu pēc konekcijas izveidošanas, bet pirms pirmā rakstījuma tīklā. Sk. arī opciju -p, lai pauzētu starp katru lasījumu vai rakstījumu. -Q n Norādīt sekunžu skaitu, ko TCP klients vai serveris pauzē pēc EOF saņemšanas no otra komunikācijas gala, bet pirms sava konekcijas gala slēgšanas. -R n Uzstādīt soketa saņemšanas buferi (soketa opcija SO_RCVBUF) uz n. Tas var tieši iespaidot saņemšanas loga izmēru, ko izziņo TCP. Lietojot ar UDP tas norāda lielāko UDP datagrammu, ko var saņemt. -S n Uzstādīt soketa nosūtīšanas buferi (soketa opcija SO_SNDBUF) uz n. Ar UDP tas norāda lielāko UDP datagrammu, ko var nosūtīt. -U n Nonākt TCP neatliekamajā režīmā pēc rakstījuma skaitļa n tīklā. Lai uzsāktu neatliekamo režīmu, tiek rakstīts viens datu baits (20.08.nodaļa).