ࡱ> .*  !"#$%&'()+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry`LS-PowerPoint Document(*FPersistentStorage Directory8>Current User  !T 4@T 4 @`@T 4((OOvv_T 4$$GGkkOt 4TTOO @. T 4,,WWodL <ArialNew RomanL <FE,%< X((?[{???'???%??????????????????????!%),.:;?]}????????????????GG G 0h'2sZG #&h'2s &&#TNPP0D zH & TNPP &&TNPP  'h L-- &g&+l.  --LD 'h D&h'*k &&#TNPP0D z & TNPP &&TNPP  D-- &g&#d.  --D< <&h'"c &&#TNPP0D z & TNPP &&TNPP  <-- &g&\.  --<4 4&h'[ &&#TNPP0D z & TNPP &&TNPP  4-- &h'S--- 'h !,'h---.  --4,    a-- $OOO----8'a , - . / 0 1 2 3 4 5 6788999999888766543210/.-,  9#9#8"8"7!7 6 5 %.%/%0%1%1$2$3$4$5$6$7$8$9$:$;$;#<#=#>#>"?"@"@!A!B C CDDEEFFFGGGGHHHHHHHHGG G F F E EDDCBA@?>=<;:9875432  567788 8 9----8e s Q Q Q R S STTTT5T6T7S7R8Q8Q9e9e8d8c8c7b7b6b5b(k(r3r4s4s5s6s7s8r8r99887766554322y(z({({'|'}'~&&%$$#"!! ~ } | { z y x w v u t s blmnopqrstuvwwwwwvvuttsrqponmlbb----8\"!  !"#$%&'())*++,---....//////....--,++*)(('&%%$#"  !"#%&'()+,-./012334566788999:::::::::::999887665433210/.-,+)('&%#"!  ----$      !"#%&'(*+,-./012344566788999:::::;;::::::::999888777666555666'(()**+++,,,----............----,,+**)('&%$#"! ----$C"=>??@AA@@ ? ? ? > =      55677889=9>9>:?:?;@;@<A<A+@+@,?,?-?.>.=."."'2'3'4(4)5)5*6*65544432""----D$ {|   ~}|{{ z y x w v u t s r q p o n m l k j i h f e d c a ` _ ^ ] \ [ Z Y YXWVVUTSSRRRRRRRRRRSST U!V"W#X#Y#Y$Z$[$\%]%^%_%`&a&b&d&e&f&h&i&j&k&l&m&n'o'p'q'r's't(u(u)v)v*v+v,v-v.u.u/t/t0s0r0q1p1o1n1m1l1k1j1i1h1g1f1e1d1c1b1a0`0_0^0]/\/[.Z.Y.Y-X-X,W,W+V+V*W*W)U)O7P8P7Q7Q6R6S6S7T7U7V8W8X8Y8Y9Z9[9\9]9^9_:`:a:b:d:e:f:h:i:k:l:m:o:p:q:s:t9u9v9w8x8y8z7{7|6}6}5~5432110/.-,+*)('&%%$#""!! ~ } |{zyxwvutsqpomlkjihgfedccba`__^^^^^_`aabcdefghijklmnopqrstuvwxyz{{{----@$                                     !!""###$$%%%%&&&&&&&&&&&&'''''''(()**+,--.//000111111111111111110000//..--,,+*))7877667777888899999::::::::::::::::999888776655432110/.-,+*)('&%$#"!!   ----$D!#*((''&%$#"!             !!!!!" " " " """"""""""####$$%%&'()*++,,--..../////// / / / ///.....----,,++**))(('&%67665556667778888899999::: : : :::::::999887 7!6"6#5$4%4&3&2'2(1(0)/*.*-*,+,+++*+),(,',&+%+$+#+"+!* **))(''&%$#"!                                       !!"""!----8ZD"D!D DDEEEFFGGHHIJKKLMNOPQRRSTUVWXYZZ[\\]]]^^ ^!^"^#^$^%]&]'](\)\*[*[+Z+Z,Y,Y-X-W-V.U.T.S/R/Q/P/O/N.M.L.K.K-J-I-I,H,H+G+F*F)E)E(E'D&D%D$D#D"Q O N L K I H G E D C B A@?>=<;::9887766655 5!5"5#5%5&6'6(6)7+7,8-8.9/:0:1;2<3=3>4?5@6A6B7C8D8F9G9H9I:K:L:N:O:Q:R:T:U:W:X:Y9[9\9]8_8`7a6b6c5d4e3f3g2g1h0i/i.j-j,k+k)l(l'l&l%l#l"l!l lllkkkjiihggfedcba` _ ] \ [ Z X W U T R Q ----x$:      x x y z { {{{{5{6{7z7z8y8x8x998877665''''(()**----f$15677888998887765           ----$f345677889988776544 3 4 5!5!6 6 77889292818170706051514<===>>>??@@ A A A 0 0 0 1 2 2221)(##"""## $ $     (          ----8>k R R R S T TTSSSSG0G1G2F2F3F4E5E6D6D7C7C8B8B9T9T8S8R7Q6Q5Q4R4S0i0j4k4k5k6k7j7j8i8i9{9{8z7y7y6y5jjjiiii j k k k V(]e(V(----8c"      567788998877665((33455677889988776544332(('''&&%%$$##""!              ----$E           5677888999:::;<<++,--....''''(()**----$BmCnJ^I^I_H_G_F_E_D_C_C^B^A^@]?]>]=]<\;\:\9\8\7\6\5[4[3[2[0[.[-\+\*\(\']%]$^#^!_ ``abbcdefghijkmnoprstuwxyz|}~ "#$&')*,./1345789:;<=>?@ABCDEFGGHIJKKLCyBzB{B|A}@}@~?~>~=<;:9876543210/.-,+*)~(~'}&}&|%|%{${$z#y#x#w"w"v"u"t"s"r"q#p#o$n$m%l&k'k'j(j)i*i+h,h-h.h/g0g1g2g3g4g5g6g7g8g9h:h;h<h=i>i?i?j@jAkBlBm----8O|xwvutsrqqppooonnnnnnnnnnnooppqqrstuuvwxyz{||}~~~~}||{zyxddddddeeeffgghiijk~k~l}m}n|o{p{qzrzsztzuzvzwzxzyzzz|z}z~{{||}}~~}|zyxwvutsrqponmlkjiihggffeeedddddd----8Xeefffghhi~~}}}}|||{{zyxwvutssrqponmllkjiihhgggfffeeeeeeemmmmmmnnnnoopqrsttuuuuuuuum----8JJmRmSmTmUmVmWnXnYnZnZo[o[p[q[r[sZsZtYtXtXuWuVuUuTuSuRuJuJmJ~S~U~V~W}X}Y}Z}[}\}]}^|_|`|a{b{bzczcydydxexewevfuftfsfrfqfpfofnfmemelekdjdicibhag`g_f^f]f\e[eZeYeXeWeVe<e<f=f=g>g>h>i>>>==<<LLKKJJJJ~----8M|xwvutsrqqppooonnnnnnnnnnooppqqrstuuvwxyz{||}~~~~}||{zyxddddddeeeffgghiijkklmnopqrstuvwxyz|}~~}|zyxwvutsrqponmlkjiihgffeeedddddd----8Weefffghhi    ~~&&%%$#""!! }}}}|| | {!{"z#y$x$w%v%u%t%s&r&q&p%o%n%m%l$l$k#j"i"h!h ggfffeeeeeeemmmmmmnnnnoopqrssttuuuuuuuum----v84xececfdfdgdhdidjZZYYYXXWWVVVddccbbccdvxxxxwwvvwjwiwhwgwfxfxeg}mms}g}----\$,oooooopqqbbcddeeeeddcbbqqpooo----B$!!i!h!g"g"f#f$f$eeffgghi$$##"!!!----8O|cxcwcvcudtdsereqfqfpgpgohoioinjnknlnmnnnonpnqnrnsnsotoupvpvqwqwrxsxtxuyuyvywyxyyyzy{y|x|x}x~w~wvuttsrqqponmlkjihhgfeee~d~d}d|c|c{czcycxndmdkdjdidhdfeeedecfbfag`g_h_i^i]j\k[k[lZmZnYoXpXqWrWsWtWuWvWwWxWyWzW|W}W~WXXYYZZ[\\]^__`abcdeghijkmnoprstuvwxyz{|}~~}|zyxwvutsrqponmlkj~i}i|h{gzfyfweveuetdsdrdpdodnd----$>eefffghhirihggffeeffghhi{jihggffe----'&--&TNPP &--'&--&TNPP &--'&--&TNPP &--'&--&TNPP &T 4  @@``@Times New RomanL <Times New RomanL <"ArialNew RomanL <"ArialNew RomanL <Monotype SortsL <1Courier Newts$3eQ* D0# ,E ,,,,w,ddddddddddD0 E wU,lKdddddddddD0  E     w,dddddddddd   ( 8`t:D$42dd35//0011 <@ 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   (@`  8 :$0z & I5DECUS Ireland Wednesday May 26, 1999 TCP/IP Programming: Socket Routinesh/X/%/  $/, X0H0I40dd(11I1   (  8:$0y42dd3w5 </,// X0H040dd(111  (iM 8:$0t 5Geoff Bryant bryant@process.com</,/ / 0040dd40dd(11 1 : (.  8:z$0K "51999 Process Software</,// X0H040dd(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,w5//0011  (f3 84:$05Slides available via anonymous FTP: Host: ftp.process.com Directory: [pub.decus.ireland_99] Slides: prog_sock.ps prog_sock.ppt Examples: socket_examples.txt </,// P0@0$40dU40dU40dU#40dU40dU40dU40dU40dU(111@ p,0%v ,0H./04x$xa(  (v 8 (   (C: 8D   (mD  8t=D$Ĥ0 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 . D   (@@  8:#l$#0z]V 5Overview</,//, X0H040dd(111    (@  8":$0z-V 5TCP/IP Concepts TCP byte stream service UDP datagram service TCP or UDP? (how to choose) Stream (TCP) Client socket calls Stream (TCP) Server socket calls Datagram (UDP) Client socket calls Datagram (UDP) Server socket calls Multithreaded servers/// I/ / 0040UlKd40dd40dd40dd!40UlKd!40UlKd#40UlKd#40UlKd40UlKd(111@ p,0%v ,0H./04x$xa(  (v 8 (   (mD  8t=D$Ĥ0 42dd3 w5//0011   (C: 8D  8.04x$xw&UGGGى  (@ p 8  K   (@@  8:#s$#0z]V 5TCP/IP Concepts</,//, X0H040dd(111    (Pt o 8!:$0: Rm5Networking services TCP - reliable byte stream service UDP - connectionless datagram service IP - connectionless datagram service Naming communication endpoints Internet Addresses Port Numbers Servers contacted at well-known ports Ports 1 - 1023 are privileged port numbers Ports 1024 - 65535 are unrestricted Sockets BSD Unix abstraction used to access the networkD/4// n/ / F/ O/ / // p0`040UlKd#40dd&40dd%40dd40UlKd40dd 40dd&40dd+40dd$40dd40UlKd/40dd(11m1 _  ;  ' (0 8:g$0U5TCP</,// X0H040dd(111 ' (0  8:g$02U 5UDP</,// X0H040dd(111 & ( 0 8:f$0 5IP</,// X0H040dd(111 4 (0  8:t$0U [5Physical Network</,// X0H040dd(111 / ( 0 8:o$0  5Application</,/ / X0H0 40dd(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  R   (@@  8:#z$#0z]V "5IP - Internet Protocol</,//, X0H040dd(111 \   (@  8:$0zV ,@5Lowest Layer of TCP/IP suite Typically not used directly by application programs Connectionless Unreliable datagram service Low overhead Delivery of a datagram is not guaranteed Datagrams may be delivered out of order Duplicate datagrams may be received Upper layer protocols implement reliability Used by TCP and UDP //~/ / @/ 0040UlKd440UlKd40UlKd40UlKd 40dd)40dd(40dd$40dd,40UlKd40UlKd(11@1 0 (T 8:p$0F7 5IP datagrams</,/ / X0H0 40dd(11 1      (@0 8 * (` 8:j$055Host A</,// X0H040dd(111  (P 8  (P 8  (P 8  ( 0 8 * ( 8:j$055Host B</,// X0H040dd(111 z   8 z   8 z   8 z   8@ p,0%v ,0H./04x$xa(  (v 8 (   (C: 8D   (mD  8t=D$Ĥ0 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 0 X   (@?  8:#$#0] (5UDP - User Datagram Protocol</,//, X0H040dd(111    (@  8:$0zV 75Thin Layer on top of IP (adds port concept) Used directly by application programs Like IP (low overhead, connectionless, unreliable) Not reliable Client must retransmit request if no reply received Server may receive duplicate datagrams Best for request/reply applications Used by DNS, NFS, SNMP, RIP, etc..../// [/ H/ P0@0.40UlKd&40UlKd340UlKd 40UlKd440dd'40dd$40UlKd$40UlKd(1171 1 (@ 8:q$0g 5UDP datagrams</,/ / X0H0 40dd(11 1      (< 8 * (t,[ 8:j$0>5Host A</,// X0H040dd(111  (, 8  (< 8  (L  8  (<\ 8 * (tl[ 8:j$062>5Host B</,// X0H040dd(111 z  ,  8 z <  8 z L  8 z   8(@ p,0%v ,0H./04x$xa(  (v 8 (   (C: 8D   (mD  8t=D$Ĥ0 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8 f" ]   (@?  8:#$#0] -!5TCP Transmission Control Protocol</,/!/, X0H0!40dd(11!1    (@`  8.:$0z}V 5Layered on top of IP Adds port and byte stream concepts Used directly by application programs Connection oriented Reliable byte stream service Delivery of bytes is guaranteed Bytes delivered in order No duplication of bytes Used by FTP, TELNET, SMTP, etc..../// Q/ "/ 0040UlKd#40UlKd&40UlKd40UlKd40UlKd 40dd40dd40dd"40UlKd(111 X 4  (p8 8  (0 8 8 * (A@( 8:j$0 ^ 5Host B</,// X0H040dd(111  (A0 8  (A 8  (A 8  (A 8  (PA 8  ( AP 8  (A  8  (A 8  (A 8  (`A 8  (0A` 8  (A@ 8  (A 8  (A 8  (A 8  (`A 8  (0A` 8  (A0 8  (A 8  (A  8  (pA 8  (@Ap 8  ( AP 8  (PA 8  (A 8  (A 8  (A 8  (@Ap 8  (A@ 8  (A 8 3 (8  8:s$0U5TCP byte stream</,// X0H040dd(111 z   8 z t  8 * (A( 8:j$0^ 5Host A</,// X0H040dd(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(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?</,//, 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@ 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 </,//, 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  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</,//, 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$Ĥ0k 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5BSD Socket Data Structures</,//, 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$Ĥ0k 42dd3 w5//0011  8.04x$xw&UGGGى  (@ p 8   (p  8  (p 8 V   (@@  8:#~$#0z]V &5BSD Socket Data Structures</,//, 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(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 8  (p  8  (p 8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//, X0H040dd(111 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^y  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 `T`  8 z ``  8 z PP  8 z PDP  8 z PP  8 z PP0  8 z PTP  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</,//, 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       !"#$%&'()*+,-./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 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//, 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)1i&@ 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 #   (p  8  (p 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Client</,//, X0H040dd(111 : (C{} 8:z$0`A`"5#include #include main() { int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd <= 0) { perror( socket ); exit(1); } }//G/ */ 5/ p0`040dd40dd40dd 40dd40dd 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</,//, 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 </,//, X0H040dd(111 o  (A8 8:$0{W5#include #include main( argc, argv) int argc, char argv[]; { int sockfd; struct sockaddr_in name; struct hostent *he; /* Create socket */ sockfd = socket(...); /* 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/ </ / h0X040dd40dd40dd40dd 40dd40dd40dd40dd 40dd40dd40dd40dd40dd40dd40ddE40dd'40dd40dd@40dd(111    (  @ 8:$0Z #l45CONNECT Example: discard h/X// #/ X0H0440TlKd(1141$)@ 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</,//, 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*@ 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</,//, 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(11V14+@ 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</,//, X0H040dd(111 H   (@  8:p$0zV  5SEND Example</,/ / X0H0 40TlKd(11 1   ( 8w :G $015#include #include main() { int sockfd, num_sent; char buffer[512]; /* create socket *? sockfd = socket( ... ); /* connect to server */ connect(sockfd, ... ); /* send message to server */ strcpy( buffer, Hello there ); bytes_to_send = strlen( buffer ); num_sent = send( sockfd, &buffer, strlen( buffer ), 0 ); if (num_sent , 0) { ...handle_error }D/4/v/ / / / m/ ,/ ,/ 0040dd40dd40dd 40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd40dd!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</,//, X0H040dd(111    (@  8k:;$0z-V 5RECV() Receive data from remote peer recv( int sockfd, char *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</,//, 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</,//, 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(111b/@ 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</,//, X0H040dd(111 <   (@  8:d$0zV  \5CLOSE() Close a socket close ( int sockfd ) sockfd = socket file descriptor to close Example/// $/ )/ / x0h040UlKd40dd40dd)40dd40dd(11\1 A ( 8:$03)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</,//, 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</,//, 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</,//, X0H040dd(111  (| 8j :: $0W_ 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</,//, 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 8  (p  8  (p 8 Z   (@  8:#$#0]F *5Stream (TCP) Client and Server</,//, X0H040dd(111 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^y  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 `T`  8 z ``  8 z PP  8 z PDP  8 z PP  8 z PP0  8 z PTP  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</,//, X0H040dd(111 +   (@  8:S$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</,//, 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      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 8 O   (@@  8:#w$#0z]V 5Stream (TCP) Server</,//, X0H040dd(111 H   (@  8:p$0zV s 5BIND Example</,/ / X0H0 40TlKd(11 1  (@~ 8 Q  (A 8 : $0;9 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</,//, 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</,//, X0H040dd(111 J   (@  8:r$0z-V 5LISTEN Example</,// X0H040TlKd(111  (^4~ 8:$0{a42dd3w5#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</,//, X0H040dd(111 U   (@  8:}$0z- %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+40ddW40ddS40dd-40dd%40ddc40dd640dd(1118<@ 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</,//, X0H040dd(111 J   (@  8:r$0zV s5ACCEPT Example</,// X0H040TlKd(111  (g? 8y :I $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/ @00040dd40dd40dd 40dd%40dd40dd40dd40dd40dd40dd40dd40dd40dd!40dd40dd: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</,//, 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</,//, 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</,//, 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); } //$/ %/ / :/ 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</,//, 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</,//, 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(11K1v?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 05  (p  8  (p 8 X   (@  8:#$#0] (5Datagram (UDP) Client/Server</,//, 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 La  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</,//, 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</,//, 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 [   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//, X0H040dd(111    (  8":$0*- 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 40UlKd40ddu40dd/40dd/40dd140dd/40ddG40dd^40dd(111F@ 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 R   (p  8  (p 8 Q   (@@  8:#y$#0z]V !5Datagram (UDP) Client</,//, X0H040dd(111    (@  8:$0z- y5Writing 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()/// / */ 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</,//, 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</,//, 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</,//, 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</,//, 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</,//, 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(111jL@ 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</,//, X0H040dd(111    (@  8:$0zV q5TCP Reliable byte stream Client and Server define message protocol UDP Unreliable datagram service Client and Server must implement reliability TCP client socket connect send/recv close/// ?/ / I/ / / (0040UlKd40dd*40dd40UlKd40dd-40dd 40UlKd40dd40dd 40dd40dd(111!@ 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</,//, X0H040dd(111 ^   (@  8:$0z-V .^5TCP Server socket, bind, listen accept recv/send close UDP client socket sendto/recvfrom close// / ,/ / / 00 40UlKd40dd40dd 40dd40dd 40UlKd40dd40dd40dd(11      !"#$%&'()*+,/Z123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY[\^1 @ 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</,//, X0H040dd(111 1   (@  8:Y$0z-V y5UDP Server socket recvfrom/sendto close Multithreaded servers Socket select for polling Unix fork Master Server (inetd)// / / / ;/ P0@0 40UlKd40dd40dd40dd40UlKd40dd 40dd40dd(11y1@ 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,w5//0011  (f3 84:$05Slides available via anonymous FTP: Host: ftp.process.com Directory: [pub.decus.ireland_99] Slides: prog_sock.ps prog_sock.ppt Examples: socket_examples.txt </,// P0@0$40dU40dU40dU#40dU40dU40dU40dU40dU(111 i@ pw$7̙33$73$73333f$7999MMM$7f$7f3$73 8.04x$xw&UGGGى  (@ p 8;* u =  (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</,/ /, 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  (( 8xE (D'v  0H./04x$xa(  (v 8 R =   (v 8 e$D0 5*</,//  X0H040dd(111 =  ($ 8 e$D00 5*</,//  X0H040dd(111   (vY   8 #$D#0Y  s#5*1997 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 > (d~ 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 04KdKd8ft$de, "PowerPoint DocumentJeff SchreiberMicrosoft (R) PowerPoint (R) Windows _՜.+,0 hp  -On-screen ShowPMW<< ATimes New RomanArialMonotype Sorts Courier NewHeader9SummaryInformation(0RDocumentSummaryInformation8 dbllines.pptJDECUS Ireland Wednesday May 26, 1999 TCP/IP Programming: Socket RoutinesNo Slide Title OverviewTCP/IP ConceptsIP - Internet ProtocolUDP - User Datagram Protocol"TCP Transmission Control ProtocolTCP does NOT do messagesTCP does NOT do messagesTCP or UDP - Which to use?Berkeley Socket History Socket Paradigm OverviewBSD Socket Data StructuresBSD Socket Data StructuresStream (TCP) Client and ServerStream (TCP) ClienOh+'0|R0 H\    TCP/IP Protocol SuiteaCP/ Geoff Bryantol eofeof3c:\msoffice\powerpnt\template\sldshow\dbllines.pptJeff Schreibere 1346185792bMicrosoft PowerPoint 4.0lat@t8@`df@ I j@PCЉ/ GP%  R('&; &&#TNPP0D z & TNPP &&TNPP   ;  'A x;(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDgaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEEaEEEEEEaEaaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaDaDaDaEaaaDEaaaaaDaaDDaDEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaDaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaEaEaEgEaaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaaDagaDaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDaDaDagaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEEaaaEaaEEaaaaaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaDaDDDDDDDaaaaDDaDaaDDDDDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaaaaaEEaEaaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaDaDaDaDaDaDaDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaaDaEaDaaaDEEDaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaaDDaaDaDaDaDaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEDaE>EaEaa>aaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDa>aDaDaDaDaD>aDaDaDa>aDaDDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaEaDaE>DaaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaDaEaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>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>DaDaDDaDaD>DaaDDaDDaDaDD>DDaD>DaaDDDa>DaDaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>DaDaDaD>aDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDDaDDaaDDDaDDaDDaDaaDaDaaDaaDDaaaDDaaaaDDaaDaDaDDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>Da>DE>a>DaaE>DE>DaEDa>Da>DEDa>DEDE>aE>E>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>DaE>Daa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDaa>aa>D>a>Da>Daaa>aDa>aD>aaaD>aaaa>DaaDaDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDDaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>aD>DaD>D>D>aDDaDaaD>DD>DD>D>DD>aDD>DaDaaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>DaD>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDaDa>aDaDDa>DaDaDa>aDaDDa>aDaDaDaaDaDaa>aaDaDa>aDaDaDaaDaDaDa>aDaDaDa>aDaDaDa>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>DD>D>D>D>D>D>>D>D>D>D>DD>D>D>D>D>D>D>D>D>DDD>D>D>D>D>D>D>D>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>D>D>D>DaD>D>D>DaD>D>D>DaD>D>D>DaD>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>aDaaD>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aa>Da>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDD>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>>DaCC>DC>D>CDa>DC>DaC>D>>DaC>DC>D>D>aCD>C>>CDa>>CDa>>>DC>>DC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>DaC>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aD>aD>aD>aa>aDaaD>aa>aDa>aD>aDa>aa>Daaa>DaaD>aa>DaaD>DaaD>D>aaaD>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>C>CD>C>C>>>CC>C>D>C>>C>D>CC>>DCC>>DC>CD>>CC>>>CC>>>>CDC>>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>Da>a>a>a>>Da>aDa>aDaa>>aaa>>aa>a>aaD>aa>D>aa>D>>aaa>>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>Da>D>>DaC>DC>DC>>>DC>DC>Da>D>>D>D>Da>CaCC>C>C>a>C>>DC>DaC>D>C>DaC>D>C>DaC>D>C>DaC>D>C>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aDa>aD>aD>aD>aa>aa>a>aa>aa>aD>aD>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>>CD>C>D>C>C>C>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>C>C>C>D>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>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>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>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>Ca>>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>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>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>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>>>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>>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>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>>=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>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>>=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>>=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>>=a=C>C>C=C>C>C>C=C>C>C>C=C>C>C>C=C>C>C>C=>C>>>>=C=CC>>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>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>=CCC>>>>C>CCC>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>CC>=CC=C>C=>C=C>C=C>C=C>CC>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>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=>=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=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=C=C>C=C=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>==>>=>=>>>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C=C=>C=>C=>=>==>==>=C==C=>=>=C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>>>==>=>===>>=>=>>>=>=>>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=C=C=C=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==C==CC====C==C=CCCC=C=C=C=C=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=>=>=>==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C==>C=>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==>==C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=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===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=====================================================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=====================================================================================================C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C===C=C=C====================================================================================C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C=================================================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=====================================================================================C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C===C==C=================================================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C=========================================================C==C==C==C==C==C==C==C==C==C==C==C==C==ǬǬǬǬǬǬǬǬǬǬǬǬǬC==C==C==C==C==C==C==C==C==C==C==C==C==C======================================================C==C===C==C===C==C===C==C===C==C===C==C===C==CǬǬǬǬǬǬ=C===C==C===C==C===C==C===C==C===C==C===C==C=========================================================C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C==C======================================================C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===C===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 &tStream (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 CallsSummarySummarySummaryNo Slide Title  Fonts UsedDesign Template Slide Titles<