Pielikums C: sock programma

Last modified by Valdis Vītoliņš on 2018/01/15 21:44

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:

  1. 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ā.
#pic("f_C_1.gif", "300") C.1. attēls: Mums jānorāda servisa mitekļa vārds un servisa vārds, kuram pieslēgties. Mitekli var norādīt punktētajā decimālpierakstā un servisu var izteikt kā porta numuru - t.i. veselu skaitli. Pieslēdzoties standartajam sun % sock bsdi echo
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
  1. Interaktīvs serveris: jānorāda opcija sun % sock -s 5555 act as server listening on port 5555
Šī programma gaida uz klienta pieslēgumu un tad kopē standartievadi uz klientu un kopē visu, kas saņemts no klienta uz standartizvadi. Interneta adresi var norādīt komandrindā pirms porta numura, lai norādītu, uz kura lokālā interfeisa tiek pieņemtas konekcijas:
sun % sock -s 140.252.13.33 5555 accept connections only on Ethernet
Noklusētais režīms ir pieņemt savienojuma pieprasījumu uz jebkura lokālā interfeisa.
  1. Avoita klients: jānorāda opcija sun % sock -i -n12 -w4096 bsdi discard
raksta 12 buferus, no kuriem katrs satur 4096 datu baitus uz
  1. 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).