ࡱ> 9*  !"#$%&'()+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntryK8PowerPoint Document(/Object1 &FKKOle  T 4@T 4 @`@T 4((OOvv_T 4##FFjjNT 4@@__~~@d 4@T 4TTOOt 4T/|/,% \((?[{???'???%??????????????????????!%),.:;?]}????????????????GG G 08 e|idG #&8 e|i &&#TNPP0D z & TNPP &&TNPP  e8   D-- &7 dub.  -- D<       &s[J & &$TNPPMicrosoft PowerPoint & TNPPP & &TNPP  a.@@ @@@@@```Pp@@@45&W&W&$W&O<--- s $4G4 & &${&i0-$ #i f.0. & &i@-$ " wi & &:s-$ ">0Teqsq_eX:> & &'-$ "N $%'%K &  &  & &wG& 2G& 2G& 2G&=5-N$%RLE@==@E N\"f(s,-,(" dda]X & &Vu--vV &  & &*%&kFS--SFk & &ds---&$dsrs~~wrlhgd & &di```---$rsdsdiris~ & &d^{---$ridid^r^is & &dSq```---$r^q^d^dSrS^i & &dNf---$rSdSkNNS^ &  &  & &*#&d--@@@-<$df}izlyrvyuuuuvyz{ |vrmh f d & &nv{--{-nn--' &  & &N+5-- $N+N--+ &  & &w;&/&$3---$ N++NN::$$::N & &w--,w-Y--' &  & &w;&+--$ N+M$L+ & &M+--- $i+Mw+ &  &  &  &  & &&#Zq---&$Z3Ni5`PJU U<h# & &--%p;  & &Z k& ---$Ti =Keew .U e7$(7XFZis/GUMy/~g2B-q_@Ko8E(.dw5 =V~zb="&X+VG & &C--V$) .U b3#'6UEYhp~-FSKv-|e0@+o\>Jn7C & &-$ .I aQ}s]T<# &  & & --%Uf =Heat .U c4$(7UFZip+GSMu+|g0B-n\<Kl8A(,dw5 9S~wb=""U'T~Df & &7&=^---|$<=S^_RJEdDSD?E)JR]pxe^_'bFjjx)Ei+Tr~p ` S8 qp[c9R  & &R$p---f$1c9.ooGM,$$'<Tu}uoXSRj uDcq|lD$&Gd}9n & &D:v&@ ---d$0 _   zupg^ Y JA7 )   & & ---2$ & & --:$Zs{xricUI>2'  & &bXwk& C--C -vj--' & &Q--Q-~w --' &  & &Xk&---v{--' & &---~ --' &  & &{@ --${'{ &  & &e&bP--- $iomhcbbflotyzx & &c-- $m1tBqRjcdtc~chnwtgyO~>-} &  & &Sw---$ Sm|xyxxwhy & &>G& \ --% 2M^o.GT & &jGV&GVi%GVh_a^ZY & &/l|% /tNn_luqrrnor &  & &]%]ahnw~ & &d %dw & &sb&Yw-- $ 6Zjrtwvymi\^LY=Y- & &Z-- % 7\ltvyx{qj^_MZ>Z0 &  &  &  & &Ll&R---($#?G6%g =Jedv .U222Zu C4Ug &  &  & &VS&Vo&+<---l$4>44X PmS7 lTA++/; V{lVB2Nq q@^[P{B;&3G]w^+4 & &B;@---D$  9g{jFn:t3Z3ZfDnxh,g:D & &E&?3&T--% Tqm & & % & &*% *GL;L`LLdwF &  & &3E&4% , 7Yo & &h,(%$'Jp 8Rwdrrih & &8--8-8--' &  &  &  & &Sg&--$@&R|w"2E[m}[*zxcBM 'kB"'Pj  8Pj~+6;> 6g~ & &:P---$?:M`;= HV-_"' =R`k"s+x7xGvUqucyubR>0~zVsEH'|hYH3%~nd[RJ & &|P&|)&)&Im---mI & &\~@@---~\ & &hq--rh &  & &|&UB--BU & &d$@@---$d & & nw--xn &  &  & &P&&ON--% XOORV XTT'X7kF{ & &h%~%hnv vuq & &@"% $/6 8 &  & &P& =% 58&k & &&a2 %Y7,!&* &  &  &  &  & &[&=Ch--->$`MH GEA@>=%=)=,=0>2@6C9G:I;O:U9X6[1],_%_\ZZZ[ & &.j-->$bTROMIFCA=;86310...0158=AFKQX & &<K--L$$C9,"  "*-12 4 4410- *!&"!#%%# #%&*-26< & &X--L$$|sib^ZYXXXZ\^bfjoty &  &  & &u!&cWL---J$#cl_XTW_uzz!u%l$_!H  !*3x:d@YD>) & &&t)-- %!~t & &  % & & % &  &  &  & &TNPP & --'--'&--&TNPP &pT 4  @@``@TOO @. d 4@h`@) T 4''NNtt^ T 4,,WWo L <ArialNew RomanL <Times New RomanL <Times New RomanL <Times New RomanL <"ArialNew RomanL <"ArialNew RomanL <Monotype SortsL <1Courier NewtsL <1Courier NewtsL <Courier (W1)s $3eQ33* D0#T(Q?(Q(Q(Q(Qw,ddddddddddD0T?wU,lKdddddddddD0T ?    w,dddddddddd   ( 8`t:D$42dd35//0011e N@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 % ($X   8 #e$#00X    51</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D 8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V  (@`  8:~$0z& &5TCP/IP Programming Seminar</,//0 X0H040dd(111   (  8:$0y42dd3w5 </,// X0H040dd(111  (% 8:$0Jio5Geoff Bryant Jeff Schreiber</,// 00 40dd40dd(111  (o 8:$05i|(5bryant@process.com schreiber@process.com</,/(/ 0040dd40dd(11(1  (* p 8 :$0G S151997-1999 Process Software Portions 1996 Opus1</,/1/ 0040dd40dd(1111 6 (@  8:v$0- 5DECUS Ireland - 99</,//,33 X0H040dd(111  (P@  8:$0m st 5Tuesday, 25 May 1999 9:30 - 4:30</,/ /3 0040dd 40dd(11 1f@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 K   (@@  8:#s$#0z]V 5Seminar Outline</,//(Q X0H040dd(111 {   (@  8:$0z-V K5Introduction TCP/IP Network Concepts Socket Programming Library Routines Using $QIOs on VMS Socket Programming for IPv6 TCP/IP Programming Tips</,// 00 40UlKd40UlKd40UlKd40UlKd40UlKd40UlKd40UlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011 = (g 8:}$0KJ%5TCP/IP Protocol Overview </,//,33 X0H040dd(1112@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 C,  (p  8  (p 8 Q   (@@  8:#y$#0z]V !5The OSI Network Model</,//(Q X0H040dd(111 ( (  (_  8  (_  8  (_j 8  (_j 8  (_ 8  (_z 8  (_z 8 , (X 8 l$0L5Physical</,// X0H040dd(111 - (bA 8 m$0M 5Data Link</,/ / X0H0 40dd(11 1 + ( 8 k$05Network</,// X0H040dd(111 - (bf 8 m$0Z 5Transport</,/ / X0H0 40dd(11 1 + (Q 8 k$0] 5Session</,// X0H040dd(111 0 (2 8 p$0Py 5Presentation</,/ / X0H0 40dd(11 1 / (b"^ 8 o$0.@ 5Application</,/ / X0H0 40dd(11 1  (  8 z     8 z    8 z j j  8 z    8 z   8 z z z  8 K (aB& 8 $0m$3'5Transmission of binary data of a medium</,/'/ X0H0'40dd(11'1 a (  8 $0 I=5Transfer of units of information, framing, and error checking</,/=/ X0H0=40dd(11=1 ^ (j  8 $0"L zF:5Delivery of packets of information, which includes routing</,/:/ X0H0:40dd(11:1 ] (q 6 8 $06} *E95Provision for end-to-end reliable and unreliable delivery</,/9/ X0H0940dd(1191 M (t! 8 $0-5)5Establishment and maintenance of sessions</,/)/ X0H0)40dd(11)1 B (1 8 $0O*5Data formatting and encryption</,// X0H040dd(111  (4 d 8 $0R XA5Network applications such as file transfer and terminal emulation</,/A/ 00840dd 40dd(11A15@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 % ($X   8 #e$#00X    57</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 +    (`t 8t:D$0242dd3w5//0011  ( R4 8t:D$0bw]42dd3w5//0011 7 (G 8:w$0!<"5Network Controllers</,// X0H040dd(111    (]Qq 8t:D$0v/\42dd3w5//0011  (1F 8t:D$0_;!42dd3w5//0011 = (  8:}$0%5Network Protocols/Drivers</,// X0H040dd(111  (p  8  (p 8 V   (@@  8:#~$#0z]V &5The TCP/IP Protocol Layers</,//(Q X0H040dd(111  (w, 8 ' (W 8:g$0 |lb5TCP</,// X0H040dd(111 ' (OW3 8:g$0|b5UDP</,// X0H040dd(111 - (RA 8:m$0!6 5IP (ICMP)</,/ / X0H0 40dd(11 1 z   8 E (  8:$0 &-!5Ethernet or other physical medium</,/!/ X0H0!40dd(11!1 z   ,  8 z  ~   8 z 1  8 z y  8 z =y=  8 ' (s 8:g$0{5FTP</,// X0H040dd(111 * (D 8:j$0{5Telnet</,// X0H040dd(111 ( (, 8:h$0 {5Ping</,// X0H040dd(111 ' (. 8:g$0 {5NFS</,// X0H040dd(111 z 55Q  8 z Q  8 z ``  8 z ppP  8 . (  8:n$0Lj{ 5Traceroute</,/ / X0H0 40dd(11 1 z @@P  8+@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 %  (p  8  (p 8 Q   (@@  8:#y$#0z]V !5TCP/IP Network Layers</,//(Q X0H040dd(111  (_  8  (_  8  (_j 8  (_j 8  (_ 8  (_z 8  (_z 8 , (X 8 l$0L5Physical</,// X0H040dd(111 - (bA 8 m$0M 5Data Link</,/ / X0H0 40dd(11 1 + ( 8 k$05Network</,// X0H040dd(111 - (bf 8 m$0Z 5Transport</,/ / X0H0 40dd(11 1 + (Q 8 k$0] 5Session</,// X0H040dd(111 0 (2 8 p$0Py 5Presentation</,/ / X0H0 40dd(11 1 / (b"^ 8 o$0.@ 5Application</,/ / X0H0 40dd(11 1  (  8 z     8 z    8 z j j  8 z    8 K (A  8 $0.Mb 3'5Transmission of binary data of a medium</,/'/ X0H0'40dd(11'1 ' (  8 g$0b 5ARP</,// X0H040dd(111 & ( f 8 f$0"b Z5IP</,// X0H040dd(111 / (QP  8 o$06]2  5TCP and UDP</,/ / X0H0 40dd(11 1  (4 d 8 $0R XA5Network applications such as file transfer and terminal emulation</,/A/ 00840dd 40dd(11A1*K@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 % ($X   8 #e$#00X    59</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 @  (p  8  (p 8 M   (@@  8:#u$#0z]V 5Protocol Layering</,//(Q X0H040dd(111    (  88:$0-5Each layer adds information as data is passed down to lower layers Added information almost always added as header Each layer removes its information as data is passed up to higher layers//C/ 1/ H/ 00C40UlKd140ddH40UlKd(111 4 (  8Q:t$0`< 5Application Data</,// X0H040dd(111 4 (O O 8Q:t$0` 5Application Data</,// X0H040dd(111 4 (  8Q:t$0` b5Application Data</,// X0H040dd(111 4 (  8Q:t$0`+ 5Application Data</,// X0H040dd(111 4 (. . 8Q:t$0`k 5Application Data</,// X0H040dd(111 4 (~ ~ 8Q:t$0` A5Application Data</,// X0H040dd(111 4 (  8Q:t$0`  5Application Data</,// X0H040dd(111 4 (  8Q:t$0`[ 5Application Data</,// X0H040dd(111 ' (OO 8Q:g$05TCP</,// X0H040dd(111   ' ( 8Q:g$0b5TCP</,// X0H040dd(111 & (f 8Q:f$0*b5IP</,// X0H040dd(111   ' ( 8Q:g$0+5TCP</,// X0H040dd(111 & (f 8Q:f$0+*5IP</,// X0H040dd(111 + (&u 8Q:k$0+5Network</,// X0H040dd(111   ' (.. 8Q:g$0k5TCP</,// X0H040dd(111 & (f.. 8Q:f$0k*5IP</,// X0H040dd(111 + (&.u. 8Q:k$0k5Network</,// X0H040dd(111   ' (~~ 8Q:g$0A5TCP</,// X0H040dd(111 & (f~~ 8Q:f$0*A5IP</,// X0H040dd(111 ' ( 8Q:g$0 5TCP</,// X0H040dd(111 z    8 z `  8 z Q  8 z   8 z   8 z @  8 z 1  8 z   8 z 0  8 4 (V 8:t$0 5Physical network</,// X0H040dd(111 0 (&OA 8:p$0`l 5Sending Data</,/ / X0H0 40dd(11 1 2 (& 8:r$0`X5Receiving Data</,// X0H040dd(1115 @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   510</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D    (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 +    (`6tf 8t:D$0[2A42dd3w5//0011  ( 4+ 8t:D$0b 42dd3w5//0011 = ( 8:}$0!%5Network Protocols/Drivers</,// X0H040dd(111  (p  8  (p 8 V   (@@  8:#~$#0z]V &5The TCP/IP Protocol Layers</,//(Q X0H040dd(111  (w, 8 ' (W 8:g$0 |lb5TCP</,// X0H040dd(111 ' (OW3 8:g$0|b5UDP</,// X0H040dd(111 - (RA 8:m$0!6 5IP (ICMP)</,/ / X0H0 40dd(11 1 z   8 E (  8:$0 &-!5Ethernet or other physical medium</,/!/ X0H0!40dd(11!1 z   ,  8 z  ~   8 z 1  8 z y  8 z =y=  8 ' (s 8:g$0{5FTP</,// X0H040dd(111 * (D 8:j$0{5Telnet</,// X0H040dd(111 ( (, 8:h$0 {5Ping</,// X0H040dd(111 ' (. 8:g$0 {5NFS</,// X0H040dd(111 z 55Q  8 z Q  8 z `Z  8 z ppP  8 . (  8:n$0Lj{ 5Traceroute</,/ / X0H0 40dd(11 1 z @@P  8    (`t 8t:D$0242dd3w5//0011  ( R4 8t:D$0bw]42dd3w5//0011 7 (G 8:w$0!<"5Network Controllers</,// X0H040dd(111I @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   511</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D    (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 M   (@@  8:#u$#0z]V 5Network Protocols</,//(Q X0H040dd(111 v   (@  8:$0z-V F65Responsible for sending and receiving IP datagrams over local network Responsible for mapping internet addresses into physical addresses Ethernet/FDDI use Address Resolution Protocol (ARP) Internet address mapped is for the next hop the datagram will visit - might not be ultimate destination for the datagramh/X// / 00 0F40UlKdD40UlKd440ddx40dd(11615 @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   513</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D    (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 +  (p  8  (p 8 V   (@@  8:#~$#0z]V &5The TCP/IP Protocol Layers</,//(Q X0H040dd(111  (w, 8 ' (W 8:g$0 |lb5TCP</,// X0H040dd(111 ' (OW3 8:g$0|b5UDP</,// X0H040dd(111 - (RA 8:m$0!6 5IP (ICMP)</,/ / X0H0 40dd(11 1 z   8 E (  8:$0 &-!5Ethernet or other physical medium</,/!/ X0H0!40dd(11!1 z   ,  8 z  ~   8 z 1  8 z y  8 z =y=  8 ' (s 8:g$0{5FTP</,// X0H040dd(111 * (D 8:j$0{5Telnet</,// X0H040dd(111 ( (, 8:h$0 {5Ping</,// X0H040dd(111 ' (. 8:g$0 {5NFS</,// X0H040dd(111 z 55Q  8 z Q  8 z `Z:  8 z ppP  8 . (  8:n$0Lj{ 5Traceroute</,/ / X0H0 40dd(11 1 z @@P  8    (`t 8t:D$0242dd3w5//0011  ( R4 8t:D$0bw]42dd3w5//0011 7 (G 8:w$0!<"5Network Controllers</,// X0H040dd(111    (]Qq 8t:D$0v/\42dd3w5//0011  (1F 8t:D$0_;!42dd3w5//0011 = (  8:}$0%5Network Protocols/Drivers</,// X0H040dd(111 @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   512</,//  X0H040dd(111       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ (vX  8  (v 8   (C; 8D    (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 R   (@@  8:#z$#0z]V "5IP - Internet Protocol</,//(Q X0H040dd(111 @   (@  8:h$0z-V 5Connectionless datagram service Performs: Routing Fragmentation/Reassembly Unreliable: Does not perform Flow Control Sequence Control Duplicate Avoidance Error Recovery High Performance and Low Overhead//*/ !/ / A/ !/ 00 40UlKd 40UlKd40dd40dd40UlKd 40dd40dd40dd40dd!40UlKd(111 @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   514</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D    (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 9   (p  8  (p 8 N   (@@  8:#v$#0z]V 5Internet Addresses</,//(Q X0H040dd(111    (   8:$0Z- {5Uniquely identifies an interface within a network Syntax: a.b.c.d (x:y::z and ::a.b.c.d for IPv6) 32 bit number (128 bits for IPv6) Network number (used for routing) Host number In classfull routing, host bits can used for subnet Address classes A: 1.h.h.h through 127.h.h.h, Network Mask: 255.0.0.0 B: 128.0.h.h through 191.255.h.h, Network Mask: 255.255.0.0 C: 192.0.0.h through 223.255.255.h, Network Mask: 255.255.255.0 D,E: 224.0.0.0 and higher (multicast and reserved)/// d/ / / / (00240UlKd040UlKd"40UlKd"40dd 40dd640dd40UlKdC40ddA40ddA40dd240dd(111J@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   515</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 Y@  (p  8  (p 8 G   (@@  8:#o$#0z]V  5IP Datagram</,/ /(Q X0H0 40dd(11 1 ( (@ 8:h$0"eN5Vers</,// X0H040dd(111 ' (@@ 8:g$0e5Len</,// X0H040dd(111 ' (@@p 8:g$0e.5TOS</,// X0H040dd(111 0 (p@ 8:p$0e 5Total Length</,/ / X0H0 40dd(11 1 2 (p 8:r$0"%.5Identification</,// X0H040dd(111 ) (p  8:i$0%5Flags</,// X0H040dd(111 3 (  8:s$0b%5Fragment Offset</,// X0H040dd(111 ' (@ 8:g$0"[5TTL</,// X0H040dd(111 , (@p 8:l$0.[5Protocol</,// X0H040dd(111 3 (p 8:s$0[5Header Checksum</,// X0H040dd(111 ; (@ 8:{$0"#5Source Internet Address</,// X0H040dd(111 @ (@ 8:$0"e(5Destination Internet Address</,// X0H040dd(111 . ( 8:n$0"% 5Options...</,/ / X0H0 40dd(11 1 + ( 8:k$0%5Padding</,// X0H040dd(111 + ( 8:k$0"[5Data...</,// X0H040dd(111 % (YO 8:e$02 50</,// X0H040dd(111 % (W O 8:e$02 54</,// X0H040dd(111 % (O 8:e$0A2 58</,// X0H040dd(111 & (O 8:f$0A2516</,// X0H040dd(111 & (O 8:f$0m2519</,// X0H040dd(111 & (O 8:f$0M2524</,// X0H040dd(111 & (6'O 8:f$0p2531</,// X0H040dd(111     ( 8:$0A 42dd3w5Field Purpose Vers IP version number Len Length of IP header (4 octet units) TOS Type of Service T. Length Length of entire datagram (octets) Ident IP datagram ID (for frag/reassembly) Flags Dont/More fragments Frag Off Fragment Offset h/X/ / / P0@040dd40dd(40dd40dd.40dd+40dd40dd40dd(111  (1  8(:$0   42dd3w5Field Purpose TTL Time To Live - Max # of hops Protocol Higher level protocol (1=ICMP, 6=TCP, 17=UDP) Checksum Checksum for the IP header Source IA Originators Internet Address Dest IA Final Destination Internet Address Options Source route, timestamp, etc. h/X// / P0@040dd!40dd(40dd40dd$40dd(40dd+40dd&40dd(111'@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   516</,//  X0H040dd(111  (vX  8  (v 8   (C; 800D   (*  8t=D$Ĥ0l  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 x  (p  8  (p 8 N   (@@  8:#v$#0z]V 5Network-Byte Order</,//(Q X0H040dd(111    (@  8:$0z-S5Big-Endian & Little-Endian Network: Big VAX, Alpha, Intel: Little Integer Conversion: htons: Host-to-Net (short) htonl: Host-to-Net (long) ntohs: Net-to-Host (short) ntohl: Net-to-Host (long) IP Address TCP & UDP Port  /// '/ / / / / / / / / / / 0040UlKd 40dd40dd40UlKd40dd40dd40dd40dd 40UlKd40UlKd(111 W  3  ( 81:$0n 5Low 00000000</,/ / 0040dd40dd40dd(11 1  ( 82:$05High 00000010</,// 0040dd40dd40dd(111  (p 89: $0nK5High 00000010 Byte #N</,// 0040dd 40dd40dd(111  (p 8:: $0K5Low 00000000 Byte #N+1</,// 0040dd 40dd 40dd(111  ( 8ff  (6% k 8:$0pB Ni5Big-Endian Byte Order</,// 00 40dd 40dd(111  (6  8:$0p l5Little-Endian Byte Order</,// 0040dd 40dd(111 z @  8 z !@  85@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   517</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 +  (p  8  (p 8 V   (@@  8:#~$#0z]V &5The TCP/IP Protocol Layers</,//(Q X0H040dd(111 ' (W 8:g$0 |lb5TCP</,// X0H040dd(111  (w, 8 ' (OW3 8:g$0|b5UDP</,// X0H040dd(111 - (RA 8:m$0!6 5IP (ICMP)</,/ / X0H0 40dd(11 1 z   8 E (  8:$0 &-!5Ethernet or other physical medium</,/!/ X0H0!40dd(11!1 z   ,  8 z  ~   8 z 1  8 z y  8 z =y=  8 ' (s 8:g$0{5FTP</,// X0H040dd(111 * (D 8:j$0{5Telnet</,// X0H040dd(111 ( (, 8:h$0 {5Ping</,// X0H040dd(111 ' (. 8:g$0 {5NFS</,// X0H040dd(111 z 55Q  8 z Q  8 z `Z:  8 z ppP  8 . (  8:n$0Lj{ 5Traceroute</,/ / X0H0 40dd(11 1 z @@P  8    (`t 8t:D$0242dd3w5//0011  ( R4 8t:D$0bw]42dd3w5//0011 7 (G 8:w$0!<"5Network Controllers</,// X0H040dd(111    (]Qq 8t:D$0v/\42dd3w5//0011  (1F 8t:D$0_;!42dd3w5//0011 = (  8:}$0%5Network Protocols/Drivers</,// X0H040dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   518</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 r   (p  8  (p 8 X   (@@  8:#$#0z]V (5UDP - User Datagram Protocol</,// Q X0H040dd(111    (  82:$0-v 5Connectionless unreliable datagram service Adds port concept to identify peer application Datagrams may be lost, out of order, or duplicated Very low overhead Used by applications such as TFTP, DNS, RPC Best for simple transaction oriented requests Advantages over using IP directly Can address individual applications via well-known ports Checksums (pseudo IP header, UDP header, Data)//+/ t/ ,/ ./ "/ g/ 00+40UlKd/40dd340dd40dd,40UlKd.40dd"40UlKd940dd.40dd(111&$@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   519</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 H   (@@  8:#p$#0z]V  5UDP Datagram</,/ /(Q X0H0 40dd(11 1 4 (00 8:t$0U5Destination Port</,// X0H040dd(111 / (0 8:o$0RU^ 5Source Port</,/ / X0H0 40dd(11 1 5 (0p 8:u$0RK5Application data</,// X0H040dd(111 % (? 8:e$0O" 50</,// X0H040dd(111 & (7(? 8:f$0q"516</,// X0H040dd(111 & (fW? 8:f$0"531</,// X0H040dd(111 , (0 8:l$05Checksum</,// X0H040dd(111 * ( 8:j$0R^5Length</,// X0H040dd(111 y ( 8:$0![a 5Field Purpose Source Port 16-bit port number identifying originating application Destination Port 16-bit port number identifying destination application Length Length of UDP datagram (UDP header + data) Checksum Checksum of IP pseudo header, UDP header, and datah/X// / x0h040ddC40ddH40dd340dd<40dd(11 15@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   520</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 +  (p  8  (p 8 V   (@@  8:#~$#0z]V &5The TCP/IP Protocol Layers</,//(Q X0H040dd(111 ' (W 8:g$0 |lb5TCP</,// X0H040dd(111  (w, 8 ' (OW3 8:g$0|b5UDP</,// X0H040dd(111 - (RA 8:m$0!6 5IP (ICMP)</,/ / X0H0 40dd(11 1 z   8 E (  8:$0 &-!5Ethernet or other physical medium</,/!/ X0H0!40dd(11!1 z   ,  8 z  ~   8 z 1  8 z y  8 z =y=  8 ' (s 8:g$0{5FTP</,// X0H040dd(111 * (D 8:j$0{5Telnet</,// X0H040dd(111 ( (, 8:h$0 {5Ping</,// X0H040dd(111 ' (. 8:g$0 {5NFS</,// X0H040dd(111 z 55Q  8 z Q  8 z `Z:  8 z ppP  8 . (  8:n$0Lj{ 5Traceroute</,/ / X0H0 40dd(11 1 z @@P  8    (`t 8t:D$0242dd3w5//0011  ( R4 8t:D$0bw]42dd3w5//0011 7 (G 8:w$0!<"5Network Controllers</,// X0H040dd(111    (]Qq 8t:D$0v/\42dd3w5//0011  (1F 8t:D$0_;!42dd3w5//0011 = (  8:}$0%5Network Protocols/Drivers</,// X0H040dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   521</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 _   (@@  8:#$#0z]V /#5TCP - Transmission Control Protocol</,/#/ Q X0H0#40dd(11#1    (@  8`:0$0z-V P5End-to-end reliable, connection-oriented Byte-stream protocol, not message oriented Data delivered in order with no duplication Flow controlled Full duplex Uses ports to identify individual connections and applications Servers contacted at well-known ports Well-known port numbers assigned by IANA (Internet Assigned Numbers Authority)//)/ s/ ?/ u/ P0@0)40UlKd+40dd,40dd40dd 40dd?40UlKd'40ddN40dd(11P1T@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   522</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 _   (@@  8:#$#0z]V /#5TCP - Transmission Control Protocol</,/#/ Q X0H0#40dd(11#1 o   (  8:$0-F ?5Provides reliability Handles damaged, lost, duplicated, and out of sequence data Uses positive acknowledgments Time-outs indicate negative acknowledgment Each data octet (and SYN and FIN control bits) are assigned a sequence numberh/X// / x0h040UlKd<40dd40dd+40ddM40dd(111U@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   523</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8    (p  8  (p 8    (@@  8:#$#0z]V |5TCP does NOT do Messages///  /$ /  X0H040dd(111 #   ( @ 8{:K$0 #o5TCP is a reliable BYTE STREAM protocol No one-to-one correspondence between send operations and receive operations Number of send operations may NOT be equal to the number of receive operations A receive operation may receive fewer bytes than was sent in a send operation A receive operation may receive data from several sends (more than one message may be received)//'/ L/ / x0h0'40UlKdL40ddO40ddN40dd_40dd(11o1b@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   524</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8    (p  8  (p 8    (@@  8:#$#0z]V |5TCP does NOT do Messages///  /$ /  X0H040dd(111 0   ( @ 8:X$0 #5Your application must implement messages Client/Server need to agree on and implement a message protocol: Messages separated by Messages preceded by byte count length Messages of fixed length Choose TCP for applications which require reliable transmission//)/ A/ _/ ?/ 00)40UlKdA40dd40dd'40dd40dd?40dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   525</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 P   (p  8  (p 8 O   (@@  8:#w$#0z]V 5TCP Connection Flow</,//(Q X0H040dd(111    (  8:$0- M5Server prepares to receive connections (passive open) Creates SOCKET BINDs to well known port Tells TCP layer to LISTEN for connections ACCEPTs incoming connection Client initiates connection (active open) Creates SOCKET CONNECTs to server Data is transmitted and received by client/server Client and Server CLOSE/SHUTDOWN connection//6/ n/ */ "/ ]/ 00640UlKd40dd40dd*40dd40dd*40UlKd40dd40dd240UlKd+40UlKd(11M1n@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   526</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 ?d  (p  8  (p 8 Q   (@@  8:#y$#0z]V !5TCP Connection States</,//(Q X0H040dd(111 * (@`` 8:j$0R5CLOSED</,// X0H040dd(111 z a  8 2 ( 8:r$01`b5BEGIN/socket()</,// X0H040dd(111 * (` 8:j$0R[5LISTEN</,// X0H040dd(111 z P1P  8  (gmU 8:$0,38,5Server Passive Open bind(),listen(),accept()</,/,/ 0040dd40dd(11,1 z a  8 + (_ 8:k$0LB5Close()</,// X0H040dd(111 , (  8:l$0E5SYN SENT</,// X0H040dd(111 z a  8  ( 8:$0Rh5Active Open send SYN</,// 00 40dd40dd(111 z a`  8 z ``  8  (O 8:$0lxy%5Client Active Open connect() send SYN</,/%/ 0040dd40dd(11%1 z 0  8 , (  8:l$0E5SYN RCVD</,// X0H040dd(111 z   8  (XT 8:$0 +7l5 rcv SYN send SYN,ACK</,// 00 40dd 40dd(111 z q  8 z p  8  (X 8:$0h5rcv SYN send SYN,ACK</,// 0040dd 40dd(111 z q` q  8 + (n 8:k$0AQ5rcv RST</,// X0H040dd(111 / (0 8:o$04 5ESTABLISHED</,/ / X0H0 40dd(11 1 z 0PP  8 z P!  8 2 (g# 8:r$0q5rcv ACK of SYN</,// X0H040dd(111 z `!`@  8 z `@@  8  (9 8:$0@h5rcv SYN,ACK send ACK</,// 00 40dd40dd(111 . (  8:n$0E 5FIN WAIT-1</,/ / X0H0 40dd(11 1 . (@` 8:n$0 5FIN WAIT-2</,/ / X0H0 40dd(11 1 . (0P 8:n$0u@  5CLOSE_WAIT</,/ / X0H0 40dd(11 1 + ( 0@ 8:k$0"e5CLOSING</,// X0H040dd(111 - (0`P 8:m$0Ru  5TIME_WAIT</,/ / X0H0 40dd(11 1 , (@` 8:l$05LAST_ACK</,// X0H040dd(111 z !  8 | (^ 8:$0{d5Close() send FIN</,// 0040dd40dd(111 z P!P@  8 + (g. 8:k$0K[5rcv ACK</,// X0H040dd(111 z Q  8 z PPa  8 | (>R 8:$0[gd5rcv FIN send ACK</,// 0040dd40dd(111 z a`   8 z ` `  8 z `  8 z p  8 1 (>@ 8:q$0P[ 5timer ~ 1 min</,/ / X0H0 40dd(11 1 z `  8  (^ 8:$0{h5rcv FIN,ACK send ACK</,// 00 40dd40dd(111 z   8 z    8 | (#$ 8:$0d5rcv FIN send ACK</,// 0040dd40dd(111 z A0  8 + (N 8:k$0@k5rcv ACK</,//       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~X0H040dd(111 z 0@@  8 z A  8 4 (~ 8:t$0a5Close() send FIN</,// X0H040dd(111 z !  8 z    8 | (F> 8:$0[gd5rcv FIN send ACK</,// 0040dd40dd(111 z `Q`@  8  (.ct 8:$0PK)Wg5 Close() send FIN</,// 00 40dd40dd(111 z `   8 + (v  8:k$0;j 5rcv ACK</,// X0H040dd(111 z `  8 + (vS  8:k$0 5Close()</,// X0H040dd(111 z 1Q  8A@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   527</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 7  (p  8  (p 8 G   (@@  8:#o$#0z]V  5TCP Segment</,/ /(Q X0H0 40dd(11 1 4 (p@ 8:t$0e5Destination Port</,// X0H040dd(111 9 ( 8:y$0"[!5Acknowledgment Number</,// X0H040dd(111 . ( 8:n$0"% 5Options...</,/ / X0H0 40dd(11 1 + ( 8:k$0%5Padding</,// X0H040dd(111 + ( 8:k$0"[5Data...</,// X0H040dd(111 % (YO 8:e$02 50</,// X0H040dd(111 % (W O 8:e$02 54</,// X0H040dd(111 & (7(O 8:f$0q2510</,// X0H040dd(111 & (O 8:f$0A2516</,// X0H040dd(111 & (O 8:f$0m2519</,// X0H040dd(111 & (O 8:f$0M2524</,// X0H040dd(111 & (6'O 8:f$0p2531</,// X0H040dd(111 / (@p 8:o$0"e. 5Source Port</,/ / X0H0 40dd(11 1 * (p@ 8:j$05Window</,// X0H040dd(111 ' (@ 8:g$0"N5Len</,// X0H040dd(111 3 ( 8:s$0"%5Sequence Number</,// X0H040dd(111 , (@ 8:l$05Reserved</,// X0H040dd(111 ) (p@ 8:i$0.5Flags</,// X0H040dd(111 2 (p@ 8:r$0e5Urgent Pointer</,// X0H040dd(111 , (@p 8:l$0"e.5Checksum</,// X0H040dd(111  (' 8:$0ami55Field Purpose Source Port Identifies originating application Destination Port Identifies destination application Sequence Number Sequence number of first octet in the segment Acknowledgment # Sequence number of the next expected octet (if ACK flag set) Len Length of TCP header in 4 octet units Flags TCP flags: SYN, FIN, RST, PSH, ACK, URG Window Number of octets from ACK that sender will accept Checksum Checksum of IP pseudo-header + TCP header + data Urgent Pointer Pointer to end of urgent data Options Special TCP options such as MSS and Window Scale/// / &/ (0040dd/40dd440dd>40ddN40dd+40dd/40dd:40dd;40dd/40dd940dd(1151@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   528</,//  X0H040dd(111  (vX  8  (v 8   (C; 800D   (*  8t=D$Ĥ0l  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 P   (@@  8:#x$#0z]V  5Why Client/Server?</,//(Q X0H040dd(111    (@  8^:.$0z-V ~5Rendezvous... Can you imagine the difficulty of two programs starting simultaneously on two different hosts so they can talk together? With several millisecond-long execution times, synchronizing each one at their (respective) correct execution sequence is a tricky job! Client/Server One side starts and waits for the other side to contact it Server waits; Client initiatesh/X// p/ x0h040UlKd{40dd40dd40dd_40dd(11~1 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011 7 (+g 8:w$0J5Socket Programming </,//,33 X0H040dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   530</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 T   (@@  8:#|$#0z]V $5Berkeley Socket History </,//(Q X0H040dd(111 E   (@  8:m$0z-V 5Documented in such books as Stevens Unix Network Programming Comers Internetworking with TCP/IP, vol III First provided with Berkeley Software Distribution (BSD 4.1c) Unix for the VAX Popularized in the 1986 4.3BSD releaseD/4// / / / $/ / u/ x0h040UlKd"40dd-40ddO40UlKd&40UlKd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   531</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 T   (@@  8:#|$#0z]V $5Other Programming Models</,//(Q X0H040dd(111    (@  8T:$$0z-V 5Socket model is widely used mainly due to wide implementation of BSD networking kernel Available for Unix, Windows, VMS, ... Other models may be used in different environments STREAMS model (UNIX System V) Others/// a/ 3/ $/ 0040UlKd;40dd&40dd340UlKd40dd40dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   532</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 t  (p  8  (p 8 T   (@@  8:#|$#0z]V $5Socket Paradigm Overview</,//(Q X0H040dd(111    (@  88:$0z-V 5A socket is a communications endpoint In BSD networking, it is a data structure within the kernel A socket is named by its socket address A connection is represented by two communicating socketsD/4// / u/ / / / ,/ 00 0&40UlKd<40UlKd*40UlKd840UlKd(111 @ p,0% v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   533</,//  X0H040dd(111  (vX  8  (v 8   (C; 800D    (*  8t=D$Ĥ0l  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5BSD Socket Data Structures</,//(Q X0H040dd(111    (@  8e:5$0z4V =5sockaddr_in structure Used in calls to name a communication endpoint Defined in in.h include file: sin_family is AF_INET sin_port is the port number (network byte order) sin_addr is the internet address (network byte order) htons, ntons, htonl, ntohl routines for endianess conversion Always use these for portability// / / :/ / / / / / / / )/ / ./ / / / / / / / #/ / P0@040UlKd/40dd40dd40dd140dd640dd=40dd 40dd(11=1  (`  800z:J$0 65struct in_addr { unsigned long s_addr; }; struct sockaddr_in { /* struct to hold an address */ short sin_family; /* type of address: MB AF_INET */ unsigned short sin_port; /* protocol port number */ struct in_addr sin_addr; /* IP address (sometimes u_long) */ char sin_zero[8]; /* unused, MBZ */ };</,/6/ 0040dd40dd640dd740dd540dd@40dd'40dd(1161!@ p,0%!v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   534</,//  X0H040dd(111  (vX  8  (v 8   (C; 800D!   (*  8t=D$Ĥ0l  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5BSD Socket Data Structures</,//(Q X0H040dd(111 8    (@  8 :` $0zV  5hostent structure Used when looking up hosts by name or address gethostbyname() to obtain internet address gethostbyaddr() to obtain host name Defined in netdb.h include file servent structure Used when looking up services by name or port getservbyname() to obtain the service port getservbyport() to obtain the service name Defined in netdb.h include file Include files netdb.h inet.h socket.h in.h/x// / ./ / / / / / / / / / / / ./ / / / / / / / / / / %/ p0`040UlKd.40dd+40dd$40dd 40dd40UlKd.40dd+40dd+40dd 40dd40UlKd%40dd(1118"@ p,0%"v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   535</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D"   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5TCP or UDP - Which to Use?</,//(Q X0H040dd(111 \   (@  8:$0zV s,5TCP Connection oriented, reliable byte stream More overhead than UDP UDP Connectionless, unreliable, datagram service Less overhead than TCP Choose TCP for applications which require reliable transmission File transfer (FTP) Virtual terminals (TELNET) Choose UDP for: Simple request/reply applications (DNS) Applications which can tolerate unreliable transmission (Routing protocols such as RIP)p/`// A/ / E/ @/ // / / 0040UlKd*40dd40dd40UlKd-40dd40dd40dd@40UlKd40dd40dd40UlKd(40ddW40dd(111=C#@ p,0%#v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   536</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D#   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 8  (p  8  (p 8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//(Q X0H040dd(111 ]5 95 2 +2+ , (p 8:l$0k5socket()</,// X0H040dd(111  (~> 8  (/ 8 + ( 8:k$05close()</,// X0H040dd(111 + ( 8:k$05write()</,// X0H040dd(111 * (0P 8:j$0U+5read()</,// X0H040dd(111 , ( 8:l$0{5accept()</,// X0H040dd(111 , ( 8:l$05listen()</,// X0H040dd(111 * ( @ 8:j$0E5bind()</,// X0H040dd(111  (1s 8  (&O# 8 - ( 8:m$0"{ 5connect()</,/ / X0H0 40dd(11 1 + (0P 8:k$0"U+5write()</,// X0H040dd(111 * ( 8:j$0"5read()</,// X0H040dd(111 + ( 8:k$0"5close()</,// X0H040dd(111 , ( 8:l$0"5socket()</,// X0H040dd(111 * (7 8:j$0q\5Client</,// X0H040dd(111 z   8 z   8 z pp  8 . (A( 8:n$0^z  5connection</,/ / X0H0 40dd(11 1 2 ({ 8:r$0A5data (request)</,// X0H040dd(111 0 (!g 8:p$Ť0J 5data (reply)</,/ / X0H0 40dd(11 1 z ``  8 z ``0  8 z `Q`  8 z ``  8 z PP  8 z PAP  8 z PP  8 z PP0  8 z PQP  8 z PP  8  ( p.*0 p 8  ( p.*00 p 8  ( p.*0P p 8  ( p.*0 p 8  ( p.*  p 8  ( p.* @ p 8  ( p.*  p 8  ( p.* 0 p 8  ( p.* P p 8  ( p.*  p 8 * (&dq^ 8:j$0`7A5Server</,// X0H040dd(111$@ p,0%$v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   537</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D$   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 2   ( 8:Z$0-s5socket connect send/recv close</,// 00 040UlKd40UlKd 40UlKd40UlKd(111%@ p,0%%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   538</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D%   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 @   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111    (@  8 :$0z-V )5SOCKET() Create a socket sockfd = socket(int family, int type, int protocol) sockfd = file descriptor for created socket family = address family AF_INET (TCP/IP) type = socket type SOCK_STREAM (TCP) SOCK_DGRAM (UDP) protocol Must be zero (for user applications) Specified for SOCK_RAW (IP) socketsp/`/ / D/ D/ / / #/ / H/ p0`0 40UlKd40dd440dd,40dd40dd40dd40dd40dd40dd 40dd%40dd#40dd(11)1&@ p,0%&v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   539</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D&   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 k   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (C{= 8:$0`A j5#include #include main() { int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd <= 0) { perror( socket ); exit(1); } }//G/ */ 5/ 0040dd40dd40dd40dd40dd40dd 40dd40dd*40dd40dd40dd 40dd40dd(111 J   (@  8:r$0z-V 5SOCKET Example</,// X0H040TlKd(111:'@ p,0%'v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   540</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D'   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 e   (@  8:$0z-V 5!5CONNECT() Connect a socket to a remote server connect(int sockfd, struct sockaddr_in *name, int namelen) sockfd = socket file descriptor returned from previous call to socket() name = internet address and port to connect to namelen = length (in bytes) of name structure// / q/ / 00 40UlKd$40dd/40dd40ddH40dd/40dd/40dd(11!1 (@ p,0%(v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   541</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D(  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 P   (@@  8:#x$#0z]V  5Stream (TCP) Client </,//(Q X0H040dd(111  (AP 8:$0{5#include #include main( int argc, char *argv[]) { int sockfd; struct sockaddr_in name; struct hostent *he; /* Create socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* Set up sockaddr structure for the server we want to connect to */ bzero( (char *) &name, sizeof(name) ); name.sin_family = AF_INET; name.sin_port = htons ( 9 ); /* discard service is port 9 *//// )/ o/ </ / 0040dd40dd40dd40dd40dd 40dd40dd40dd40dd40dd+40dd40ddE40dd'40dd40dd@40dd(111    (  @ 8:$0Z #l45CONNECT Example: discard h/X// #/ X0H0440TlKd(11418)@ p,0%)v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   542</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D)  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 O  ( 8 : $0H7 5/* if argv[1] is not an ip address, lookup the name */ If (!inet_aton( argv[1], &name.sin_addr )) { he = gethostbyname( argv[1] ); if ( he != NULL) { /* argv[1] is the hostname */ bcopy ( he->h_addr, (char *)&name.sin_addr, he->h_length ); name.sin_family - he->h_addrtype; } else { fprintf( stderr, unknown hostname: %s\n, argv[1] ); exit(1); } } /* connect to the server */ if (connect( sockfd, &name, sizeof(name) ) < 0 ) { perror(connect); exit(1); } .... send data.... }//7/ ,/ / / =/ B/ / %/ @/  00740dd.40dd 40dd840ddB40dd'40dd 40dd;40dd40dd40dd40dd40dd340dd40dd 40dd40dd40dd40dd(111  (L  8t:D$0i42dd3w5//0011*@ p,0%*v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   543</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D*  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111    (@  8j::$0z-V V5SEND() Send data to remote peer send( int sockfd, char *buffer, int buflen, int flags ) sockfd = socket file descriptor for send buffer = address of buffer with data to send buflen = length (in bytes) of data in buffer flags Special send options Usually zero (no options) MSG_OOB (send Out Of Band data) Can use write() if flags arent needed/// Q/ / O/ &/ (0040UlKd40dd840dd)40dd-40dd-40dd40dd40dd40dd 40dd&40dd(11V1+@ p,0%+v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   544</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D+  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 H   (@  8:p$0zV  5SEND Example</,/ / X0H0 40TlKd(11 1  ($ O 8I : $025#include #include main( int argc, char *argv[]) { int sockfd, num_sent; char buffer[512]; /* create socket */ sockfd = socket( ... ); /* connect to server */ connect(sockfd, ... ); /* send message to server */ strcpy( buffer, Hello there\r\n ); bytes_to_send = strlen( buffer ); num_sent = send( sockfd, &buffer, strlen( buffer ), 0 ); if (num_sent < 0) { ...handle_error }D/4// / / / q/ ,/ ,/ h0X040dd40dd40dd 40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd%40dd"40dd40dd940dd40dd)40dd(111,@ p,0%,v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   545</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D,  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111    (@  8j::$0z-V 5RECV() Receive data from remote peer recv( int sockfd, ch      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ar *buffer, int nbytes, int flags ) sockfd = socket file descriptor to read from buffer = address of buffer to read data into nbytes = number of bytes to read flags = usually zero (no options) MSG_PEEK (peek at incoming data without actually removing it from the incoming byte stream) Others (see vendor documentation) Can use read() if flags arent needed/// V/ / ~/ %/ 0040UlKd40dd840dd-40dd-40dd!40dd#40dd\40dd"40dd%40dd(111-@ p,0%-v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   546</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D-  8.04x$xw&UGGGى  (@ p 8 m  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 i   (` W 8:$0J& :9-5RECV Example (using byte count length method)</,/-/ X0H0-40TlKd(11-1 e ( 8:$01mM42dd3w 5#include #include main( int argc, char *argv[]) { int sockfd, num_read, bytes_to_read; char buffer[512]; /* create socket */ sockfd = socket( ... ); /* connect to server */ connect(sockfd, ... ); /* send data */ send(sockfd, ... ); /// / / / / / H08040dd40dd40dd 40dd%40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd(11 1.@ p,0%.v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   547</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D.  8.04x$xw&UGGGى  (@ p 8 k   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  ( 8L : $0 5/* read message length field */ bytes_to_read = 4; bufptr = &buffer[0]; while ( bytes_to_read > 0 ) { num_read = recv( sockfd, bufptr, bytes_to_read, 0 ); if ( num_read < 0 ) ... handle_error ... bytes_to_read -= num_read; bufptr += num_read; } /* compute length of message body */ bytes_to_read = ntohl( (int)buffer[0] ); /* read body of message */ while ( bytes_to_read > 0 ) { num_read = recv( sockfd, bufptr, bytes_to_read, 0 ); if ( num_read < 0 ) ... handle_error ... bytes_to_read -= num_read; bufptr += num_read; }//r/ (/ / )/ / /  00 40dd40dd40dd40dd640dd*40dd40dd40dd40dd%40dd)40dd40dd40dd640dd*40dd40dd40dd40dd(111f/@ p,0%/v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   548</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D/  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 <   (@  8:d$0zV  \5CLOSE() Close a socket close ( int sockfd ) sockfd = socket file descriptor to close Example/// $/ )/ / x0h040UlKd40dd40dd)40dd40dd(11\1 E (& 8:$0AC-5#include #include main() { int sockfd; struct sockaddr_in name; sockfd = socket ( ... ); /* ... use socket */ close( sockfd ); }//_/ / / / / (0040dd40dd40dd 40dd 40dd40dd40dd40dd40dd40dd40dd(1110@ p,0%0v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   549</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D0   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 ;  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 d   (@  8:$0z-V 45Sample Stream Client DISCARD Client Open connection to discard port on remote host and send data to it Server simply discards all data it receives No data for client to receive/// / / x0h040UlKd40ddC40dd,40dd40dd(111 8 ( 8:x$0a 42dd3w5/* ** DISCARD Protocol Client (RFC 863) */ #include #include #include #include #include #include #include #include </,// (0040dd%40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd(1111@ p,0%1v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   550</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D1  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 $  (^A( 8 :d $0{  42dd3wd5#include #include main(argc, argv) int argc; char *argv[]; { int sock, pktcnt, size, i, n, bytes; int port = 9; struct hostent *he; struct servent *se; struct sockaddr_in name; struct timeb stat_etime, stat_stime, stat_time; float seconds, kbsec; char buffer[32768]; /* ** Parse the command discard <#-sends> [] */ if ((argc < 4) || (argc > 5)) goto usage; if (sscanf(argv[2], %d, &pktcnt) == 0) goto usage; if (sscanf(argv[3], %d, &size) == 0) goto usage; if (size > sizeof(buffer)) exit(0); for (n=0; nh_addr, (char *)&name.sin_addr, he->h_length ); name.sin_family - he->h_addrtype; } else { fprintf( stderr, unknown hostname: %s\n, argv[1] ); exit(1); } } /* parse the service (port number) */ if (argc > 4) { se = getservbyname(argv[4], tcp); if (se == NULL) { sscanf(argv[4], %d, &port); name.sin_port = htons(port); } /// / -/ 00$40dd%40dd40dd.40dd 40dd40ddB40dd'40dd 40dd;40dd40dd40dd40dd40dd'40dd40dd%40dd40dd 40dd 40dd40dd(11:13@ p,0%3v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   552</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D3   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (| 8g :7 $0I_ 42dd3w5 else name.sin_port = se->s_port; } else { se = getservbyname(discard, tcp); if (se == NULL) name.sin_port = htons(port); else name.sin_port = se->s_port; } /* ** 1. Create a stream (TCP) socket */ sock = socket(AF_INET,SOCK_STREAM,0); if (sock <= 0 ) { perror(socket) ; exit(0); } /* ** 2. Open the connection to the server */ if (connect(sock,&name,sizeof(name)) < 0 { perror(connect); exit(0); } printf(Connected to %s,%d. Sending data...\n, argv[1],ntohs(name.sin_port)); bytes = 0; ftime(&stat_stime); /// / b/ $/ / 00&40dd 40dd'40dd.40dd(40dd40dd$40dd40dd&40dd40dd40dd 40dd40dd(40dd40dd+40dd40dd 40ddP40dd 40dd40dd(1114@ p,0%4v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   553</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D4   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 0 (w 8:p$0-V5/* ** 3. Send the data until weve either sent everything or there is an error */ for (i=0; i [port]\n); exit (0) ; }</,// 0040dd40dd40dd40dd440dd=40ddI40dd40ddU40dd 40dd40ddO40dd40dd(111B@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   536</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 g8  (p  8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//(Q X0H040dd(111 ]5 95 2 +2+ , (p 8:l$0k5socket()</,// X0H040dd(111  (~> 8  (/ 8 + ( 8:k$05close()</,// X0H040dd(111 + ( 8:k$05write()</,// X0H040dd(111 * (0P 8:j$0U+5read()</,// X0H040dd(111 , ( 8:l$0{5accept()</,// X0H040dd(111 , ( 8:l$05listen()</,// X0H040dd(111 * ( @ 8:j$0E5bind()</,// X0H040dd(111  (1s 8  (&O# 8 - ( 8:m$0"{ 5connect()</,/ / X0H0 40dd(11 1 + (0P 8:k$0"U+5write()</,// X0H040dd(111 * ( 8:j$0"5read()</,// X0H040dd(111 + ( 8:k$0"5close()</,// X0H040dd(111 , ( 8:l$0"5socket()</,// X0H040dd(111 * (7 8:j$0q\5Client</,// X0H040dd(111 z   8 z   8 z pp  8 . (A( 8:n$0^z  5connection</,/ / X0H0 40dd(11 1 2 ({ 8:r$0A5data (request)</,// X0H040dd(111 0 (!g 8:p$Ť0J 5data (reply)</,/ / X0H0 40dd(11 1 z ``  8 z ``0  8 z `Q`  8 z ``  8 z PP  8 z PAP  8 z PP  8 z PP0  8 z PQP  8 z PP  8  ( p.*0 p 8  ( p.*00 p 8  ( p.*0P p 8  ( p.*0 p 8  ( p.*  p 8  ( p.* @ p 8  ( p.*  p 8  ( p.* 0 p 8  ( p.* P p 8  ( p.*  p 8 * (&dq^ 8:j$0`7A5Server</,// X0H040dd(1116@ p,0%6v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   555</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D6   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 '   (@  8:O$0zV 5socket - discussed above for client bind listen accept recv/send - discussed above for client close - discussed above for client</,// 00%40UlKd40UlKd40UlKd40UlKd'40UlKd$40UlKd(1117@ p,0%7v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   556</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D7   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111    (@  8X:($0z-V d5BIND() Bind a name (internet address and port) to a socket bind( int sockfd, struct sockaddr_in *name, int namelen) sockfd = socket file descriptor from socket call name = internet address and port to bind servers specify internet address = 0 to bind to all addresses (interfaces) for the local host namelen = length (in bytes) of name structure/// u/ Z/ _/ // 0040UlKd440ddA40dd140dd)40dd_40dd/40dd(11d18@ p,0%8v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   557</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D8   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 H   (@  8:p$0zV s 5BIND Example</,/ / X0H0 40TlKd(11 1  (@~ 8 Q  ( 8 : $0;v9 5#include #include main() { int sockfd; struct sockaddr_in name; /* Create socket */ sockfd = socket(...); /* Set up name to bind */ bzero( (char *) &name, sizeof(name) ); name.sin_family = AF_INET; /* TCP/IP family is AF_INET */ name.sin_port = htons ( 65000 ); /* arbitrary non-privileged port */ name.sin_addr.s_addr = 0; /* all local addresses */ /* And do the bind */ bind( sockfd, &name, sizeof(name) ); }//t/ / F/ / "/ "/ %/ / D/ %/ / 0040dd40dd40dd 40dd 40dd40dd40dd40dd40dd40dd40dd'40dd40dd<40ddG40ddE40dd40dd40dd40dd%40dd40dd(1119@ p,0%9v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   558</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D9   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 H   (@  8:p$0z-V L5LISTEN() Put the socket in LISTEN state In LISTEN state, the system queues incoming connections, waiting for the server to accept() them listen( int sockfd, int backlog ) sockfd = socket descriptor from socket() backlog = number of connection requests queued by system while waiting for server to accept() an incoming connection// / / / 00 40UlKd!40ddc40dd"40dd)40ddt40dd(11L1:@ p,0%:v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   559</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D:   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 J   (@  8:r$0z-V 5LISTEN Example</,// X0H040TlKd(111  (^ 8:$0{42dd3w5#include #include main() { int sockfd; struct sockaddr_in name; sockfd = socket(...); ... bind( sockfd, ...); ... if ( listen( sockfd, 5 ) < 0 ) { ... handle_error ... } ... } D/4/`/ / / / / / &/ 0040dd40dd40dd 40dd 40dd40dd40dd40dd40dd40dd40dd40dd!40dd40dd40dd40dd(111(;@ p,0%;v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   560</,//  X0H040dd(111  (vX  8  (v 8   (lD  8t=D$Ĥ0  42dd3 w5//0011   (C; 8D;  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 S   (@  8:{$0z-V #5ACCEPT() Wait for and accept an incoming connection Creates a new socket for the accepted connection (listen socket continues listening) newsockfd = accept( int sockfd, struct sockaddr_in *peername, int peername_len) newsockfd = sockfd for newly accepted socket sockfd = listening socket descriptor peername = socket address of the connected peer process (internet address and port on remote host) peername_len = length (in bytes) of peername structure// / / / P0@0 40UlKd+40ddW40ddQ40dd-40dd%40ddc40dd640dd(111<@ p,0%<v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   561</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D<   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 J   (@  8:r$0zV s5ACCEPT Example</,// X0H040TlKd(111  (g 80 : $0g 5#include #include main() { int sockfd, newsockfd, peername_len; struct sockaddr_in peername; sockfd = socket(...); ... bind( sockfd, ...); ... listen ( sockfd, 5 ); ... while ( 1 ) { /* loop forever */ newsockfd = accept( sockfd, &peername, &peername_len ) ; if ( newsockfd < 0 ) { ... handle_error ... } else { ... communicate with peer ... } close ( newsockfd ); } }//}/ / / / / / &/ 9/ x/ 0040dd40dd40dd 40dd%40dd40dd40dd40dd40dd40dd40dd40dd40dd!40dd:40dd40dd40dd 40dd"40dd40dd40dd(111=@ p,0%=v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   562</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D=   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111    (@  8:$0z-V 5Sample Stream (TCP) Server DISCARD Server bind() and listen() at the discard port accept() incoming connections discard all new data received on connection allow client to close connection/// / / 0040UlKd40dd(40dd40dd,40dd 40dd(111  (6 8>@ p,0%>v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   563</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D>   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 W  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  (w  88 : $0 t5/* ** DISCARD Protocol Server (RFC 863) */ #include #include #include #include #include #include #include #include #include #include unsigned char buffer[16384]; main() { int lsock, sock, len; struct servent *se; struct hostent *he; struct sockaddr_in local_addr, remote_addr; unsigned long bytes; struct timeb stat_etime, stat_stime, stat_time; float seconds, kbsec;</,/t/ 0x040dd*40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd 40dd!40dd%40dd%40dd640dd&40ddD40dd540dd(11t1?@ p,0%?v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   564</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D?   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 G  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  ( 8  (nj 8  (v. r 8 : $0K U 42dd3wp5 /* ** 1. Create the listen socket. */ lsock = socket(AF_INET,SOCK_STREAM,0); if (lsock <= 0) { perror("socket"); exit(1); } /* ** 2. Bind the listen socket to the well-known port. */ bzero((char *)&local_addr,sizeof(local_addr)); local_addr.sin_family = AF_INET; se = getservbyname("discard","tcp"); if (se != NULL) local_addr.sin_port = se->s_port; else local_addr.sin_port = htons(9); if (bind(lsock,&local_addr,sizeof(local_addr)) < 0) { perror("bind"); exit(1); } //$/ %/ /      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ :/ U/ @000 40dd 40dd-40dd 40dd/40dd40dd40dd40dd 40ddB40dd 40dd740dd)40dd-40dd40dd#40dd 40dd!40dd>40dd40dd 40dd40dd(11p1@@ p,0%@v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   565</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D@   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111   (  8 :[ $0W  42dd3w5 /* ** 3. Set the socket to accept incoming connections. */ if (listen(lsock,5) < 0) { perror("listen"); exit(1); } /* ** 4. Wait for a connection. */ next_connection: len = sizeof(remote_addr); sock = accept(lsock,&remote_addr,&len); if (sock < 0) { perror("accept"); exit(1); } /* ** 5. Loop receiving data from peer until the connection is closed (or an error occurs). */ bytes = 0; ftime(&stat_stime); while ((len = recv(sock,buffer,sizeof(buffer),0)) > 0) bytes += len; D/4// 0/ |/ "/ / ^/ / @000 40ddB40dd 40dd#40dd40dd40dd 40dd*40dd 40dd40dd#40dd040dd40dd40dd40dd 40ddf40dd 40dd40dd40dd?40dd40dd(111$A@ p,0%Av ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   566</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DA   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 O  ( 8 : $0N7 K5 /* ** 6. Close the connection. */ close(sock); /* ** Log the results (k-bytes/second). */ he = gethostbyaddr(remote_addr.sin_addr.s_addr,4,AF_INET); ftime(&stat_etime); stat_time.time = stat_etime.time - stat_stime.time; stat_time.millitm = stat_etime.millitm - stat_stime.millitm; seconds = ((short) stat_time.millitm)/1000.0; seconds += stat_time.time; kbsec = bytes/seconds/1024.0; printf("Received %d bytes in %.2f seconds (%.3f KB/sec) from %s,%d.\n", bytes,seconds,kbsec, he ? he->h_name : inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port)); /* ** 7. Loop to wait for another connection. */ goto next_connection; }/// / / &/ ,/ 0x0 40dd)40dd 40dd40dd 40dd240dd 40ddC40dd40dd<40ddE40dd640dd#40dd&40ddP40dd$40ddB40dd-40dd 40dd840dd 40dd40dd40dd(11K1>B@ p,0%Bv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   567</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DB   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 4  (p  8  (p 8 X   (@  8:#$#0] (5Datagram (UDP) Client/Server</,//(Q X0H040dd(111  ( 8 + ( 8:k$0B5close()</,// X0H040dd(111 , ( 8:l$0B5sendto()</,// X0H040dd(111 . ( 8:n$0B 5recvfrom()</,/ / X0H0 40dd(11 1 - ( 8:m$0R 5connect()</,/ / X0H0 40dd(11 1 , ( 8:l$0R5sendto()</,// X0H040dd(111 . ( 8:n$0R 5recvfrom()</,/ / X0H0 40dd(11 1 + ( 8:k$0R5close()</,// X0H040dd(111 * (' 8:j$0R5bind()</,// X0H040dd(111 * (g 8:j$05Client</,// X0H040dd(111 z __  8 z NN  8 2 (t[ 8:r$0q>5data (request)</,// X0H040dd(111 0 (<Q# 8:p$0Y 5data (reply)</,/ / X0H0 40dd(11 1 z (  8 z   8 z   8 z   8 z   8 z   8 z   8  ( p.*`' p 8  ( p.*` p 8  ( p.*` p 8  ( p.*` p 8  ( p.*P p 8  ( p.*P p 8 , ( 8:l$0B5socket()</,// X0H040dd(111  (_ 8 * ( 8:j$0B5bind()</,// X0H040dd(111  (&%a 8  ( p.*P' p 8  ( p.*P p 8  ( p.*`9 p 8 , ( 8:l$0R5socket()</,// X0H040dd(111 z NN  8 z M_  8 z __  8 G (' 8:$0b yO 5retransmit?</,/ / X0H0 40dd(11 1 * (&w 8:j$0`z5Server</,// X0H040dd(111tC@ p,0%Cv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   568</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DC   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 .   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//(Q X0H040dd(111    (@  8:$0z-V m5socket bind (optional) if not specified, connect/sendto/recvfrom will bind connect (optional) allows use send/recv sendto/recvfrom (send/recv if connected) retransmit if necessary close/// 4/ / / F/ P0@040UlKd40UlKd440dd40UlKd40dd)40UlKd40UlKd40UlKd(1115D@ p,0%Dv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   569</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DD   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//(Q X0H040dd(111 ^   (@  8:$0z-V .5SENDTO() Send a datagram sendto( int sockfd, char *buffer, int nbytes, int flags, struct sockaddr *toaddr, int toaddr_len); sockfd = socket on which to send datagram buffer = address of the buffer to send nbytes = number of bytes to send flags = special send options (usually zero) toaddr = internet address and port to use toaddr_len = length (in bytes) of toaddr structure// / / / 00 40UlKd40ddw40dd*40dd'40dd!40dd,40dd*40dd240dd(111E@ p,0%Ev ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   570</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DE   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 O   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//(Q X0H040dd(111    (@  8:$0z-V 5RECVFROM() Receive a datagram recvfrom( int sockfd, char *buffer, int buflen, int flags, struct sockaddr *fromaddr, int*fromaddr_len); sockfd = socket from which to receive datagram buffer = address of buffer to receive datagram buflen = size of buffer (max # bytes to receive) flags = special receive options (usually zero) fromaddr = sockaddr to receive internet address and port of the sender fromaddr_len = address of integer to be filled in with length (in bytes) of fromaddr structure// / |/ c/ 00 40UlKd40ddi40dd/40dd/40dd140dd/40ddG40dd^40dd(111HF@ p,0%Fv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   571</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DF   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8    (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//(Q X0H040dd(111 q   (@  8:$0z-V Ay5Writing a Datagram client Create a socket of type SOCK_DGRAM with socket() Optional - Bind a local port with bind() Optional - Specify destination address with connect() Send a request datagram with sendto() Start a timer Receive a reply datagram with recvfrom() Note: if timer expires, go back to step 4 If more to request, go to step 4 Close the socket when done with close()p/`// 1/ / / / / */ H/ 0040UlKd1401dd)402dd6403dd&404dd405dd)406dd*40dd!407dd'408dd(11y1fG@ p,0%Gv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   572</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DG   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Server</,//(Q X0H040dd(111    (@  8:$0z-V _{5socket - Same as for client bind - Same as for client sendto/recvfrom - Same as for client close - Same as for client</,/{/ 00 040UlKd40UlKd%40UlKd40UlKd(11{1CH@ p,0%Hv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   573</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DH   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Server</,//(Q X0H040dd(111    (@  84:$0z-V l5Writing a Datagram Server Create a socket of type SOCK_DGRAM with socket() Bind the socket to the well-known port for the service (use getservbyname() to find port and then use bind()) Wait for a request to arrive with recvfrom() Specify a sockaddr_in structure to obtain the source of the request to use for sending reply Send the reply with sendto() Go to step 3/// / ]/ )/ 0040UlKd1401ddn402dd-403dd]40dd404dd 405dd(11l1  (X 8}I@ p,0%Iv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   574</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DI   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 7  (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Multithreaded Servers</,//(Q X0H040dd(111    (@  8:$0z-V v5Servers that need to service several connections at once are more complex Requires use of multiplexing services Socket select() function Unix fork mechanism Requires a context block per connection//J/ &/ // '/ x0h0J40UlKd&40dd40dd40dd'40dd(111VJ@ p,0%Jv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   575</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DJ   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8    (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Multithreaded Servers</,//(Q X0H040dd(111    (@  8:$0z-V O5Initiating the server via inetd (master server) Advantages: no separate listening process for each service easily support multiple connections Add server information to inetd database Server is automatically started when a connection is established or datagram is sent to well-known port (each server handles one connection) Servers input, output, and error files are assigned to the socket Master server handles socket(), bind(), listen(), and accept()//0/ / S/ 8/ P0@0040UlKd 40dd/40dd$40dd)40dd40ddC40dd?40dd(111K@ p,0%Kv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   576</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DK   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 N   (@@  8:#v$#0z]V 5Other Socket Calls</,//(Q X0H040dd(111    (@  8S:#$0z-V 5getsockopt() Obtains socket options setsockopt() Sets socket options SO_REUSEADDR SO_KEEPALIVE getpeername() Obtain peers socket internet address and port getsockname() Obtain local socket internet address and port// / / / / / / // / -/ 00 40UlKd40dd 40UlKd40dd 40dd 40dd40UlKd/40dd40UlKd-40dd(111L@ p,0%Lv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   577</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DL   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 :  (p  8  (p 8 C   (@@  8:#k$#0z]V 5Summary</,//(Q X0H040dd(111    (@  8:$0zV 5TCP Reliable byte stream Client and Server define message protocol UDP Unreliable datagram service Client and Server must implement reliability/// ?/ / H/ 0040UlKd40dd*40dd40UlKd40dd,40dd(111C@ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8  C   (@@  8:#k$#0z]V 5Summary</,//(Q X0H040dd(111    (@  8:$0z-V x`5TCP client socket connect send/recv close TCP Server socket, bind, listen accept recv/send close// / / / +/ 00 40UlKd40dd40dd 40dd40dd 40UlKd40dd40dd 40dd40dd(11`1 @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (mD  8t=D$Ĥ0 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 j C   (@@  8:#k$#0z]V 5Summary</,//(Q X0H040dd(111    (@  8_:/$0z-V O5UDP client socket sendto/recvfrom close UDP Server socket recvfrom/sendto close// / / / / P0@0 40UlKd40dd40dd40dd 40UlKd40dd40dd40dd(11O1T @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (mD  8t=D$Ĥ0 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8  C   (@@  8:#k$#0z]V 5Summary</,//(Q X0H040dd(111    (@  8:$0z-V aQ5Multithreaded servers Socket select for polling Unix fork Master Server (inetd)h/X// ;/ 00 040UlKd40dd 40dd40dd(11Q1 M@ p,0%Mv ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8DM  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011 4 (f 8:t$0HI5Library Routines</,//,33 X0H040dd(111>N@ p,0%Nv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   579</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DN   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Byte Order Routines</,//(Q X0H040dd(111 i   (@  8:$0z-V 9M5Remember that network byte order is not necessarily the same as host byte order Always use byte order routines when you want to look inside of protocol headers or call protocol routines What you do in your own code for byte order is up to you If you are moving strange things (not ASCII) over the network, you should be using RPC/XDRD/4// / / */ / / Z/ 00 0P40UlKdj40UlKd940UlKdZ40dd(11M1O@ p,0%Ov ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   580</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DO   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Byte Order Routines</,//(Q X0H040dd(111  (@0  8:T$0zMv j(5#include u_long htonl(u_long hostlong); /* convert 32-bit host to network*/ u_short htons(u_short hostshort); /* convert 16-bit host to network*/ u_long ntohl(u_long netlong); /* convert 32-bit network to host*/ u_short ntohs(u_short netshort); /* convert 16-bit network to host*/// / / ?/ / @/ / >/ / 7/ 0040dd240dd2C40dd2F40dd2B40dd2D40dd2(11(1vP@ p,0%Pv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   581</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DP   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 0  (p  8  (p 8 U   (@@  8:#}$#0z]V %5Internet Address Routines</,//(Q X0H040dd(111    (@  8:$0z-V k5Internet addresses are expressed often as character strings (e.g., 192.168.12.2) Internet addresses internally are all numbers (e.g., 0x020CA8C0) Inet routines convert between the two (and do other things)</,// 00S40UlKdA40UlKd;40UlKd(111Q@ p,0%Qv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   582</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DQ   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 T   (@@  8:#|$#0z]V $5 inet_aton and inet_ntoa</,//(Q X0H040dd(111  (8  8:]$0 b5#include #include #include int inet_aton(char *cp, struct in_addr *ina); /* convert string to number */ char *inet_ntoa(struct in_addr ina); /* convert number to string *///N/ / G/ / :/ 0040dd 40dd 40dd 40dd P40dd I40dd (111 5 ( 8:u$0I5Calling Sequence:</,// X0H040dd(111 , ( 8:l$0Y5Example:</,// X0H040dd(111 X (\ D 8:$0 @5/* We have the IP address in the character array pointed to by host_ip */ if (!inet_aton(host_ip, &ina)) { printf(Your host IP address %s is not well formed.\n, host_ip); return FALSE; }//k/ P/ / x0h0J40dd!40ddB40dd40dd40dd(111ER@ p,0%Rv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   583</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DR   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 L   (@@  8:#t$#0z]V 5Converting Names</,//(Q X0H040dd(111 s   (@  8:$0z-V C5inet_aton() and inet_ntoa() convert 192.168.12.2 and 0x020CA8C0 back and forth. This is purely a mechanical operation What about converting WWW.Process.COM to a number? Now we have to go to the network databases//S/ '/ 7/ */ 00 0S40UlKd'40dd740UlKd*40dd(111aS@ p,0%Sv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   584</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DS   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 R   (@@  8:#z$#0z]V "5The Domain Name System</,//(Q X0H040dd(111  (H  8:$0s5List of all hosts in the Internet List of all networks in the Internet List of all protocols on this system List of all services on this system</,// 00 0"40dd2%40dd2%40dd2#40dd2(111 = (@h  8:}$0z. %A5on the Internet! /etc/protocols /etc/services</,/A/ 00 040dd240dd240dd2 40dd2(11A1 z a  8 z 88  8 A (p@ 8:$0)5What are we keeping track of?</,// X0H040dd2(111 < (8  8:|$0 $5Where are we storing it?</,// X0H040dd2(111rT@ p,0%Tv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   585</,//  X0H040dd(111  (vX  8  (v 8        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ (C; 8DT   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 ,   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5TCPware-Specific Info</,//(Q X0H040dd(111    (@  8:$0z-V kW5Local information - can edit these files: TCPWARE:HOSTS. - local host definitions; initialized during configuration TCPWARE:SERVICES. - initial defaults TCPWARE:PROTOCOLS. - initial defaults TCPWARE:NETWORKS. - initial defaults DNS client process provides this information to applications DNS client automatically updated when files are edited//*/ / s/ 00*40UlKdJ40dd%40dd&40dd%40dd=40UlKd640UlKd(11W1U@ p,0%Uv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   586</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DU   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 g  (p  8  (p 8 N   (@@  8:#v$#0z]V 5Names to Addresses</,//(Q X0H040dd(111    (@  81:$0z-V  5Goal is to have IP address in a 32-bit quantity We can start with either a domain name, e.g. WWW.Process.COM, or an IP address, e.g. 198.115.138.23 We can also take service, protocol, and network names and convert them to the relevant structures, e.g. TELNET, FTP, etc.</,/ / 00040UlKdd40UlKdy40UlKd(11 12V@ p,0%Vv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   587</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DV   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 '  (p  8  (p 8 _   (@@  8:#$#0z]V /#5Retrieve Information from Databases</,/#/ Q X0H0#40dd(11#1 E (P$ 8:$0m-!5List of all hosts in the Internet</,/!/ X0H0!40dd2(11!1 4 (P$ 8:t$0 m5on the Internet!</,// X0H040dd2(111 z h  8 z   8 A ( 8:$02)5What are we keeping track of?</,// X0H040dd2(111 < ( 8:|$0$5Where are we storing it?</,// X0H040dd2(111 5 (( 8:u$0:5How do we see it?</,// X0H040dd2(111 D ( ^ 8:$0: A, 5getservbyname(), getservbyport()</,/ / X0H0 40ddP(11 1 z   8 H ( 8:$00$5List of all networks in the Internet</,/$/ X0H0$40dd2(11$1 H (P$ 8:$0m0$5List of all protocols on this system</,/$/ X0H0$40dd2(11$1 G ( 8:$0/#5List of all services on this system</,/#/ X0H0#40dd2(11#1 7 ( 8:w$0 5</,// X0H040dd2(111 2 (P$ 8:r$0 m5/etc/protocols</,// X0H040dd2(111 1 ( 8:q$0  5/etc/services</,/ / X0H0 40dd2(11 1 H (p  8:$0:0$5getprotobyname(), getprotobynumber()</,/$/ X0H0$40ddP(11$1 B (p  8:$0:*5getnetbyname(), getnetbyaddr()</,// X0H040ddP(111 D ( ^ 8:$0: A, 5gethostbyname(), gethostbyaddr()</,/ / X0H0 40ddP(11 1BW@ p,0%Wv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   588</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DW   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 H   (@@  8:#p$#0z]V  5The Routines</,/ /(Q X0H0 40dd(11 1 t   (@  8:$0z-V D5The getxxxbyyyy() routines return information in structures gethostby () returns hostent getservby () returns servent getprotoby () returns protoent getnetby () returns netent\/L// / / / /3e / ,/ / / / / / / / / / / / / / / / / / / 00<40UlKd40TlKd40UlKd40UlKd40UlKd40UlKd(111X@ p,0%Xv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   589</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DX   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 I   (@@  8:#q$#0z]V  5Host Routines</,/ /(Q X0H0 40dd(11 1    (@  8j::$0z-V 5Used to return host addresses from databases or name servers Can query by host name DNS gurus: A records Can query by address DNS gurus: PTR records Returns everything in hostent structures//T/ / / / (/ 00=40UlKd40UlKd40dd40UlKd40dd(40UlKd(111Y@ p,0%Yv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   590</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DY   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 I   (@@  8:#q$#0z]V  5Host Routines</,/ /(Q X0H0 40dd(11 1  ((H(  8v:F$0be 5#include struct hostent *gethostbyname(char *name); /* returns pointer to an object describing an Internet host referenced by name */ struct hostent *gethostbyaddr(char *addr, int len, int type); /* returns pointer to an object describing an Internet host referenced by address */ /* len = length of address */ /* type = type of address, should be AF_INET */p/`/$/ / / U/ / / ?/ / p0`040dd40dd+40dd740dd40dd40dd340dd)40dd740dd!40dd40dd/40dd(111LZ@ p,0%Zv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   591</,//  X0H040dd(111  (vX  8  (v 8   (C; 8DZ   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8    (p  8  (p 8 M   (@@  8:#u$#0z]V 5hostent Structure</,//(Q X0H040dd(111 y   (@  8:$0z-F  I5A hostent structure (defined in ) which is: struct hostent { char *h_name: /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of each address */ char **h_addr_list; /* list of addresses */ };h/X/5/ / P0@0540UlKd40TlKd+40TlKd$40TlKd)40TlKd,40TlKd-40TlKd40TlKd(111F[@ p,0%[v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   592</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D[   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 L   (@@  8:#t$#0z]V 5Service Routines</,//(Q X0H040dd(111 t   (@  8:$0z-V D5Used to convert service names (SMTP, POP, FTP, TELNET) to numbers Also returns the preferred protocol for use with that service Returns everything in servent structures</,// 00B40UlKd>40UlKd(40UlKd(111\@ p,0%\v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   593</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D\   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 L   (@@  8:#t$#0z]V 5Service Routines</,//(Q X0H040dd(111  ((H(  8z:J$0be 5#include struct servent *getservbyname(char *name, char *proto); /* returns pointer to an object describing a service on the local machine referenced by name and protocol to be used */ struct servent *getservbyport(int port, char * proto); /* returns pointer to an object describing a service on the local machine referenced by port and protocol number */ /* proto may be left null */p/`/$/ / / ~/ / / / / p0`040dd40dd840dd540dd/40dd40dd40dd740dd540dd/40dd40dd40dd(111]@ p,0%]v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   594</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D]   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 x  (p  8  (p 8 M   (@@  8:#u$#0z]V 5servent Structure</,//(Q X0H040dd(111    ( @ 8C:$0 # 5A servent structure is: struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ int s_port; /* port number, network byte order */ char *s_proto; /* protocol to use */ };h/X// / 0040UlKd40TlKd+40TlKd$40TlKd340TlKd&40TlKd40TlKd(111H^@ p,0%^v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   595</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D^   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 M   (@@  8:#u$#0z]V 5Protocol Routines</,//(Q X0H040dd(111 u   (@  8:$0z-V E5Used to convert protocol names (IP, TCP, UDP) to numbers Returns everything in protoent structures Only ever used to be absolutely correct when calling socket() routines</,// 00940UlKd*40UlKdF40UlKd(111f_@ p,0%_v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   596</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D_   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 M   (@@  8:#u$#0z]V 5Protocol Routines</,//(Q X0H040dd(111  ((H(  8:$0be {k5#include struct protoent *getprotobyname(char *name); /* returns pointer to an object describing a protocol which may or may not be offered on the local machine, by name */ struct protoent *getprotobynumber(int proto); /* returns pointer to an object describing a protocol which may or may not be offered on the local machine, by number */p/`/%/ / / }/ / / / ~/ (0040dd40dd-40dd640dd040dd40dd40dd.40dd640dd040dd40dd(11k1H`@ p,0%`v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   597</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D`   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 N   (@@  8:#v$#0z]V 5protoent Structure</,//(Q X0H040dd(111 t   ( @ 8:$0 # D5A protoent structure is: struct protoent { char *p_name; /* official name of protocol */ char **p_aliases; /* alias list */ int p_proto; /* protocol number */ };h/X// / 0040UlKd40TlKd/40TlKd$40TlKd$40TlKd40TlKd(111G a@ p,0%av ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8Da  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011  (  8:$02s5Programming on VMS Using $QIOs </,//,33 0040dd 40dd(111b@ p,0%bv ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   599</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Db   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 Z   (p  8  (p 8 L   (@@  8:#t$#0z]V 5Sockets vs. QIOs</,//(Q X0H040dd(111    ( P  8&:$0Zm r5Sockets Portable to other platforms Available via DEC C RTL 3rd Party Socket Libraries Recommend DEC C RTL, supported by 3rd parties $QIOs VMS only Can easily write asynchronous code Can easily write multithreaded servers BGDRIVER (Digital TCP/IP Services/UCX interface) 3rd Party interfaces: INETDRIVER, TCPDRIVER, UDPDRIVER Recommend BGDRIVER, supported by 3rd partiesD/4// 4/ I/ / / / c/ p0`040UlKd40:dd40UlKd40UlZd.40UlZd40UlKd 40Qnd#40:dd'40:dd140UlKd740UlZd,40UlZd(11r1c@ p,0%cv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5100</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dc   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 L   (@@  8:#t$#0z]V 5$QIO Programming</,//(Q X0H040dd(111 5   ( o 8:]$0 R 5SYS$ASSIGN to assign/create channel to device SYS$QIO Queue an I/O request to device Asynchronous AST routine invoked on completion (Optional) Event Flag set on completion (Optional) SYS$QIOW Synchronous - waits for completion SYS$DASSGN to deassign/release channel//6/ / / #/ &/ 00.40UlKd40UlKd40dd 40dd-40dd(40dd 40UlKd#40dd&40UlKd(11 1d@ p,0%dv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5101</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dd   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 v   (p  8  (p 8 L   (@@  8:#t$#0z]V 5$QIO Programming</,//(Q X0H040dd(111    (? ` 8B:$0\ C^5SYS$QIO(EF,CHN,FUNC,IOSB,ASTADR,ASTARG,P1,P2,P3,P4,P5,P6) EF Optional Event Flag CHN Required Channel from SYS$ASSIGN FUNC Required Function to perform IOSB Recommended I/O Status Block ASTADR Optional AST routine address ASTARG Optional AST parameter P1-P6 Opt/Req Function specific arguments/// 3/ $/ P0@0:40UlKd!40dd.40dd+40dd(40dd*40dd$40dd440dd(11^1Re@ p,0%ev ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5102</,//  X0H040dd(111  (vX  8  (v 8   (C; 8De   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 U   ( @?  8:#}$#0Z] %5BGDRIVER $QIO vs. Socket</,//(Q X0H040dd(111 \   ( 8:$0*,P5SOCKET() BIND() LISTEN() ACCEPT() CONNECT() SEND() RECV() CLOSE() GETxxxBYyyy</,/P/ (00 40UlKd40TlKd40UlKd 40UlKd 40UlKd 40UlKd40UlKd40UlKd40UlKd40TlKd 40UlKd(11P1    (  8b:2$0* 5SYS$ASSIGN SYS$QIO IO$_SETMODE SYS$QIO IO$_SETMODE SYS$QIO IO$_SETMODE SYS$QIO IO$_ACCESS ! IO$M_ACCEPT SYS$QIO IO$_ACCESS SYS$QIO IO$_WRITEVBLK SYS$QIO IO$_READVBLK SYS$QIO IO$_DEACCES SYS$DASSGN SYS$QIO IO$_ACPCONTROL</,// (00 40UlKd40TlKd40UlKd40UlKd$40UlKd40UlKd40UlKd40UlKd40UlKd40TlKd40UlKd(111=C@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   536</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 8  (p  8  (p 8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//(Q X0H040dd(111 ]5 95 2 +2+ , (p 8:l$0k5socket()</,// X0H040dd(111  (~> 8  (/ 8 + ( 8:k$05close()</,// X0H040dd(111 + ( 8:k$05write()</,// X0H040dd(111 * (0P 8:j$0U+5read()</,// X0H040dd(111 , ( 8:l$0{5accept()</,// X0H040dd(111 , ( 8:l$05listen()</,// X0H040dd(111 * ( @ 8:j$0E5bind()</,// X0H040dd(111  (1s 8  (&O# 8 - ( 8:m$0"{ 5connect()</,/ / X0H0 40dd(11 1 + (0P 8:k$0"U+5write()</,// X0H040dd(111 * ( 8:j$0"5read()</,// X0H040dd(111 + ( 8:k$0"5close()</,// X0H040dd(111 , ( 8:l$0"5socket()</,// X0H040dd(111 * (7 8:j$0q\5Client</,// X0H040dd(111 z   8 z   8 z pp  8 . (A( 8:n$0^z  5connection</,/ / X0H0 40dd(11 1 2 ({ 8:r$0A5data (request)</,// X0H040dd(111 0 (!g 8:p$Ť0J 5data (reply)</,/ / X0H0 40dd(11 1 z ``  8 z ``0  8 z `Q`  8 z ``  8 z PP  8 z PAP  8 z PP  8 z PP0  8 z PQP  8 z PP  8  ( p.*0 p 8  ( p.*00 p 8  ( p.*0P p 8  ( p.*0 p 8  ( p.*  p 8  ( p.* @ p 8  ( p.*  p 8  ( p.* 0 p 8  ( p.* P p 8  ( p.*  p 8 * (&dq^ 8:j$0`7A5Server</,// X0H040dd(111g@ p,0%gv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5104</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dg   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 1   ( P  8:Y$0Zm 5Create a network device ($ASSIGN BG0:) Create a socket ($QIO IO$_SETMODE) Open connection to the server ($QIO IO$_ACCESS) Specify internet address of server obtained from gethostbyname() or inet_aton Specify port number of servers well-known port - obtained from getservbyname() Send and receive data ($QIO IO$_WRITEVBLK and $QIO IO$_READVBLK) Close the connection ($QIO IO$_DEACCESS) Deallocate network device ($DASSGN)//z/ / / P0@0'40Q1Kd#40Q2Kd040Q3KdN40ddP40ddA40Q4Kd)40Q5Kd#40Q6Kd(111h@ p,0%hv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5105</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dh   (lD  8t=D$Ĥ0  42dd3 w5//0011 8.04x$xw&UGGGى  (@ p 8 q  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111    (@P  8:$0zmV W5Example client Program prompts user for servers host name Looks up servers internet address from host name Connects to server at port 65000 Sends message to server Closes connectionh/X// / 0040UlKd,40dd240dd!40dd40dd40dd(111 K (7, 8:$0qR35 #define SERVER_PORT 65000 /* ** UCX-compatible Stream (TCP) Client using BGDRIVER $QIOs ** ** To build against TCPware on VAX: ** $ CC/DEFINE=TCPWARE UCX_CLIENT ** $ LINK UCX_CLIENT,TCPWARE:UCX$IPC/LIB,SYS$INPUT/OPTIONS ** SYS$SHARE:VAXCRTL/SHARE ** ** To build against TCPware on AXP: ** $ CC/DEFINE=TCPWARE/STANDARD=VAXC UCX_CLIENT ** $ LINK UCX_CLIENT **</,// 0040dd40dd40dd=40dd40dd%40dd&40dd?40dd40dd40dd%40dd440dd40dd40dd(111i@ p,0%iv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5106</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Di   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 C  (Gg| 8 : $0-_+ 75** To build against UCX on VAX: ** $ CC UCX_CLIENT ** $ LINK UCX_CLIENT,SYS$LIBRARY:UCX$IPC/LIB,SYS$INPUT/OPTIONS ** SYS$SHARE:VAXCRTL/SHARE ** ** To build against UCX on AXP: ** $ CC/STANDARD=VAXC UCX_CLIENT ** $ LINK UCX_CLIENT ** */ #include #include #include ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~h> #include #include #include #ifdef TCPWARE #include "TCPWARE_INCLUDE:ucx$inetdef.h" /* Provided by TCPware install */ #else #include /* Provided during UCX installation */ #endif</,/7/ @000!40dd40ddC40dd40dd40dd!40dd%40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40ddN40dd40ddW40dd40dd(1171j@ p,0%jv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5107</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dj   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111   (w^ 8 :S $0{ 5/* ** Macros to check VMS success/failure status */ #define SUCCESS(status) (status&1) #define FAILURE(status) (!(status&1)) /* ** Values for boolean variables */ #define FALSE 0 #define TRUE 1 /******************************/ /* Client Program */ /******************************/ main() { int status; /* For return status */ short channel; /* BG channel number */ short sck_parm[2]; /* Socket creation parameter */ short iosb[4]; /* I/O status block */ char buf[512]; /* buffer to transmit */ struct SOCKADDRIN remote_host; /* remote host's address & port */ struct hostent *he; /* returned from gethostbyname */ char server_name[256]; /* name of remote server */ int got_host; /* boolean */</,// 0x040dd/40dd40dd$40dd'40dd40dd 40dd40dd40dd40dd!40dd!40dd!40dd 40dd240ddF40ddO40ddE40ddJ40ddD40dd[40ddO40ddI40dd(111k@ p,0%kv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5108</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dk   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111 -  ( 8 :m $0Q 42dd3w5 /* ** UCX item list 2 descriptor used during $QIO IO$_ACCESS */ struct IL2 { unsigned int il2_length; char *il2_address; } rhst_adrs = {sizeof remote_host, &remote_host}; /* ** String descriptor used during $ASSIGN */ struct dsc$descriptor inet_dev = {10, DSC$K_CLASS_S, DSC$K_DTYPE_T, "UCX$DEVICE"}; /* ** Assign a channel to the UCX device. */ status = sys$assign( &inet_dev, &channel, 0, 0); if (FAILURE(status)) { printf("Failed to assign channel to UCX device.\n"); exit(status); } //H/ $/ / / k/ @00040dd<40dd40dd40dd40dd40dd340dd40dd40dd+40dd40dd"40dd440dd40dd40dd)40dd40dd240dd40dd740dd40dd40dd(111l@ p,0%lv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5109</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dl   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 U   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (C 86 : $0Q 42dd3w5 /* ** Prompt user for server name. ** Lookup the corresponding internet address. */ got_host = FALSE; while( got_host == FALSE ) { printf("Enter name of remote host:"); gets( server_name ); if ((he = gethostbyname( server_name )) == NULL) printf("Error, gethostbyname failed\n"); else got_host = TRUE; } memcpy((char *)&remote_host.SIN$L_ADDR, he->h_addr, he->h_length ); /// / / )/ / */ R/ C/ / 0040dd40dd#40dd040dd40dd40dd40dd%40dd)40dd40dd440dd.40dd40dd40dd40ddE40dd(111m@ p,0%mv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5110</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dm   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 z  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (GyL 8[ :+ $0?/ 42dd3wS5 /* ** Create the socket */ sck_parm[0] = UCX$C_TCP; /* TCP/IP protocol */ sck_parm[1] = INET_PROTYP$C_STREAM; /* stream type of socket */ status = sys$qiow( 3, /* Event flag */ channel, /* Channel number */ IO$_SETMODE, /* I/O function */ iosb, /* I/O status block */ 0, 0, &sck_parm, 0, /* P1 Socket creation parameter */ 0, 0, 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) { printf("Failed to create and bind the device socket.\n"); exit(status); } /// / / / / "/ / / e/ / G/ / / / / 0040dd40dd40dd40dd140ddA40dd40dd;40dd640dd&40dd540dd 40dd@40dd 40dd 40dd40dd(40dd40dd<40dd40dd40dd(11S1n@ p,0%nv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5111</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dn   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 x  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (G^Q 8Y :) $0{ 42dd3wa5 /* ** Connect to specified host and port number */ remote_host.SIN$W_FAMILY = UCX$C_AF_INET; /* INET family */ remote_host.SIN$W_PORT = htons( SERVER_PORT ); /* port number */ status = sys$qiow( 3, /* Event flag */ channel, /* Channel number */ IO$_ACCESS, /* I/O function */ iosb, /* I/O status block */ 0, 0, 0, 0, &rhst_adrs, /* P3 Remote IP address */ 0, 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) { printf("Failed to connect to remote host.\n"); exit(status); } L/<// */ / )/ / 0/ / / a/ %/ M/ -/ / @00040dd/40dd40dd40dd=40ddC40dd40dd<40dd740dd%40dd540dd 40dd 40dd-40dd40dd40dd(40dd40dd140dd40dd40dd40dd(11a1o@ p,0%ov ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5112</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Do   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 f  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  (G 8G : $0 [5 /* ** Send message to the server ** ** Note that this client/server combination implements ** a very simple message protocol - the client simply ** sends a text string of any size and then closes ** the connection. The server simply keeps reading ** (and printing the received text to SYS$OUTPUT) ** until the connection is closed by the client. */ strcpy( buf, "Hello there Mr. Server. Are you listening?"); status = sys$qiow( 3, /* Event flag */ channel, /* Channel number */ IO$_WRITEVBLK, /* I/O function */ iosb, /* I/O status block */ 0, 0, buf, /* P1 buffer */ strlen(buf), /* P2 buffer length */ 0, 0, 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) printf("Failed to write to socket.\n");/// / G/ =/ / / b/ (/ 0/ p/ x/ 0040dd40dd40dd840dd740dd440dd640dd340dd240dd40dd>40dd<40dd840dd(40dd$40dd 40dd640dd:40dd40dd(40dd=40dd(11[1p@ p,0%pv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5113</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dp   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 <  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//(Q X0H040dd(111  ( 8 : $0 42dd3w5 /* ** Close the socket (optional - could just let $DASSGN ** perform the close) */ status = sys$qiow( 3, channel, IO$_DEACCESS, iosb, 0, 0, 0, 0, 0, 0, 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) printf("Failed to close the socket.\n"); /* ** Deassign the UCX device channel. */ status = sys$dassgn( channel ); if (FAILURE(status)) printf("Failed to deassign the channel.\n"); } /// / Q/ / / / / !/ G/ @00040dd840dd)40dd40dd40dd40dd40dd 40dd 40dd40dd(40dd40dd+40dd40dd40dd&40dd40dd40dd!40dd40dd/40dd40dd(111=C@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   536</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 8  (p  8  (p 8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//(Q X0H040dd(111 ]5 95 2 +2+ , (p 8:l$0k5socket()</,// X0H040dd(111  (~> 8  (/ 8 + ( 8:k$05close()</,// X0H040dd(111 + ( 8:k$05write()</,// X0H040dd(111 * (0P 8:j$0U+5read()</,// X0H040dd(111 , ( 8:l$0{5accept()</,// X0H040dd(111 , ( 8:l$05listen()</,// X0H040dd(111 * ( @ 8:j$0E5bind()</,// X0H040dd(111  (1s 8  (&O# 8 - ( 8:m$0"{ 5connect()</,/ / X0H0 40dd(11 1 + (0P 8:k$0"U+5write()</,// X0H040dd(111 * ( 8:j$0"5read()</,// X0H040dd(111 + ( 8:k$0"5close()</,// X0H040dd(111 , ( 8:l$0"5socket()</,// X0H040dd(111 * (7 8:j$0q\5Client</,// X0H040dd(111 z   8 z   8 z pp  8 . (A( 8:n$0^z  5connection</,/ / X0H0 40dd(11 1 2 ({ 8:r$0A5data (request)</,// X0H040dd(111 0 (!g 8:p$Ť0J 5data (reply)</,/ / X0H0 40dd(11 1 z ``  8 z ``0  8 z `Q`  8 z ``  8 z PP  8 z PAP  8 z PP  8 z PP0  8 z PQP  8 z PP  8  ( p.*0 p 8  ( p.*00 p 8  ( p.*0P p 8  ( p.*0 p 8  ( p.*  p 8  ( p.* @ p 8  ( p.*  p 8  ( p.* 0 p 8  ( p.* P p 8  ( p.*  p 8 * (&dq^ 8:j$0`7A5Server</,// X0H040dd(111r@ p,0%rv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5115</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dr   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 w   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111    (P  8@:$0*m 5Create network device ($ASSIGN BG0:) Create socket and bind to well-known port for the service ($QIO IO$_SETMODE) Official servers use getservbyname() to obtain assigned port number for the service Examples here use an unreserved port number Put socket in listen mode ($QIO IO$_SETMODE) Wait for and accept incoming connection Create new BG device for connection ($ASSIGN BG0:) Accept connection ($QIO IO$_ACCESS ! IO$M_ACCEPT) Original BG device continues listening for new connections//r/ / U/ / 00%40Q1KdM40Q2KdV40dd,40dd-40Q3Kd(40Q4Kd340dd240dd:40dd(111s@ p,0%sv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5116</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Ds   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 Q  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111    (  8:$0* 5Receive and send data as needed for the service ($QIO IO$_READVBLK and IO$_WRITEVBLK) Close the connection ($QIO IO$_DEACCESS) Go to step 4 Deallocate the BG device ($DASSGN)</,// 00 0V40Q5Kd)40Q6Kd 40Q7Kd"40Q8Kd(111t@ p,0%tv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5117</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dt   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 K  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  ( l  8,:$0Z2 c5Example server Bind and listen at port 65000 Accept incoming connection Read message sent by client Write message to SYS$OUTPUT Close connection Go back and accept next incoming connectionh/X// / 0040UlKd40dd40dd40dd40dd40dd+40dd(111u@ p,0%uv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5118</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Du   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  (x 8j :: $0Q> 5#define SERVER_PORT 65000 /* server's port number to use */ /* ** ** UCX-compatible Stream (TCP) Server using BGDRIVER $QIOs ** ** To build against TCPware on VAX: ** $ CC/DEFINE=TCPWARE UCX_SERVER ** $ LINK UCX_SERVER,TCPWARE:UCX$IPC/LIB,SYS$INPUT/OPTIONS ** SYS$SHARE:VAXCRTL/SHARE ** ** To build against TCPware on AXP: ** $ CC/DEFINE=TCPWARE/STANDARD=VAXC UCX_SERVER ** $ LINK UCX_SERVER ** ** To build against UCX on VAX: ** $ CC UCX_SERVER ** $ LINK UCX_SERVER,SYS$LIBRARY:UCX$IPC/LIB,SYS$INPUT/OPTIONS ** SYS$SHARE:VAXCRTL/SHARE ** ** To build against UCX on AXP: ** $ CC/STANDARD=VAXC UCX_SERVER ** $ LINK UCX_SERVER */</,// 0x0?40dd40dd40dd=40dd40dd%40dd&40dd?40dd40dd40dd%40dd440dd40dd40dd!40dd40ddC40dd40dd40dd!40dd%40dd40dd40dd(1119v@ p,0%vv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5119</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dv   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 c  (G| 8 : $0_K W5#include #include #include #include #include #include #ifdef TCPWARE #include "TCPWARE_INCLUDE:ucx$inetdef.h" /* Provided by TCPware install */ #else /* assume UCX */ #include /* Provided during UCX installation */ #endif /* ** Macros to check VMS success/failure status */ #define SUCCESS(status) (status&1) #define FAILURE(status) (!(status&1)) /* ** Values for boolean variables */ #define FALSE 0 #define TRUE 1</,/W/ @00040dd40dd40dd40dd40dd40dd40ddL40ddY40ddb40dd40dd40dd40dd/40dd40dd$40dd'40dd40dd 40dd40dd40dd40dd(11W1gw@ p,0%wv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5120</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dw   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  (wP G 8 : $0 *y 5main() { int status; /* For return status */ short listen_chan; /* Listening device's channel */ short con_chan; /* Accepted connection's channel */ short sck_parm[2]; /* Socket creation parameter */ short iosb[4]; /* I/O status block */ char buf[512]; /* buffer for received data */ int buflen = 512; /* buffer length */ unsigned char *ria; /* remote host's internet address */ int r_retlen; /* length of remote host name structure */ int connected; /* boolean */ /* Socket name structures for local and remote endpoints ** (filled in during IO$_ACCESS|IO$M_ACCEPT) */ struct SOCKADDRIN local_host, remote_host; /* UCX item list 2 descriptor used for local host name ** (filled in during IO$_ACCESS|IO$M_ACCEPT) */ struct IL2 { unsigned int il2_length; char *il2_address; } lhst_adrs = {sizeof local_host, &local_host};</,// @000 40dd&40dd640ddI40dd440dd;40dd040dd'40dd;40dd;40dd 40dd;40dd/40dd40dd.40dd:40dd/40dd40dd40dd40dd40dd040dd(111?x@ p,0%xv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5121</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dx   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 i  ( 8 : $0QQ 42dd3w5 /* ** UCX item list 3 descriptor used for remote host name ** (filled in during IO$_ACCESS|IO$M_ACCEPT) */ struct IL3 { unsigned int il3_length; char *il3_address; unsigned int il3_retlen; } rhst_adrs = {sizeof remote_host, &remote_host, &r_retlen}; /* ** String descriptor used during $ASSIGN BG0: */ struct dsc$descriptor inet_dev = {10, DSC$K_CLASS_S, DSC$K_DTYPE_T, "UCX$DEVICE"}; /* ** Socket options item list (used during IO$_SETMODE that ** creates the listen socket to set the REUSEADDR option) */ int optval = 1; /* option value = 1 means turn it on */ struct { short len, param; int *ptr; } item_list[] = {{sizeof(optval), UCX$C_REUSEADDR, &optval}}, options = {sizeof(item_list), UCX$C_SOCKOPT, item_list}; </,// @00040dd940dd.40dd40dd40dd40dd40dd40dd>40dd40dd040dd40dd"40dd440dd40dd<40dd<40dd40dd;40dd(40dd>40dd;40dd(111:y@ p,0%yv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5122</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dy   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 d ( 8:$0LH5 /* ** Assign a channel for the listen socket. */ status = sys$assign(&inet_dev, &listen_chan, 0, 0); if (FAILURE(status)) { printf("Failed to assign channel to UCX device.\n"); exit(status); } /* ** Create the listen socket and set the REUSEADDR option. */ sck_parm[0] = UCX$C_TCP; /* TCP protocol */ sck_parm[1] = INET_PROTYP$C_STREAM; /* stream type of socket */ status = sys$qiow( 3, /* Event flag */ listen_chan, /* Channel number */ IO$_SETMODE, /* I/O function */ iosb, /* I/O status block */ 0, 0, &sck_parm, 0, /* P1 Socket creation parameter */ 0, 0, &options, 0); /* P5 Socket option descriptor */ if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) {printf("Failed to create the device socket.\n"); exit(status); }/// (/ / +/ s/ 7/ / / / "/ / / )/ N/ G/ / / #/ / / / !/ / 0x040dd-40dd40dd540dd40dd740dd40dd40dd<40dd40dd.40ddA40dd;40dd(40dd&40dd540dd 40dd940dd 40dd840dd(40ddH40dd40dd(11H1z@ p,0%zv ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5123</,//  X0H040dd(111  (vX  8  (v 8   (C; 8Dz   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 c  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  ( 8D : $0Q 42dd3w5 /* ** Bind and listen to specified port number (after REUSEADDR is set above). */ local_host.SIN$W_FAMILY = UCX$C_AF_INET; /* INET (TCP/IP) family */ local_host.SIN$L_ADDR = UCX$C_INADDR_ANY; /* any address */ local_host.SIN$W_PORT = htons( SERVER_PORT ); /* server's port # */ status = sys$qiow( 3, /* Event flag */ listen_chan, /* Channel number */ IO$_SETMODE, /* I/O function */ iosb, /* I/O status block */ 0, 0, 0, 0, &lhst_adrs, /* P3 local socket name */ 5, /* P4 Connection backlog */ 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) { printf("Failed to bind the device socket.\n"); exit(status); } else printf("Port is bound and listening\n"); /// )/ %/ / / N/ ;/ S/ / @00040ddN40dd40ddI40ddD40ddH40dd40dd,40dd(40dd&40dd#40dd 40dd 40dd-40dd&40dd 40dd(40dd40dd140dd40dd 40dd-40dd(111{@ p,0%{v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5124</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D{   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111   (A 8 :Q $0Qh$ 5 /******************************************************/ /* Main server loop */ /* 1. accept new connection */ /* 2. read message from client */ /* 3. print message to SYS$OUTPUT */ /* 4. close connection */ /* 5. go to step 1 */ /*****************************************************/ while ( 1 ) { /* sit in this loop forever (break with CTRL-Y) */ /* ** Assign channel for the new connection */ status = sys$assign(&inet_dev, &con_chan, 0, 0); if (FAILURE(status)) { printf("Failed to assign channel for accept.\n"); exit(status); }/// F/ ;/ -/ o/ 00:40dd940dd:40dd940dd540dd940dd:40dd940dd40ddF40dd40dd40dd-40dd40dd40dd440dd40dd740dd40dd40dd(111|@ p,0%|v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5125</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D|   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 -  (G^I (       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8 :m $0{  42dd3w 5 /* ** Accept a connection from a client. */ status = sys$qiow( 3, /* Event flag */ listen_chan, /* listen channel number */ IO$_ACCESS|IO$M_ACCEPT, /* I/O function */ iosb, /* I/O status block */ 0, 0, 0, 0, &rhst_adrs, /* P3 Remote IP address*/ &con_chan, /* P4 Channel for new socket */ 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) { printf("Failed to accept a connection from a client.\n"); exit(status); } /* ** Print out the connecting client's internet address & port */ ria = &remote_host.SIN$L_ADDR; printf("Connection from host: %d.%d.%d.%d, port: %d\n", ria[0], ria[1], ria[2], ria[3], htons(remote_host.SIN$W_PORT)); // / #/ / / / e/ E/ g/ / 0x040dd*40dd40dd-40dd240dd340dd)40dd40dd40dd140dd640dd40dd*40dd40dd?40dd40dd40dd@40dd40dd"40dd;40dd#40dd#40dd(11 1Q}@ p,0%}v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5126</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D}   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111 {  (GD@ 8 : $0 #c #5 /* ** Read data from client (and write it to SYS$OUTPUT) ** until client closes it's end of the connection ** ** Note that this client/server combination implements ** a very simple message protocol - the client simply ** sends a text string of any size and then closes ** the connection. The server simply keeps reading ** (and printing the received text to SYS$OUTPUT) ** until the connection is closed by the client. ** ** Recall that the TCP byte-stream does NOT guarantee ** a one-to-one correspondence of client writes to server ** reads, so you may see several reads for the client's ** single write. (With the short message used here, ** you probably won't, but you might.) */ connected = TRUE; while ( connected ) { // / 3/ / 1/ / / 0040dd:40dd640dd40dd;40dd:40dd740dd940dd640dd540dd40dd:40dd>40dd<40dd;40dd+40dd40dd40dd40dd40dd(11#1~@ p,0%~v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5127</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D~   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 B  (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  (  8# : $0!  5 /* ** Read I/O buffer */ status = sys$qiow( 3, /* Event flag */ con_chan, /* Channel number */ IO$_READVBLK, /* I/O function */ iosb, /* I/O status block */ 0, 0, /* no AST, no AST parm */ buf, /* P1 buffer */ buflen, /* P2 buffer length */ 0, 0, 0, 0); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) { if (status != SS$_LINKDISCON ) { /* SS$_LINKDISCON indicates normal termination */ printf("Failed to read from socket.\n"); printf("iosb[0] = 0x%x\n", iosb[0] ); printf("iosb[1] = 0x%x\n", iosb[1] ); } connected = FALSE; /* terminate while loop */ } else { /* All is well, print message */ buf[iosb[1]] = '\0'; /* make sure message is null-terminated */ printf ("Received text: %s\n", buf); } } /* end of connected while loop *//// / / / / \/ S/ K/ k/ / / 0x040dd40dd40dd-40dd140dd+40dd(40dd+40dd!40dd*40dd40dd,40dd40dd\40dd+40dd(40dd040ddC40dd 40dd(40ddH40dd240dd(40dd(111d@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5128</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//(Q X0H040dd(111  (sX 8 : $09;v :5/* ** Shut down the socket that was connected to the client ** and deassign the channel used with that socket. */ status = sys$qiow( 3, con_chan, IO$_DEACCESS|IO$M_SHUTDOWN, iosb, 0, 0, 0, 0, 0, UCX$C_DSC_ALL, /* P4 Discard all packets */ 0, 0 ); if (SUCCESS(status)) status = iosb[0]; if (FAILURE(status)) printf("Failed to shut down the client socket.\n"); status = sys$dassgn(con_chan); if (FAILURE(status)) printf("Failed to deassign the client socket.\n"); printf("FYI: Port is still bound and listening...\n"); } /* end of main while loop */ /* ** Note: We don't explicitly shutdown the listen socket ** and deassign the listen channel. This will be done ** during image run-down whey you CTRL-Y EXIT the program */ }/// / _/ / / 6/ -/ 4/ / "/ d/ 00>40dd;40dd40dd40dd$40dd40dd40dd40dd440dd40dd*40dd40dd940dd"40dd40dd840dd:40dd"40dd40dd;40dd940dd;40dd40dd40dd(11:1v?@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 & ($X   8 #f$#00X   567</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 05  (p  8  (p 8 X   (@  8:#$#0] (5Datagram (UDP) Client/Server</,//(Q X0H040dd(111  ( 8 + ( 8:k$0B5close()</,// X0H040dd(111 , ( 8:l$0B5sendto()</,// X0H040dd(111 . ( 8:n$0B 5recvfrom()</,/ / X0H0 40dd(11 1 - ( 8:m$0R 5connect()</,/ / X0H0 40dd(11 1 , ( 8:l$0R5sendto()</,// X0H040dd(111 . ( 8:n$0R 5recvfrom()</,/ / X0H0 40dd(11 1 + ( 8:k$0R5close()</,// X0H040dd(111 * (' 8:j$0R5bind()</,// X0H040dd(111 * (g 8:j$05Client</,// X0H040dd(111 z __  8 z NN  8 2 (t[ 8:r$0q>5data (request)</,// X0H040dd(111 0 (<Q# 8:p$0Y 5data (reply)</,/ / X0H0 40dd(11 1 z (  8 z   8 z   8 z   8 z   8 z   8 z   8  ( p.*`' p 8  ( p.*` p 8  ( p.*` p 8  ( p.*` p 8  ( p.*P p 8  ( p.*P p 8 , ( 8:l$0B5socket()</,// X0H040dd(111  (_ 8 * ( 8:j$0B5bind()</,// X0H040dd(111  (&%a 8  (V 8  ( p.*P' p 8  ( p.*P p 8  ( p.*`9 p 8 , ( 8:l$0R5socket()</,// X0H040dd(111 z NN  8 z M_  8 z __  8 G (' 8:$0b yO 5retransmit?</,/ / X0H0 40dd(11 1 * (&w 8:j$0`z5Server</,// X0H040dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5130</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//(Q X0H040dd(111    (  8m:=$0* c5Create network device ($ASSIGN BG0:) [Optional] Connect to server ($QIO IO$_ACCESS) UDP is connectionless Simply specifies communication endpoint for send Send a request datagram ($QIO IO$_WRITEVBLK) Start a timer Receive reply datagram ($QIO IO$_READVBLK) If timer expires during receive, repeat at step 3 If more to request, go to step 3 Close and deallocate network device ($QIO IO$_DEACCESS followed by $DASSGN)//V/ G/ f/ 2/ l/ 00%40Q1Kd140Q2Kd40dd140dd-40Q3Kd40Q4Kd+40Q5Kd240dd!40Q6KdK40Q7Kd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5131</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Server</,//(Q X0H040dd(111    (@  8k:;$0z-V 5Create network device ($ASSIGN BG0:) Bind network device to well-known port ($QIO IO$_SETMODE) Wait for request ($QIO IO$_READVBLK) Send reply ($QIO IO$_WRITEVBLK) Go to step 3</,// x0h0%40Q1Kd@40Q2Kd&40Q3Kd 40Q4Kd 40Q5Kd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5132</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 V  (p  8  (p 8 V   (@@  8:#~$#0z]V &5More Sophisticated Servers</,//(Q X0H040dd(111    (@  8:$0z-V 5Multithreaded Servers Use ASTs (or Event Flags) One thread for each connection Must maintain context block for each connectionh/X// j/ 00 040UlKd40dd40dd140dd(111@ p,0%v ,0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5133</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5More Sophisticated Servers</,//(Q X0H040dd(111 (   (  8:P$0 5Server started by INET Master Server (inetd) On UCX this is a UCX auxiliary server One server process per connection Easily supports multiple connections Costs a VMS process Add server information to inetd database Server automatically started when connection request comes in to host UCX master server invokes .COM or .EXE Servers input, output, error files assigned to BG device Master server does socket,bind,listen,accept//-/ J/ 9/ o/ / 00-40UlKd(40dd"40dd%40dd40dd)40ddF40dd'40dd:40dd440dd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011 : (2g 8:z$0l{J"5Looking Ahead to IPv6 </,//,33 X0H040dd(111L @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 I   (@@  8:#q$#0z]V  5Why a New IP?</,/ /(Q X0H0 40dd(11 1 c   (@  8:$0z-V 3O5IP address exhaustion Routing table growth Improved security Quality of service</,/O/ 00 040UlKd40UlKd40UlKd40UlKd(11O1@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Major IPv6 Features</,//(Q X0H040dd(111    (@  8N:$0z-V 5Expanded addressing -128 bit addresses! 340,282,366,920,938,463,463,374,607,431,768,211,456 addresses! Specified as 8 16-bit hexadecimal numbers separated by colons Autoconfiguration Throughput control and management Authentication and confidentially//(/ }/ U/ 00(40UlKd?40dd>40dd40UlKd"40UlKd!40UlKd(111.@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 S   (@@  8:#{$#0z]V #5IPv6 Socket Programming</,//(Q X0H040dd(111 ;   (@  8:c$0z-V  5New address and protocol families AF_INET6 and PF_INET6 New address and sockaddr structures No changes to existing socket routines New socket routines New host lookup and conversion routines See RFC 2133//"/ / / / 00"40UlKd40dd$40UlKd'40UlKd40UlKd(40UlKd 40TlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 1  (p  8  (p 8 N   (@@  8:#v$#0z]V 5in6_addr Structure</,//(Q X0H040dd(111    (@  8:$0z-V sG5#include struct in6_addr { u_int8_t s6_addr[16]; };</,/G/ x0h040TlKd40TlKd40TlKd40TlKd40TlKd(11G1@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 k  (p  8  (p 8 [   (@  8:#$#0J] +5sockaddr_in6 Structure (4.3bsd)</,//(Q X0H040dd(111    (@  8(:$0z-V 5#include struct sockaddr_in6 { u_int16m_t sin6_family; u_int16m_t sin6_port; u_int32m_t sin6_flowinfo; struct in6_addr sin6_addr; };</,// P0@040TlKd40TlKd40TlKd40TlKd40TlKd40TlKd40TlKd40TlKd(111&@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 [   (@P  8:#$#0] +5sockaddr_in6 Structure (4.4bsd)</,//(Q X0H040dd(111 +   (@  8:S$0z-V 5#include struct sockaddr_in6 { u_char sin6_len; u_char sin6_family; u_int16m_t sin6_port; u_int32m_t sin6_flowinfo; struct in6_addr sin6_addr; };</,// 0040TlKd40TlKd40TlKd40TlKd40TlKd40TlKd40TlKd40TlKd40TlKd(111@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 9  (p  8  (p 8 W   (@@  8:#$#0z]V '5Existing Routines Unchanged</,//(Q X0H040dd(111    (@  8:$0z-V r5Existing socket routines continue to work as before IPv6 support is relatively easy to add: Need to support the new 128-bit addresses Need to use the new sockaddr_in6 socket address structures Can then support both IPv4 and IPv6 addresses//\/ e/ -/ x0h0440UlKd(40UlKd*40dd;40dd-40UlKd(1115@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 T   (@@  8:#|$#0z]V $5Existing Socket Routines</,//(Q X0H040dd(111 A   (@  8:i$0z-V 5socket call can specify a new IPv6 address family: socket(AF_INET6, SOCK_STREAM, 0) AF_INET sockets can only handle IPv4 addresses To support IPv6 (and IPv4), applications must use AF_INET6 sockets/// -/ / / q/ 00T40UlKd/40ddB40dd(111@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 L   (p  8  (p 8 T   (@@  8:#|$#0z]V $5Existing Socket Routines</,//(Q X0H040dd(111    (@  8:$0z-V 5Must specify corresponding socket address structure based on socket call when calling bind, connect, sendto, sendmsg: AF_INET --> sockaddr_in AF_INET6 --> sockaddr_in6 And, corresponding structure is returned for accept, recvfrom, recvmsg, getpeername, getsockname//=/ / / / / / / / / / / 2/ -/ / / / / / / / / / 00 0v40UlKd40dd40dd`40UlKd(111@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 <   (p  8  (p 8 O   (@@  8:#w$#0z]V 5New Socket Routines</,//(Q X0H040dd(111    (@  8:$0z-V }5Interface to/from name index routines if_nametoindex, if_indextoname, if_nameindex, if_freenameindex New socket options (setsockopt, getsockopt) IPV6_ADDRFORM can be used to set or get the address family for the socket IPV6_UNICAST_HOPS to set hops And, multicasting optionsx/h/&/ / / / / / / / / / / / / / x0h0e40UlKd-40UlKdJ40dd 40dd40dd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 U   (@@  8:#}$#0z]V %5Host Lookup - The Problem</,//(Q X0H040dd(111    (@  8E:$0z-V 5Existing gethostbyname routine doesnt have argument to specify address family Need a means to request either IPv4 or IPv6 addresses Dont want to break existing applications that havent been upgraded// / / / 00O40UlKd640UlKdD40UlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 x  (p  8  (p 8 T   (@@  8:#|$#0z]V $5Host Lookup - Solution 1</,//(Q X0H040dd(111    (@  8<: $0z-V 5New bit, RES_USE_INET6, added to _res.options to request IPv6 addresses - when set: DNS resolver looks for AAAA records first, then A records Always returns IPv6 addresses or IPv4-mapped IPv6 addresses (h_length=16) in hostent structureh/X/T/ / 00T40UlKd:40dd^40dd(111?@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 T   (@@  8:#|$#0z]V $5Host Lookup - Solution 2</,//(Q X0H040dd(111 K   (@  8:s$0z-V 5New routine defined: struct hostent *gethostbyname2(const char *name, int af); Returns addresses in requested address family format h_length=4 for AF_INET h_length=16 for AF_INET6/// :/  5/ // 00 0O40UlKd540UlKd40dd40dd(111e @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 J   (@@  8:#r$#0z]V 5Address Lookup</,//(Q X0H040dd(111 {   (@  8:$0z-V K5gethostbyaddr already has an af (address family) argument so it isnt a problem IPv6 applications just need to change the af argument from AF_INET to AF_INET6 // / C/ O/ 00P40UlKdO40dd(111@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 0  (p  8  (p 8 O   (@@  8:#w$#0z]V 5New Lookup Routines</,//(Q X0H040dd(111    (@  8:$0z-V q5New host name and/or service name and and address and/or port lookup routines have been defined: getaddrinfo getnameinfo These routines can simplify code as they can lookup both in a single call However, they use some new data structures//a/ / t/ x0h0a40UlKd 40dd 40ddJ40UlKd*40UlKd(111d@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 S   (@@  8:#{$#0z]V #5New Conversion Routines</,//(Q X0H040dd(111 q   (@  8:$0z-V A5ASCII text address to numeric binary form: int inet_pton(int af, const char *src, void *dst); Numeric binary to ASCII text address form: const char *inet_ntop(int af, const void *src, char *dst, size_t size); Handle IPv4 and IPv6 address formats//+/ 3/ +/ H/ $/ 00^40UlKds40UlKd$40UlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 P   (@@  8:#x$#0z]V  5Other Considerations</,//(Q X0H040dd(111    (@  8L:$0z-V 5Old assumptions about IPv4 addresses being ints is no longer valid with IPv6 addresses Need to manipulate IPv6 addresses as structures Example: IPv6 wildcard address extern const struct in6_addr in6addr_any;//X/ O/ )/  00X40UlKd040ddH40dd(111-@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 P   (@@  8:#x$#0z]V  5Other Considerations</,//(Q X0H040dd(111 =   (@  8:e$0z-V  !5Applications that send IPv4 addresses over the wire or store them in files need to deal with IPv6 addresses Requires changes in protocols Requires changes in databases or file formats Applications that didnt use inet_ntoa()      !"#$%&'()*+,-./01234567`^;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~ or inet_aton() to convert addresses need to use the new routinesD/4/l/ L/ / / / / 2/ 00 0l40UlKd40dd.40ddi40UlKd(11!1 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 C   (@@  8:#k$#0z]V 5Summary</,//(Q X0H040dd(111    (@  8k:;$0z-V 5Adding IPv6 support to most applications should be relatively easy to do API is easy for IPv4 programmers to understand and changes are fairly minor See RFC 2133 for more details And, of course, check your software vendors documentation for full details </,// 00 0I40UlKdL40UlKd40UlKdL40UlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (lD 8t=D$Ĥ0p42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011 < (g 8:|$0OJ$5TCP/IP Programming Tips </,//,33 X0H040dd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 \ C   (@@  8:#k$#0z]V 5WINSOCK</,//(Q X0H040dd(111    (@  8Q:!$0z-V 5Must call WSAStartup and WSACleanup Must use closesocket instead of close Must use socket I/O routines (send, recv, sendto, recvfrom) instead of file I/O routines Error status is obtained by calling WSAGetLastError (not in errno)</,// 00 0$40UlKd&40UlKdY40UlKdB40UlKd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8  Q   (@@  8:#y$#0z]V !5Improving Performance</,//(Q X0H040dd(111 A   (@  8:i$0z-V 5Do large reads! Avoid reading a byte at a time! Read large buffer and process it Do large sends! Avoid multiple sends when one would do Build data into buffer and send it instead Avoid TCP send policy problems/// A/ / p/ 0040UlKd 40dd!40dd40UlKd'40dd+40dd40dd(111u@ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 = M   (@@  8:#u$#0z]V 5Pitfalls to Avoid</,//(Q X0H040dd(111    (@  8(:$0z-V 5Reading data Dont assume youll get it all in a single read Loop back to read remainder into buffer Timeouts? Byte ordering issues between platforms Use htonl/htons when sending binary data Use ntohl/ntohs when receiving binary data Dont forget about floating point data formats// / b/ '/ / P0@0 40UlKd040dd(40dd 40dd'40UlKd)40dd+40dd.40dd(111 @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8  T   (@@  8:#|$#0z]V $5Options and Other Things</,//(Q X0H040dd(111    (@  8r:B$0z-V v5SO_KEEPALIVE SO_SNDBUF/SO_RCVBUF SO_REUSEADDR TCP NoDelay UDP Multicasting and Broadcasting Using the Loopback Address</,/v/ 00 40UlKd40UlKd 40UlKd 40UlKd"40UlKd40UlKd(11v1w @ p,0%v ,0H./04x$xa(  (v 8 (   (C; 8D   (lD 8t<D$Ĥ0p42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 ? W   (@@  8:#$#0z]V '5Follow Reasonable Practices</,//(Q X0H040dd(111    (@  8 :$0z-V D5Be flexible in what you can receive Be conservative in what you send</,/D/ 00$40UlKd 40UlKd(11D1@ p,0%v ,0H./04x$xa(  (v 8 (   (lD 8t=D$Ĥ0p42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8 K  (p  8  (p 8    (@@  8t:#D$#0z]V 42dd3(Qw5//0011  (~l 8F:$02"5Thats all folks Any Questions? </,/"/,33 0040dd40dd40dd(11"1  (<  8x E ( Object1ClipMS_ClipArt_Gallery.2-Microsoft Clip Gallery@   $*@ p,0%v , &FMicrosoft ClipArt GalleryMS_ClipArt_GalleryMS_ClipArt_Gallery9q(All Categories)C:\MSOffice\Clipart\Pcsfiles\popular.pcsj(jh=j](jjdj;=j](j(j]dHj{jkdH`,j,u@t@jLj`j APS%(All Categories)(C:\MSOffice\Clipart\Pcsfiles\popular.pcsCompObjxOlePres000:VFOle10NativePersistentStorage Directory8 >l$'.F #    s  &s[J & &$TNPPMicrosoft PowerPoint & TNPPP & &TNPP s  a.@@ @@@@@```Pp@@@45&W&W&$W&O<- "- "- $4G4 & &${&i0-$ #i f.0. & &i@-$ " wi & &:s-$ ">0Teqsq_eX:> & &'-$ "N $%'%K &  &  & &wG& 2G& 2G& 2G&=5 "-N$%RLE@==@E N\"f(s,-,(" dda]X & &Vu--vV &  & &*%&kFS- "-SFk & &ds-- "-&$dsrs~~wrlhgd & &di```-- "-$rsdsdiris~ & &d^{-- "-$ridid^r^is & &dSq```-- "-$r^q^d^dSrS^i & &dNf-- "-$rSdSkNNS^ &  &  & &*#&d-- @@@"-<$df}izlyrvyuuuuvyz{ |vrmh f d & &nv{--{ "-nn--' &  & &N+5- "- $N+N--+ &  & &w;&/&$3-- "-$ N++NN::$$::N & &w--,w "-Y--' &  & &w;&+- "-$ N+M$L+ & &M+-- "- $i+Mw+ &  &  &  &  & &&#Zq-- "-&$Z3Ni5`PJU U<h# & & "--%p;  & &Z k& -- "-$Ti =Keew .U e7$(7XFZis/GUMy/~g2B-q_@Ko8E(.dw5 =V~zb="&X+VG & &C--V$) .U b3#'6UEYhp~-FSKv-|e0@+o\>Jn7C & & "-$ .I aQ}s]T<# &  & &  "--%Uf =Heat .U c4$(7UFZip+GSMu+|g0B-n\<Kl8A(,dw5 9S~wb=""U'T~Df & &7&=^-- "-|$<=S^_RJEdDSD?E)JR]pxe^_'bFjjx)Ei+Tr~p ` S8 qp[c9R  & &R$p-- "-f$1c9.ooGM,$$'<Tu}uoXSRj uDcq|lD$&Gd}9n & &D:v&@ -- "-d$0 _   zupg^ Y JA7 )   & & -- "-2$ & & - "-:$Zs{xricUI>2'  & &bXwk& C--C "-vj--' & &Q--Q "-~w --' &  & &Xk&-- "-v{--' & &-- "-~ --' &  & &{@ - "-${'{ &  & &e&bP-- "- $iomhcbbflotyzx & &c- "- $m1tBqRjcdtc~chnwtgyO~>-} &  & &Sw-- "-$ Sm|xyxxwhy & &>G& \  "--% 2M^o.GT & &jGV&GVi%GVh_a^ZY & &/l|% /tNn_luqrrnor &  & &]%]ahnw~ & &d %dw & &sb&Yw-- $ 6Zjrtwvymi\^LY=Y- & &Z "-- % 7\ltvyx{qj^_MZ>Z0 &  &  &  & &Ll&R-- "-($#?G6%g =Jedv .U222Zu C4Ug &  &  & &VS&Vo&+<-- "-l$4>44X PmS7 lTA++/; V{lVB2Nq q@^[P{B;&3G]w^+4 & &B;@-- "-D$  9g{jFn:t3Z3ZfDnxh,g:D & &E&?3&T "--% Tqm & & % & &*% *GL;L`LLdwF &  & &3E&4% , 7Yo & &h,(%$'Jp 8Rwdrrih & &8--8 "-8--' &  &  &  & &Sg&- "-$@&R|w"2E[m}[*zxcBM 'kB"'Pj  8Pj~+6;> 6g~ & &:P-- "-$?:M`;= HV-_"' =R`k"s+x7xGvUqucyubR>0~zVsEH'|hYH3%~nd[RJ & &|P&|)&)&Im-- "-mI & &\~@@-- "-~\ & &hq--rh &  & &|&UB- "-BU & &d$@@-- "-$d & & nw--xn &  &  & &P&&ON "--% XOORV XTT'X7kF{ & &h%~%hnv vuq & &@"% $/6 8 &  & &P& =% 58&k & &&a2 %Y7,!&* &  &  &  &  & &[&=Ch-- "->$`MH GEA@>=%=)=,=0>2@6C9G:I;O:U9X6[1],_%_\ZZZ[ & &.j- "->$bTROMIFCA=;86310...0158=AFKQX & &<K- "-L$$C9,"  "*-12 4 4410- *!&"!#%%# #%&*-26< & &X- "-L$$|sib^ZYXXXZ\^bfjoty &  &  & &u!&cWL-- "-J$#cl_XTW_uzz!u%l$_!H  !*3x:d@YD>) & &&t) "-- %!~t & &  % & & % &  &  &  & &TNPP & --'"PowerPoint DocumentJeff SchreiberMicrosoft (R) PowerPoint (R) Windows _՜.+,0 hp  5On-screen ShowPn 0H./04x$xa(  (v 8   ($ 8 ' ($X   8 #g$#00X   5154</,//  X0H040dd(111  (vX  8  (v 8   (C; 8D   (lD  8t=D$Ĥ0  42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 F   (@@  8:#n$#0z]V  5References</,/ /(Q X0H0 40dd(11 1    ( o 8Z:*$0 R5DEC TCP/IP Services for OpenVMS system Services and C Socket Programming manual Documentation for BG and socket routines DEC OpenVMS System Services Reference manual SYS$ASSIGN, SYS$QIO(W), SYS$DASSGN Programming manuals for 3rd party TCP/IP stacks When using UCX emulation, usually only need compile and link information; otherwise use DEC TCP/IP Services manuals Internetworking with TCP/IP, Volume III: Client-Server Programming and Applications (BSD Socket Version), Douglas E. Comer and David L. Stevens, Prentice-Hall, Inc. 1993. ISBN #0-13-474222-2 Internetworking with TCP/IP, Volume I, Principles, Protocols, and Architecture, @3rd ed., Douglas E. Comer, Prentice-Hall, Inc. 1995. ISBN #0-13-468505-9D/4/P/ )/ -/ #/ 0/ t/ Y/ P0@0P40UlKd)40dd-40UlKd#40dd040UlKdt40dd40UlKd40UlKd(111_@ p,0%v ,0H./04x$xa(  (v 8 (   (lD  8t=D$Ĥ0 42dd3 w5//0011   (C; 8D  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 D   (@@  8:#l$#0z]V 5Handouts</,//(Q X0H040dd(111 { (@@  8:$0z c42dU3wC5Slides available via anonymous FTP: Slides: ftp://ftp.process.com/decus/ireland_99/tcp_ip_programming.ppt ftp://ftp.process.com/decus/ireland_99/tcp_ip_programming.ps Examples: ftp://ftp.process.com/decus/ireland_99/tcp_ip_programming_sock.txt ftp://ftp.process.com/decus/ireland_99/tcp_ip_programming_qio.txt //0/ }/ / / / P0@0$40dU 40dU?40dU>40dU40dUD40dUC40dU40dU(11C1 @ pw$7̙33$73$73333f$7999MMM$7f$7f3$73 8.04x$xw&UGGGى  (@ p 8;*  =  (p  8:e$@0  5*</,// X0H040dd(111 =  (p 8:e$@0 V 5*</,// X0H040dd(111 =  (  8:e$@0 V  5*</,// X0H040dd(111 X 4  (9 C 8od  (\9 t 8ى` I  (@@  8:#q$D#0z]V  5 Master title</,/ /(Q X0H0 40dd(11 1   (@  8:$D0z-V tT5Click to edit Master text styles Second Level Third Level Fourth Level Fifth Level *//!/ / / / / / x0h0!40UlKd 40dd 40dd 40dd 40dd@101S11 % (?- 8:e$0yO 5*</,//  X0H040dd(111  (@ 8 Ԇ   (@Q@Q  8a *@QQ@@Q  (Y*Y*  8 J|||Y))''%}%|#|!|YYZZ\^^^^!^#^%\%\'Z'Y'Y)|  (<*<*  8 2!#%%''))'''%%#! !#%''););'9'7%6%6#4#4!2!200."$&&(*,.0244667779999999999997776644220.,*(&$"     (M+M+  8 gggiiiikkmmoqssuvxz|~ ~||zxvusqomm k kiiiigggg~zxusqmkigca_^\ZXXVTRRPPNNNMMMMMMMMMNN NPPRRTVXXZ\^!_#a#c%g'i'k)m)q)s*u*x*z*~*******)))''%##! g  (/-/-  8 z*(&&$"   !##%'')))*****,,*** * * ***)))'''% %"%"#$#&#&!(!*!*#,#.#           (A/A/C  8 C^AAABDDDFFF!D!D#D%B%B'A'A)))**,,..^^{}  }{^^  (++   8      %'%%###%%%''''))))))****************)))'''%%# # ! !      (%+%+  8 vx~|zxvtsqqomkigfdb`_][YWUSQMKJHFCA?=;975420.,,*********,,..02244579;=?ACEHJKMQSUWY[]_`bdfgiikm m o ooommkiigffdb`_][YWUSQOMKJHFECA?=;9755444 4 2 %%&'(%*%*#,#,%.%0%2%2'4'5'7'9);)=)?)A)C*E*H*J*K*M*Q*S*U*Y*[*_*`*b*f*g*i)k)m)o's't't%v%x#z#|!~!~ ~~|zzxvtsqomkigfb`_][YWUSQOMKJHFECAAACCEEFHJKMOQSUWY[]_`bbdfgikkmoqqsttvvv  (Q+Q+D  8 " D;?LIIGGECA?=;9754420.,*(&$"    "$&&(*,.0022222 2 200.,**(&$"     #%##!!!###%%%''''')))))* * ******* *$*&**),)0)2'4'5%9%;#=#?!ACEEGIIJLLLNNN N PPPNNNNNLLLJJIGGECA?=;97542.,*&$    "$&(*,.00245799;;===;  (a+a+  8 }}}}}   }}}}}}{ywutrpnljjhffddbbbaaaaaaabbb ddffhjjlnprt!u#w#y%{'}')))***********)))''%##! } l (9*9*9  8 9/1355588555331/!#%%''))''%%##!    # # , (M*M*1  8 1Voo!o#o%m%m'k'i'i))'''%%#!VTRPPNMMNPPPRTV  (X*X*f  8 2f!#%%''))''%%#! !!##%%''):):'8'8%6%6#6!8!8MOOOQQQSSUUWWW6668::::8)    (X*X*C  8 Cuuuwyyywwww```^^^]!]#[#[%Y%Y'X'X)y)y'w'u%t#t!tuw!#%%''))'%%#!}}  (:*:*  8 2!#%%''))''%%##!!!#%%'')9)9'7'7%5%4#2!200.."$&(*,..0022445557779999999977755420.,,*(&$"         (Q/Q/E  8 *EqQQQRTTVVVV!V#V%T%T'R'Q'Q)))***,..qq     qq  (fgfg  8 bkkmmmmmmmkkkiiiihhhhhhhgggggghhhhiikk~m|ozoxqvsussuqwoymzm|k~iigggfffffffffgggiikmmoqsuvxz|~~~~||||||||||~~~~  ($w{$w{  8 b::::<<>>@@BBDFFHJKMOPRTVXXZ\^^__aaaccccccccaaa__^\ZZXVTTRPOMKJHFDDB@>>><<<:::::OwMwJwHwFwDw@x>xBDFHJMOPRVXZ\^_acegikmoqqsuuvvxxzzzzzzzzzzzxxxvuusqomki}i{g{eycy_x^x\xZwXwVwRwPwOw: < (y/y/s  8 syyyy{}}  ..,,*(&&$$" ""$&(**,,,,....,,,,**((&&}$}${"{ { yyyyyyyyyy  y  (yyg  8 :g}{{yyyyyyyyyyyy{{}  (;w;w  8 RQQQQSSUUWWYY[]]_`bdfgikmoqsttvvxxxzzzzzzzzxxxvvtsqomkkigfdb`_][[YWUUUSSSQQQQQfwbw`w_w]w[wWxUxSxQyOyM{K{J}JHFDBB@@><<;;;;;;;;;;;;;<<>>@@BDDFHJJKMOQSUY[]_`dfgimoqstvxz|~}~{|yzyvxtxsxqwowmwiwgwfwQ < (yFyFs  8 s&yyyy{}} $$&&&$$EECCA?==;;902455799;=?AACCCCEEECCCCAA?==};}9{7{7y5y4y2y0y.y,y*y(y&y  "$&(**,,,,,**(&$"  &y T (yy6  8 6yyy{}}{yyy  (MsMs,  8 b,TiiiiggeesstvvxxTxRxRvPvPtPsMsMPPPRT  (y!y!  8 }{{yy yyy{{}    (ww  8 bwwwwwwxxxyy{{}}{yyxxxwwwwww t (5y5y:  8 :]y5y6y8y8{8}:}:::886655OOMMKKKKqqqqooo}{{yysyuyv{v}x}xxYYY}Y{[{[y]y'v  0H./04x$xa(  (v 8 W =   (v 8 e$D0 5*</,//  X0H040dd(111 =  ($ 8 e$D00 5*</,//  X0H040dd(111   (vY   8 #$D#0Y  x(5*1997-1999 Process Software Corporationh/X//  '/  X0H0(40dd@1011'1 =  ($Y *  8 #e$D#00Y   5*</,//  X0H040dd(111 ^  (lD 8<$D0p.R5Click to edit Master text styles Second level Third level Fourth level Fifth level//!/  /  /  /  /  x0h0!40dd 40dd 40dd 40dd 40dd(11R1   (C; 8D > (c~ 8:~$0)a&42dd3w&5______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ </,/&/ 00740dd740dd740dd740dd740dd740dd740dd740dd740dd740dd(11&1 v Ы H./04x$xa(  (v 8 Z  =   (v 8 e$D0 5*</,//  X0H040dd(111 =  ($ 8 e$D00 5*</,//  X0H040dd(111 c  (vY   8 #$D#0Y  3'51997-1999 Process Software Corporation</,/'/  X0H0'40dd(11'1 =  ($Y   8 #e$D#00Y   5*</,//  X0H040dd(111 04KdKd$de, Current UserHeader9SummaryInformation(RDocumentSummaryInformation8     Oh+'0|R0 H\    TCP/IP Protocol SuiteSCP/ Geoff Bryantol eofeof3c:\msoffice\powerpnt\template\sldshow\dbllines.pptJeff Schreibere 1346185800bMicrosoft PowerPoint 4.0lat@Z=9@{Gœ@ I j@K/@"GP%  R('&; &&#TNPP0D z & TNPP &&TNPP   ;  'A x;(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDggDaDaaagaaDagaDaDaDagaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEagEaEagEEEaEgEEEaEgEaEaEaEgEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDgaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaEaEaaEaaaaaaEaEaaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEDaDDaaDDDEDaDEaaDaDEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEEEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaagaDaDaDagaDaDaDagaDaDaDagaDaDaDaDagDgaaDDaagaDaDaDagaagDaaDDaDgaDaDgaagDaDaDagaDaDaDagaDaDaDagaDaDaDDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDEDaEaaEEEDaEaEaEaDaEEaaaaaEaaEaaDaaaaEaEaDaEaEaEaDaEaEaEaDaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaaDDaDDaDaaDDDaaDaDaDaDaDaaDDaaaDDDaaDDaaDDDaDaaaDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEEgEaaEaEgEaEaEgEaEaEaEgEaEaEaEgEEaEaEgEaEaEgEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEEaEaEaEaEaEaEaEaEaEaEaEEaEaEaEaEaaaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaaaaaDDDaaDaDaDaDaDaaDDDaaDaaDaDaaDDaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEEaEEEEaaEEaEaEaEaEaaEaaEEEaEEaEEaaEEEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaaaDDaaaaaaaDDaaDaDaDaDaDaaDDaaaDDaaDDaaaDaaDDaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaEaDaEaDaaaDaEaDaEaDaEaDaEaDaEaDaaDaEaDaEaDaEaDaEaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaDDaDaDaDaDDaDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEAAA>DAAAAADaDaAaEAAAAAEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDAA>aDaAAAaAADaAAADaDaAAAaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDAAaEaAAAAEaDaEaDAaDaAAAADaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaAaAaDaAaAADADaDaDaDAAaDaAaAADADaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>Daa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDDaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>aDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaDaDaDaDaDaDaDaDaDaDaDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>aE>EaEDA>aE>E>a>aA>DaE>DaDDaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>Daa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDaADaAAAAAAAADAAAAAaAaAaDaAAAAAAaAAaAAAAAaaDa>aAAAAAAAAAaDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDDaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DA>AAAAAAAAAAAADAD>DaA>ADADAAAAAD>aD>AAAADAAD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aADADA>ADAAaAaAAAADADA>ADaDaDAAAAaAAAAAaAA>ADaAaaAAAAAAaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>DAD>D>D>D>D>D>D>DAD>D>D>D>D>DADADAA>DAA>AAD>D>D>D>D>A>DADAA>A>A>A>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>D>a>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDDaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>D>a>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDD>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>a>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDa>a>a>aDDaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>aa>aa>aa>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>aCCa>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>>>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>aaa>aa>>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>a>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>>C>>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>a>>Ca>>>a>>Ca>>>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>>>a>>Ca>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a=>>=a>>=a>>=a>>=>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=>Ca=>=a=C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a>>=a=a>>=a>>=a>>=a>>=a>>=a>>=a>>=C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>>=a>>=a=>=a>>=a=>=a>>=a=>=a>>=a>>=a=>>>=a=>=a=>=>a>>=a=>=a>>=a=>=a>>=a=>=a>>=a=C>C>C=C>C>C>C=C>C>C>C=C>C>C>C=>C>C>C>>>CCCCC=C>C>CC>CC>CC>C>C=C>C>C>C=C>C>C>C=C>C>C>C=C>a=>=a=>=a=>=a=>=a=>=a=>=a=>=a==>==a=>=aa=a=>aaa>>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=C>C>=>C>C>C>=>C>C>C>=>C>C>C>=>>C>>C>C>=CC>C>CCC>>=>C>C>C>=>C>C>C>=>C>C>C>=>C>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>==>==>=>=>>>>=>>==>>===>=>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=>C=>>CCC=CCC>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>C=C>a=>=a=>=a=>=a=>=a=>=a=>=a=>==a>=a=>=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>==a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>=a=>==>C>C>C>=>C>C>C>=>C>C>C>=>C>C>C>>>CC>=>=>C>C>C>=>C>C>C>=>C>C>C>=>C>C>C>=>C>C>C>=>C>C>=>C>C>C>=>C>C>C>=>C>C>C>=>C>C>C>=>C>C>C>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>=a=>=>=>==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C=>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=nnnnnnononooooooooooooonononnnnnn==C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=kkkkkkkkkkkkkpkpkpkpkkpkkppppkpkpkkpkpkpkpkkkpkkkkkkkkkkC=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C==>C===C=========================================================================C===C===C===C===C===C===C===C===C===C===UUUUU=UUUU===UUU=C=UUU=UCUU==UUUU=CUUUCUU=UUUUUU=UUUUUUU=C===C===UU=CUU====C===C===C===C===C===C===C===C===C=======================UUUU=U=U==UUU=U=UUUUUUUUU=UU===U=U======================C===C===C===C===C===C===C===C===C===C===U==UU=U=U==C===U==U==CU==C=UUUUU=UU==UUUU=UU=UU===C=UUU=UUU=C===C===C===C===C===C===C===C===C===C============================U=U=UUU=U===U==U=U====UUUUU=UU=UUUU=UUU=====UUU=U=======================C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=U==UCUCUCU==U=U==U=U==C=UUU=U=CUU=U==UUUUU=UUC=UUU==C=C===UCUU=UC=C===C=C=C===C=C=C===C=C=C===C=C=C========================UU==UUUUU=UUUU=U===U=======U====U=UUU====================C===C==C===C==C===C==C===C==C===C==UUUUC==UUUU=C=UUCU==UUUUUUUU=UC=UUU==C===UU=C===C==C===UU=C===C==UUU==UUUC===C==C===C==C===C==C===C==C===C=================================================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=====================================================================================C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C=================================================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C=C===C===C===C===C===C===C===C===C===C===C===C===C=========================================================C==C==C==C==C==C==C==C==C==C==C==C==C==ǬǬǬǬǬ==C==C==C==C==C==C==C==C==C==C==C==C==C======================================================C==C===C==C===C==C===C==C===C==C===C==C===C==CC===C==C===C==C===C==C===C==C===C==C===C==C=========================================================C==C==C==C==C==C==C==C==C==C==C==C==C====C==C==C==C==C==C==C==C==C==C==C==C==C======================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===--&TNPP &Times New RomanArialMonotype Sorts Courier New Courier (W1) dbllines.pptMicrosoft Clip GalleryTCP/IP Programming SeminarSeminar OutlineNo Slide TitleThe OSI Network ModelThe TCP/IP Protocol LayersTCP/IP Network LayersProtocol LayeringThe TCP/IP Protocol LayersNetwork ProtocolsThe TCP/IP Protocol LayersIP - Internet ProtocolInternet Addresses IP DatagramNetwork-Byte OrderThe TCP/IP Protocol LayersUDP - User Datagram Protocol UDP DatagramThe TCP/IP Protocol Layers$TCP - Transmission Control Protocol$TCP - Transmission Control ProtocolTCP does NOT do MessagesTCP does NOT do MessagesTCP Connection FlowTCP Connection States TCP SegmentWhy Client/Server?No Slide TitleBerkeley Socket History Other Programming ModelsSocket Paradigm OverviewBSD Socket Data StructuresBSD Socket Data StructuresTCP or UDP - Which to Use?Stream (TCP) Client and ServerStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client Stream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client and ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerDatagram (UDP) Client/ServerDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ServerDatagram (UDP) ServerMultithreaded ServersMultithreaded ServersOther Socket CallsSummarySummarySummarySummaryNo Slide TitleByte Order RoutinesByte Order RoutinesInternet Address Routines inet_aton and inet_ntoaConverting NamesThe Domain Name SystemTCPware-Specific InfoNames to Addresses$Retrieve Information from Databases The RoutinesHost RoutinesHost Routineshostent StructureService RoutinesService Routinesservent StructureProtocol RoutinesProtocol Routinesprotoent StructureNo Slide TitleSockets vs. QIOs$QIO Programming$QIO ProgrammingBGDRIVER $QIO vs. SocketStream (TCP) Client and ServerStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client and ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerDatagram (UDP) Client/ServerDatagram (UDP) ClientDatagram (UDP) ServerMore Sophisticated ServersMore Sophisticated ServersNo Slide TitleWhy a New IP?Major IPv6 FeaturesIPv6 Socket Programmingin6_addr Structure sockaddr_in6 Structure (4.3bsd) sockaddr_in6 Structure (4.4bsd)Existing Routines UnchangedExisting Socket RoutinesExisting Socket RoutinesNew Socket RoutinesHost Lookup - The Problem՜.+,0 hp  5On-screen ShowPn Times New RomanArialMonotype Sorts Courier New Courier (W1) dbllines.pptMicrosoft Clip GalleryTCP/IP Programming SeminarSeminar OutlineNo Slide TitleThe OSI Network ModelThe TCP/IP Protocol LayersTCP/IP Network LayersProtocol LayeringThe TCP/IP Protocol LayersNetwork ProtocolsThe TCP/IP Protocol LayersIP - Internet ProtocolInternet Addresses IP DatagramNetwork-Byte OrderThe TCP/IP Protocol LayersUDP - User Datagram Protocol UDP DatagramThe TCP/IP Protocol Layers$TCP - Transmission Control Protocol$TCP - Transmission Control ProtocolTCP does NOT do MessagesTCP does NOT do MessagesTCP Connection FlowTCP Connection States TCP SegmentWhy Client/Server?No Slide TitleBerkeley Socket History Other Programming ModelsSocket Paradigm OverviewBSD Socket Data StructuresBSD Socket Data StructuresTCP or UDP - Which to Use?Stream (TCP) Client and ServerStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client Stream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client and ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerDatagram (UDP) Client/ServerDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ClientDatagram (UDP) ServerDatagram (UDP) ServerMultithreaded ServersMultithreaded ServersOther Socket CallsSummarySummarySummarySummaryNo Slide TitleByte Order RoutinesByte Order RoutinesInternet Address Routines inet_aton and inet_ntoaConverting NamesThe Domain Name SystemTCPware-Specific InfoNames to Addresses$Retrieve Information from Databases The RoutinesHost RoutinesHost Routineshostent StructureService RoutinesService Routinesservent StructureProtocol RoutinesProtocol Routinesprotoent StructureNo Slide TitleSockets vs. QIOs$QIO Programming$QIO ProgrammingBGDRIVER $QIO vs. SocketStream (TCP) Client and ServerStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) ClientStream (TCP) Client and ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerStream (TCP) ServerDatagram (UDP) Client/ServerDatagram (UDP) ClientDatagram (UDP) ServerMore Sophisticated ServersMore Sophisticated ServersNo Slide TitleWhy a New IP?Major IPv6 FeaturesIPv6 Socket Programmingin6_addr Structure sockaddr_in6 Structure (4.3bsd) sockaddr_in6 Structure (4.4bsd)Existing Routines UnchangedExisting Socket RoutinesExisting Socket RoutinesNew Socket RoutinesHost Lookup - The ProblemHost Lookup - Solution 1Host Lookup - Solution 2Address LookupNew Lookup RoutinesNew Conversion RoutinesOther ConsiderationsOther ConsiderationsSummaryNo Slide TitleWINSOCKImproving PerformancePitfalls to AvoidOptions and Other ThingsFollow Reasonable PracticesNo Slide Title References Handouts  Fonts UsedDesign TemplateEmbedded OLE Servers Slide Titles