Pielikums C: sock programma

Pēdējais mainījis Administrator 2011-06-06 17:16

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: sock noklusētā darbība - interaktīvs klients.
    Mums jānorāda #term("servisa mitekļa", "server_host") vārds un servisa vārds, kuram pieslēgties. Mitekli var norādīt #term("punktētajā decimālpierakstā", "dotted_decimal_notation") un servisu var izteikt kā porta numuru - t.i. veselu skaitli. #term("Pieslēdzoties", "connect") standartajam echo serverim 1.12.nodaļa no sun uz bsdi atbalso visu, ko mēs drukājam:
    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
  2. Interaktīvs serveris: jānorāda opcija -s. Jānorāda arī servisa vārds (vai porta numurs):
    sun % sock -s 5555 	act as server listening on port 5555
    Šī programma gaida uz klienta #term("pieslēgumu", "connection") un tad kopē #term("standartievadi", "standard_input") uz klientu un kopē visu, kas saņemts no klienta uz #term("standartizvadi", "standard_output"). 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 #term("režīms", "mode") ir pieņemt savienojuma pieprasījumu uz jebkura lokālā interfeisa.
  3. Avoita klients: jānorāda opcija -i. Pēc noklusēšanas 1024-baitu buferi uzraksta tīklā 1024 reizes. Opcijas -n un -w var izmainīt šīs noklusētās vērtības. Piemēram,
    sun % sock -i -n12 -w4096 bsdi discard
    raksta 12 buferus, no kuriem katrs satur 4096 datu baitus uz discard serveri miteklī bsdi.
  4. #term("Ietekas", "sink") serveris: jānorāda opcijas -i un -s. Datus lasa no tīkla un izdzēš. Lai gan šie piemēri izmanto TCP (noklusētais), opcija -u norāda uz UDP. Ir milzumdaudz opciju, kuras dod smalkāku kontroli par to, kā īsti šī programma strādā. Šīs opcijas ir nepieciešamas lai ģenerētu visus testu piemērus šajā grāmatā.

-b n #term("Piesaistīt", "bind") n kā klienta lokālo porta numuru. (Pēc noklusēšanas klients lieto #term("gaistošu","ephemeral") porta numuru, ko piešķir sistēma.)
-c Pārveidot #term("rindas pārneses", "newline") (NL) simbolus standartievadē par #term("rakstatgriezi", "carriage return") un #term("rindas pārnesi", "newline") (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 #term("galapunktam", "end_point") (11.12.nodaļa?).
-h Implementēt TCP #term("pusslēgšanas", "half_close") funkciju (18.5.nodaļa?). T.i. nebeigt tad, kad standartievadē parādās #term("EOF", "end_of_file"). 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 #term("rakstīšanas", "write") izmēru un -r opcija var norādīt katra #term("nolasījuma", "read") 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 #term("novēlojumu", "delay") 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 #term("nenokārtoto", "pending") 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 #term("nolasījuma", "read") 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 #term("Daudzvārdīgs", "verbose") režīms. Izdrukā papildu ziņas (piemēram klienta un servera gaistošos portu numurus #term("standartkļūdas", "standard_error") plūsmā.
-w n Lietojot kopā ar opciju -i, norāda izmēru katram #term("rakstījumam", "write") tīklā. Noklusētā vērtība ir 1024 baiti uz rakstījumu.
-A #term("Iespējot", "enable") #term("soketa", "socket") 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 #term("multiraidi", "multicasting"), tā ļauj vairākiem procesiem lietot to pašu lokālo portu, lai saņemtu #term("apraides", "broadcast") 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ā #term("kodols", "kernel") 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 #term("adresātu", "destination").
-F Norāda, ka TCP serviss ir #term("daudzpavedienu", "concurrent"). 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 #term("Vilcināšanās laika", "linger_time") (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 #term("atspējotu", "disable") 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 #term("novēlotu", "delay") 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 #term("lasījumu", "read") vai #term("rakstījumu", "write").
-Q n Norādīt sekunžu skaitu, ko TCP klients vai serveris pauzē pēc #term("EOF", "end_of_file") 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 #term("izziņo", "advertise") TCP. Lietojot ar UDP tas norāda lielāko UDP datagrammu, ko var saņemt.
-S n Uzstādīt soketa #term("nosūtīšanas buferi", "send_buffer") (#term("soketa opcija", "socket_option") SO_SNDBUF) uz n. Ar UDP tas norāda lielāko UDP datagrammu, ko var nosūtīt.
-U n Nonākt TCP #term("neatliekamajā režīmā", "urgent_mode") 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?).

Tagi:
Izveidojis Kalvis Apsītis 2008-03-26 22:34
    
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 6.4 - Documentation