Wiki source code of Pielikums C: sock programma

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

Show last authors
1 = Pielikums C: sock programma =
2
3 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.
4
5 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.
6
7 Programma ##sock## darbojas vienā no 4 režīmiem:
8
9 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ā.
10
11 {{velocity filter="none"}}
12 {{html clean="false" wiki="true"}}
13 #pic("f_C_1.gif", "300")
14 //C.1. attēls: ##sock## noklusētā darbība - interaktīvs klients.//
15 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 ##echo## serverim [[~~1.12.nodaļa>>01_12]] no ##sun## uz ##bsdi## atbalso visu, ko mēs drukājam:
16
17 {{code language="none"}}
18 sun % sock bsdi echo
19 a test line we type this line
20 a test line and the echo server returns a copy
21 ^D type our end-of-file character to terminate
22 {{/code}}
23
24 1. Interaktīvs serveris: jānorāda opcija ##-s##. Jānorāda arī servisa vārds (vai porta numurs):
25
26 {{code language="none"}}sun % sock -s 5555 act as server listening on port 5555{{/code}}
27
28 Šī 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:
29
30 {{code language="none"}}sun % sock -s 140.252.13.33 5555 accept connections only on Ethernet{{/code}}
31
32 Noklusētais //režīms// ir pieņemt savienojuma pieprasījumu uz jebkura lokālā interfeisa.
33
34 1. 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,
35
36 {{code language="none"}}sun % sock -i -n12 -w4096 bsdi discard{{/code}}
37
38 raksta 12 buferus, no kuriem katrs satur 4096 datu baitus uz ##discard## serveri miteklī ##bsdi##.
39
40 1. //Ietekas// 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ā.
41 <p/>
42 <table border="1">
43 <col width="125" />
44 <col width="600" />
45 <tr>
46 <td><tt>-b <i>n</i></tt></td>
47 <td>//Piesaistīt// <i>n</i> kā klienta lokālo porta numuru.
48 (Pēc noklusēšanas klients lieto //gaistošu// porta numuru, ko piešķir sistēma.)
49 </td>
50 </tr>
51 <tr>
52 <td><tt>-c</tt></td>
53 <td>Pārveidot //rindas pārneses// (<tt>NL</tt>) 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>>26_04]]), kas rindas beigu apzīmēšanai lieto CR+NL.
54 </td></tr>
55 <tr>
56 <td><tt>-f <i>a.b.c.d.p</i></tt></td>
57 <td>Norādīt svešo IP adresi <i>(a.b.c.d)</i> un svešo porta numuru <i>(p)</i> UDP //galapunktam// ([[11.12.nodaļa>>11_12]]).</td>
58 </tr>
59 <tr>
60 <td><tt>-h</tt></td>
61 <td>Implementēt TCP //pusslēgšanas// funkciju ([[18.5.nodaļa>>18_05]]). 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.
62 </td></tr>
63 <tr><td><tt>-i</tt></td>
64 <td>Iztekas klients vai ietekas serveris. Vai nu rakstīt datus tīklā (pēc noklusēšanas), vai arī, ja to lieto kopā ar <tt>-s</tt> opciju, lasīt datus no tīkla. Opcija <tt>-n</tt> var norādīt buferu skaitu, ko rakstīt (vai lasīt), opcija <tt>-w</tt> var norādīt katras //rakstīšanas// izmēru un <tt>-r</tt> opcija var norādīt katra //nolasījuma// izmēru.
65 </td></tr>
66 <p/>
67 <tr>
68 <td><tt>-n <i>n</i></tt></td>
69 <td>Lietojot kopā ar opciju <tt>-i</tt>, <i>n</i> norāda buferu skaitu, ko lasīt vai rakstīt. Mainīgā <i>n</i> noklusētā vērtība ir 1024.</td>
70 </tr>
71 <tr>
72 <td><tt>-p <i>n</i></tt></td>
73 <td>Norādīt sekunžu skaitu, kas jāpauzē starp katru lasīšanu vai rakstīšanu. To var izmantot ar iztekas klientu (<tt>-i</tt>) vai ietekas serveri (<tt>-is</tt>), lai radītu //novēlojumu// starp katru tīkla lasīšanu vai rakstīšanu. Sk. arī <tt>-P</tt> opciju, lai pauzētu pirms pirmās lasīšanas vai rakstīšanas.</td>
74 </tr>
75 <tr><td><tt>-q <i>n</i></tt></td>
76 <td>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.</td>
77 </tr>
78 <tr><td><tt>-r <i>n</i></tt></td>
79 <td>Ja šo lieto kopā ar opciju <tt>-is</tt>, tad <i>n</i> norāda //nolasījuma// izmēru no tīkla. Noklusētā vērtība ir 1024 baiti uz nolasījumu.</td>
80 </tr>
81 <tr>
82 <td><tt>-s</tt></td>
83 <td>Darboties kā serverim nevis kā klientam.</td>
84 </tr>
85 <tr>
86 <td><tt>-u</tt></td>
87 <td>Lietot nevis TCP, bet UDP.</td>
88 </tr>
89 <tr>
90 <td><tt>-v</tt></td>
91 <td>//Daudzvārdīgs// režīms. Izdrukā papildu ziņas (piemēram klienta un servera gaistošos portu numurus //standartkļūdas// plūsmā.</td>
92 </tr>
93 <tr>
94 <td><tt>-w <i>n</i></tt></td>
95 <td>Lietojot kopā ar opciju <tt>-i</tt>, norāda izmēru katram //rakstījumam// tīklā. Noklusētā vērtība ir 1024 baiti uz rakstījumu.</td>
96 </tr>
97 <tr>
98 <td><tt>-A</tt></td>
99 <td>//Iespējot// //soketa// opciju <tt>SO_REUSEADDR</tt>. 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.</td>
100 </tr>
101 <tr>
102 <td><tt>-B</tt></td>
103 <td>Iespējot soketa opciju <tt>SO_BROADCAST</tt> lai atļautu UDP datagrammām tikt nosūtītām uz apraides IP adresi.
104 </td>
105 </tr>
106 <tr><td><tt>-D</tt></td>
107 <td>Iespējot soketa opciju <tt>SO_DEBUG</tt>. Tā rezultātā //kodols// uzkrāj papildu atkļūdošanas informāciju konkrētajam TCP savienojumam ([[A.6.nodaļa>>App_A_06]]). Šo informāciju vēlāk var izvadīt, lietojot <tt>trpt</tt>(8) programmu.</td>
108 </tr>
109 <tr>
110 <td><tt>-E</tt></td>
111 <td>Iespējot soketa opciju <tt>IP_RECVDSTADDR</tt>, ja implementācija to atbalsta ([[11.12.nodaļa>>11_12]]). Tas ir domāts UDP serveriem, lai drukātu saņemto UDP datagrammu //adresātu//.
112 </td>
113 </tr>
114 <tr>
115 <td><tt>-F</tt></td>
116 <td>Norāda, ka TCP serviss ir //daudzpavedienu//. T.i. serveris izveido jaunu procesu, izmantojot <tt>fork</tt> funkciju katram klienta savienojumam.</td>
117 </tr>
118 <tr>
119 <td><tt>-K</tt></td>
120 <td>Iespējot TCP soketa opciju <tt>SO_KEEPALIVE</tt> ([[23.nodaļa>>23]]).
121 </td>
122 </tr>
123 <tr>
124 <td><tt>-L <i>n</i></tt></td>
125 <td>Uzstāda //Vilcināšanās laika// (soketa opcija <tt>SO_LINGER</tt>) vērtību uz <i>n</i> 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>>18_07]]). 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.</td>
126 </tr>
127 <p/>
128 <tr>
129 <td><tt>-N</tt></td>
130 <td>Uzstāda soketu opciju <tt>TCP_NODELAY</tt>, lai //atspējotu// Nagle algoritmu ([[19.4.nodaļa>>19_04]]).</td>
131 </tr>
132 <p/>
133 <tr><td><tt>-O <i>n</i></tt></td>
134 <td>Norāda sekunžu skaitu, ko TCP serveris pauzē pirms pieņem pirmo klienta savienojumu.
135 </td></tr>
136 <p/>
137 <tr><td><tt>-P <i>n</i></tt></td>
138 <td>Norāda sekunžu skaitu, ko pauzē, pirms pirmā nolasījuma vai rakstījuma. To var izmantot kopā ar ietekas serveri (<tt>-is</tt>), 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 (<tt>-i</tt>), tas rada novēlojumu pēc konekcijas izveidošanas, bet pirms pirmā rakstījuma tīklā. Sk. arī opciju <tt>-p</tt>, lai pauzētu starp katru //lasījumu// vai //rakstījumu//.
139 </td></tr>
140 <p/>
141 <tr>
142 <td><tt>-Q <i>n</i></tt></td>
143 <td>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.</td>
144 </tr>
145 <p/>
146 <tr><td><tt>-R <i>n</i></tt></td>
147 <td>Uzstādīt soketa saņemšanas buferi (soketa opcija <tt>SO_RCVBUF</tt>) uz <i>n</i>. 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.</td>
148 </tr>
149 <p/>
150 <tr>
151 <td><tt>-S <i>n</i></tt></td>
152 <td>Uzstādīt soketa //nosūtīšanas buferi// (//soketa opcija// <tt>SO_SNDBUF</tt>) uz <i>n</i>. Ar UDP tas norāda lielāko UDP datagrammu, ko var nosūtīt.
153 </td></tr>
154 <p/>
155 <tr>
156 <td><tt>-U <i>n</i></tt></td>
157 <td>Nonākt TCP //neatliekamajā režīmā// pēc rakstījuma skaitļa <i>n</i> tīklā. Lai uzsāktu neatliekamo režīmu, tiek rakstīts viens datu baits ([[20.08.nodaļa>>20_08]]).
158 </td>
159 </tr>
160 <p/>
161 </table>
162 {{/html}}
163 {{/velocity}}