home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Tool Chest / Networking / MacTCP / MacTCP Developer Tools / MacTCP 2.0.2 Docs / MacTCP Programmer's Guide / MacTCP Programmer's Guide
Encoding:
Text File  |  1993-06-15  |  518.2 KB  |  849 lines  |  [ONLN/HLX2]

  1.     K    MacTCP Programmer’s Guide
  2.  
  3.     Apple Computer, Inc.
  4. This manual and the software described in it are copyrighted, with all rights reserved. Under the copyright laws, this manual or the software may not be copied, in whole or part, without written consent of Apple, except in the normal use of the software or to make a backup copy of the software. The same proprietary and copyright notices must be affixed to any permitted copies as were affixed to the original. This exception does not allow copies to be made for others, whether or not sold, but all of the material purchased (with all backup copies) may be sold, given, or loaned to another person. Under the law, copying includes translating into another language or format.
  5. You may use the software on any computer owned by you, but extra copies cannot be made for this purpose.
  6. The Apple logo is a registered trademark of Apple Computer, Inc. Use of the “keyboard” Apple logo (Option-Shift-K) for commercial purposes without the prior written consent of Apple may constitute trademark infringement and unfair competition in violation of federal and state laws.
  7. © Apple Computer, Inc., 1993 
  8. 20525 Mariani Avenue 
  9. Cupertino, CA  95014-6299
  10. (408) 996-1010
  11. Apple, the Apple logo, AppleTalk, LaserWriter, LocalTalk, Macintosh, MacTCP, and MPW are trademarks of Apple Computer, Inc., registered in the United States and other countries.
  12. Simultaneously published in the United States and Canada. 
  13. Mention of third-party products is for informational purposes only and constitutes neither an endorsement nor a recommendation. Apple assumes no responsibility with regard to the performance of these products. 
  14.  
  15. Contents
  16. Preface: About This Guide  /  vii
  17.     1    Introduction  /  1
  18. Architectural overview  /  2
  19. Application, presentation, and session layers  /  2
  20. Transport layer  /  3
  21. Transmission Control Protocol (TCP)  /  3
  22. User Datagram Protocol (UDP)  /  3
  23. Network layer  /  4
  24. Data link layer  /  4
  25. Physical layer  /  4
  26.     2    The MacTCP Driver  /  5
  27. The PBOpen call  /  6
  28. The PBControl call  /  7
  29. The PBClose call  /  8
  30. The Gestalt call  /  8
  31. Implementation notes  /  9
  32. Fragmentation and reassembly  /  9
  33. Routing  /  9
  34.     3    User Datagram Protocol  /  11
  35. Data structures  /  12
  36. Write Data Structures  /  12
  37. Receive buffer area  /  13
  38. Using UDP  /  13
  39. UDP routines  /  14
  40. UDPCreate  /  15
  41. UDP asynchronous notification routine  /  16
  42. UDPRead  /  18
  43. UDPBfrReturn  /  19
  44. UDPWrite  /  20
  45. UDPRelease  /  21
  46. UDPMTU  /  21
  47. UDP Multiport Create  /  22
  48. UDP Multiport Send  /  23
  49. UDP Multiport Receive  /  24
  50. C parameter-block definitions  /  25
  51.     4    Transmission Control Protocol  /  29
  52. Data structures  /  30
  53. Read and Write Data Structures  /  30
  54. Receive buffer area  / 30
  55. Using TCP  /  31
  56. Streams and connections  /  31
  57. Asynchronous notification routine  /  31
  58. Connection opening  /  31
  59. Receiving data  /  32
  60. Sending data  /  32
  61. Timeouts  /  32
  62. Pushed data  /  33
  63. Urgent mode  /  33
  64. Connection closing  /  34
  65. Network management information  /  34
  66. Formatting MacTCP commands  /  35
  67. TCP routines  /  35
  68. TCPCreate  /  36
  69. TCP asynchronous notification routine  /  37
  70. TCPPassiveOpen  /  41
  71. TCPActiveOpen  /  44
  72. TCPSend  /  45
  73. TCPNoCopyRcv  /  47
  74. TCPBfrReturn  /  49
  75. TCPRcv  / 50
  76. TCPClose  /  52
  77. TCPAbort  /  53
  78. TCPStatus  /  54
  79. TCPRelease  /  56
  80. TCPGlobalInfo  /  57
  81. C parameter-block definitions  /  59
  82.     5    Name-to-Address Resolution  /  65
  83. The AddressXlation.h header file  /  66
  84. The OpenResolver call  /  67
  85. The StrToAddr call  /  68
  86. The AddrToStr call  /  69
  87. The EnumCache call  /  70
  88. The AddrToName call  /  72
  89. The HInfo call  /  73
  90. The MXInfo call  /  74
  91. The CloseResolver call  /  75
  92. Binding the DNR to the application  /  75
  93. DNR operation  /  76
  94.     6    Miscellaneous Interfaces  /  77
  95. MacTCPCommontypes  /  78
  96. Result codes  /  78
  97. Miscellaneous types  /  81
  98. Internet Control Message Protocol report structures  /  81
  99. GetMyIPAddr  /  82
  100. ICMP echo  /  83
  101.     Appendix    Constants  /  85
  102. Command codes  /  85
  103. UDP asynchronous event codes  /  85
  104. TCP asynchronous event codes  /  86
  105. Reasons for TCP termination  /  86
  106. Preface    About This Guide
  107. This guide describes how to create application programs for the MacTCP driver. The MacTCP driver, Apple Computer’s implementation of the protocol suite known as Transmission Control Protocol/Internet Protocol (TCP/IP), increases the Macintosh computer’s ability to operate in a heterogeneous computer environment.
  108. What’s in this guide
  109. This guide is divided into six chapters and one appendix that contain the following information:
  110. n    Chapter 1, “Introduction,” provides an overview of the MacTCP architecture.
  111. n    Chapter 2, “The MacTCP Driver,” describes the PBOpen, PBControl, PBClose, and Gestalt calls and describes internal algorithms and decisions made by the driver.
  112. n    Chapter 3, “User Datagram Protocol,” describes UDP routines.
  113. n    Chapter 4, “Transmission Control Protocol,” describes TCP routines.
  114. n    Chapter 5, “Name-to-Address Resolution,” describes how textual names are resolved to IP addresses.
  115. n    Chapter 6, “Miscellaneous Interfaces,” describes the types that are found throughout the programmatic interfaces supplied with the MacTCP driver.
  116. n    The Appendix, “Constants,” presents command codes, UDP asynchronous event codes, TCP asynchronous event codes, and reasons for TCP termination.
  117. Who should read this guide
  118. This guide is designed both for Macintosh programmers who are not familiar with TCP/IP and for TCP/IP programmers who are not familiar with the Macintosh programming environment.
  119. Document conventions
  120. This document reflects the Macintosh Programmer’s Workshop (MPW) conventions for types and sizes of variables and fields.
  121. Related documents
  122. You might find the following reference materials useful.
  123. n    MacTCP Administrator’s Guide
  124. n    Inside Macintosh, Volumes I–VI
  125. n    Douglas Comer, Internetworking with TCP/IP, Second Edition (Prentice-Hall, 1991)
  126. n    The MacTCP driver implements protocols that conform to the following Request for Comments (RFC) and Military Standards (MIL-STD):
  127. —RFC 768 (User Datagram Protocol)
  128. —RFC 791, 894; MIL-STD 1777 (Internet Protocol)
  129. —RFC 792 (Internet Control Message Protocol)
  130. —RFC 793; MIL-STD 1778 (Transmission Control Protocol)
  131. —RFC 826 (Address Resolution Protocol)
  132. —RFC 903 (Reverse Address Resolution Protocol)
  133. —RFC 950 (Internet Subnetting)
  134. —RFC 951, 1048 (Bootstrap Protocol)
  135. —IDEA004 (Routing Information Protocol)
  136. —RFC 1010 (Internet Assigned Numbers)
  137. —RFC 1034, 1035 (Domain Name Resolver)
  138. —RFC 1060 (Assigned Numbers)
  139. —RFC 1122 (Requirements for Internet Hosts—Communication Layers)
  140. 1    Introduction
  141. The MacTCP driver is a software driver for the Macintosh Operating System that allows developers to create Macintosh applications for network environments that use the Transmission Control Protocol/Internet Protocol (TCP/IP). TCP/IP is a widely used industry standard for connecting multivendor computers. The TCP/IP protocol layers are fully compatible across all implementations on different hardware platforms, allowing different vendors’ computers that run TCP/IP to interoperate and share data and services.
  142. This chapter provides an overview of the MacTCP architecture. 
  143. Architectural overview
  144. MacTCP protocols partially conform to the International Standards Organization (ISO) Open Systems Interconnection (OSI) layers of networking functionality. Figure 1-1 shows a comparison of the OSI and MacTCP communications architecture.
  145. Figure 1-1  MacTCP protocols and OSI network layers
  146. The TCP/IP protocols shown in Figure 1-1 are described in the following sections.
  147. Application, presentation, and session layers
  148. Services in the upper-layer protocols such as the File Transfer Protocol (FTP), Telnet, and the Simple Mail Transfer Protocol (SMTP) correspond to the application, presentation, and session layers of the OSI model. As indicated in Figure 1-1, such services are typically developer products that augment the services of TCP, IP, and the User Data Protocol (UDP).
  149. Transport layer
  150. The TCP and UDP provide services at the transport layer of the OSI model.
  151. Transmission Control Protocol (TCP)
  152. The Transmission Control Protocol provides reliable transmission of data between processes. It ensures that data is delivered error free, without loss or duplication, and in sequence.
  153. Upper-layer protocols such as Telnet pass data to TCP for delivery to peer processes. TCP encapsulates the data into segments and passes the segments to IP, which puts the segments into datagrams and passes them across the internet. TCP at the receiving end checks for errors, acknowledges error-free segments, and reassembles the segments for delivery to upper-layer protocols. If a segment is lost or damaged, it will not be acknowledged, and the sending process will retransmit.
  154. TCP has a flow control mechanism so that computers of different speeds and sizes can communicate. When TCP at the receiving end sends an acknowledgment, it also advertises how much data it is prepared to accept on the next transmission.
  155. User Datagram Protocol (UDP)
  156. The User Datagram Protocol specifies how application programs send datagrams to other application programs and defines the use of UDP ports to distinguish among multiple processes in a single machine. UDP messages are encapsulated in IP datagrams for delivery. 
  157. UDP data transmission does not provide reliability. It does not provide error checking, it does not acknowledge that data has been successfully received, and it does not order incoming messages. UDP messages can be lost or duplicated or can arrive out of order.
  158. The advantage of UDP is that the overhead associated with establishing and maintaining an error-free TCP session is avoided. Upper-layer protocols that don’t require reliability use UDP to transmit data. For instance, the domain name system uses UDP because reliability is not critical; if there is no response to a domain name query, the resolver simply retransmits.
  159. Network layer
  160. The Internet Protocol (IP) provides services at the network layer of the OSI model. IP is responsible for sending data across multiple networks. IP accepts segments of data from TCP or UDP, places the data in packets called datagrams, and determines the correct path for the datagrams to take. Datagrams are sent across the internet, through as many gateways as needed, until they reach the destination host.
  161. IP provides an addressing mechanism that allows routing between networks. The header of an IP datagram contains source and destination internet addresses so that any host in a network can route a packet to a destination, either directly or through a gateway.
  162. IP has the ability to fragment a datagram as it is transmitted across a network. Since IP can be used with many different physical network implementations that specify different sizes for physical data frames, datagrams can be fragmented to fit into a small data frame. Fragments are reassembled as they arrive at the destination. 
  163. IP is often referred to as an unreliable delivery system because it makes a best-effort attempt to deliver all datagrams, but delivery is not guaranteed (TCP guarantees delivery). It is also called a connectionless delivery system because it routes each datagram separately. When IP receives a sequence of datagrams from TCP or UDP, it routes each datagram in the sequence individually, and each datagram may travel over a different path to the destination.
  164. Data link layer
  165. The AppleTalk Link Access Protocol (ALAP) and Ethernet Link Access Protocol (ELAP) provide services at the data link layer of the OSI model. ALAP and ELAP provide best-effort delivery of information between devices. They provide the basic service of packet transmission between devices connected to a single physical network.
  166. The MacTCP driver allows for the addition of other data link layers through the use of a link layer interface between the IP layer and the data link layer. This interface is described in the document Building Alternate Link Access Protocol Modules for MacTCP available in the Developer’s CD Series from the Apple Developer’s Group.
  167. Physical layer
  168. The MacTCP driver operates networks in which the physical layer uses the LocalTalk cable system or the Ethernet networking standard.
  169. 2    The MacTCP Driver
  170. The MacTCP driver is a Macintosh Operating System driver that implements the Internet Protocol (IP), User Datagram Protocol (UDP), and Transmission Control Protocol (TCP). A part of the Macintosh Operating System called the Device Manager coordinates communication between applications and the MacTCP driver.
  171. The MacTCP driver resides in the Macintosh System Folder. At startup time, the MacTCP driver registers itself with the Device Manager as .IPP.
  172. The MacTCP driver supports the following low-level Device Manager calls:
  173. n    PBOpen
  174. n    PBControl
  175. n    PBClose
  176. The PBOpen call
  177. Before the application can exchange information with the MacTCP driver, the driver must be opened using the Device Manager PBOpen call, which opens the driver and returns its reference number. All subsequent calls to the driver use this reference number.
  178. The MacTCP driver uses the INIT-31 mechanism to automatically install itself in the device table and load itself into the system heap each time the machine is restarted. At load time, all internal buffers needed by the MacTCP driver are also allocated on the system heap. These buffers are used (among other things) to hold incoming fragments awaiting reassembly and outgoing fragments following fragmentation. The amount of buffer space allocated is based on the amount of memory in the machine.
  179. The MacTCP driver performs its initialization sequence at PBOpen time. The initialization sequence includes initializing the local network handler, setting its local address and subnet mask, verifying that this address is reasonable and unused, and starting up the internal TCP/IP/UDP protocol machinery. PBOpen returns with an error code if any step in this process fails. In almost all cases, if PBOpen fails, the driver must be reconfigured and the system then restarted to clear the problem. Very few circumstances exist where transitory problems cause PBOpen to fail.
  180. Use the reference number returned from the PBOpen call in all subsequent PBControl calls to this drive. Also assign this value to the ioCRefNum field.
  181. Because of the complexity of initializing the MacTCP driver, PBOpen can return errors from many parts of the system, including the Resource Manager, Device Manager, File Manager, Slot Manager, and AppleTalk driver.
  182. The PBControl call
  183. The Device Manager PBControl call sends control information in the following parameter block to the driver:
  184. struct CntrlParam {
  185.     struct QElem *qLink;
  186.     short qType;
  187.     short ioTrap;
  188.     Ptr ioCmdAddr;
  189.     ProcPtr ioCompletion;
  190.     OSErr ioResult;
  191.     char *ioNamePtr;
  192.     short ioVRefNum;
  193.     short ioCRefNum;
  194.     short csCode;
  195.     short csParam[11];
  196. }
  197. In this parameter block csCode specifies the type of information sent. The MacTCP driver decides what to do based on the procedure number specified by csCode (the Appendix lists procedure numbers).
  198. All UDP and TCP routines documented in this guide are implemented as Device Manager Control calls. All MacTCP routines support both synchronous and asynchronous modes.
  199. If a synchronous call is made, the application can’t continue until the call is completed. When control is returned to the application, the result code in the parameter block is set indicating the success or failure of the call. 
  200. If the call is asynchronous, the I/O request is placed on the driver I/O queue, and control is returned to the calling program almost immediately. While requests are taken from the driver I/O queue one at a time and processed, the application is free to perform other tasks. The application has two ways of knowing when the call has been completed:
  201. n    By polling the ioResult field in the parameter block. When this value changes from InProgress to some other value, the call has been completed.
  202. n    By specifying an I/O completion routine to be called when the requested operation is complete.
  203. The ioCompletion field in the parameter block contains a pointer to a completion routine to be executed at the end of an asynchronous call. The ioCompletion field should be NIL for asynchronous calls with no completion routine and is automatically set to NIL for all synchronous calls.
  204. The driver uses the ioNamePtr and ioVRefNum fields internally.
  205. Each routine description includes a parameter block format. The number next to each field name indicates the byte offset of the field from the start of the parameter block pointed to by A0. An arrow next to each parameter name indicates whether it’s an input, output, or input/output parameter:
  206. Arrow    Meaning
  207. Æ    Parameter is passed to the routine.
  208. ¨    Parameter is returned by the routine.
  209. ´    Parameter is passed to and returned by the routine.
  210. All Device Manager Control calls return an integer result code of type OSErr in the ioResult field of the I/O parameter block. Each routine description lists all of the applicable result codes generated by the MacTCP driver, along with a short description of what the result code means.
  211. The PBClose call
  212. The application should not issue a PBClose call to the MacTCP driver. Because the driver can be shared by a variety of applications, once initialized, it never stops operation until the machine is restarted. PBClose returns a closeErr error code.
  213. The Gestalt call
  214.  
  215. The Gestalt call is used to obtain MacTCP driver version information (see the chapter “Compatibility Guidelines” in Inside Macintosh, Volume VI). To make the Gestalt call, use the mtcp selector. If you are using MacTCP driver version 1.1, a value of 1 is returned in the response field of the Gestalt call. If yu are using version 1.1.1, a value of 2 is returned. If you are using version 2.0, a value of 3 is returned. A value of 0 is returned if the driver is not opened.
  216. Implementation notes
  217. This section describes internal algorithms and decisions made by the MacTCP driver.
  218. Fragmentation and reassembly
  219. The Internet Protocol (IP) has the ability to fragment a packet so that it can be sent across a network with a small maximum transfer unit (MTU). The fragments are reassembled as they arrive at the destination. Since the application developer must select the size of UDP datagrams (unlike TCP, which negotiates packet size), you should be aware of implementation limitations imposed on the size of these datagrams.
  220. The MacTCP driver internally allocates a memory buffer in the system heap to temporarily hold all incoming fragments waiting to be reassembled and all outgoing fragments waiting to be sent. The amount of space allocated varies depending on whether 1, 2, or 4 megabytes (MB) of memory are installed. The maximum size of the packet being fragmented or reassembled depends solely on the available free space in this buffer. Because the memory pool is shared by all MacTCP users, the allowance for the maximum size of a UDPWrite packet will vary, depending on competing demands on the memory pool. A given destination can only guarantee the reassembly of a packet that is 576 bytes (including IP and UDP headers); therefore, it is possible to send a packet from the MacTCP driver that cannot be reassembled by the destination host.
  221. Routing
  222. The MacTCP driver supports routing through the Routing Information Protocol (RIP) and internally listens to RIP broadcasts. Because the MacTCP driver internally listens to RIP broadcasts, an attempt to create a UDP stream on local port 520 returns a duplicateSocket error.
  223. A default gateway can be configured using the Control Panel.
  224. 3    User Datagram Protocol
  225. The User Datagram Protocol (UDP) provides a low-overhead transaction service to allow upper-layer protocols to send datagrams between one another. UDP is datagram oriented with best-effort delivery, but it does not use acknowledgments to make sure messages are delivered to the destination, does not order incoming messages, and does not provide feedback to control the rate at which information flows between machines.
  226. Like the Transmission Control Protocol (TCP), UDP uses port fields to specify the source and destination processes of each transaction. An optional checksum is also used. 
  227. Data structures
  228. The UDP packet is composed of an 8-byte header, followed by up to 65,507 bytes of data. The UDP header has the following structure:
  229. 0    word    source port
  230. 2    word    destination port
  231. 4    word    length
  232. 6    word    checksum
  233. 8    variable    data
  234. Write Data Structures
  235. To send a UDP datagram, you must format a Write Data Structure (WDS), which has the format shown in Figure 3-1. A WDS specifies a list of buffers to write in a single operation.
  236. The simplest WDS describes a single buffer and is 8 bytes in length: a word length, a long pointer, followed by a terminating word of 0. The most complex WDS that can be used to send a UDP datagram describes 6 buffers and is 38 bytes in length.
  237.  
  238. Figure 3-1  UDP Write Data Structure
  239. Receive buffer area
  240. The User Datagram Protocol (UDP) does not allocate memory for storing UDP stream databases or for buffering received datagrams. Instead, you must pass UDP enough memory for these purposes in the UDPCreate call. This has two advantages:
  241. n    The buffer memory can be allocated off the application heap instead of the system heap, which is very limited.
  242. n    You have control over the buffering provided by UDP and can allocate the appropriate amount of memory for the type of application and performance level desired.
  243. This buffer area for incoming datagrams belongs to the MacTCP driver as long as the UDP stream is open. When UDPRelease is called, this memory is returned to you and you can then reuse it or return it to the system.
  244. Using UDP
  245. To send or receive UDP datagrams, you must first call UDPCreate to create a UDP stream, creating a port listener for the given UDP port and passing a memory block to the UDP driver to use in buffering incoming datagrams. UDPCreate also registers an asynchronous notification routine (ASR) that UDP uses to notify you of asynchronous events associated with this UDP stream. The MacTCP driver can support 63 open UDP streams simultaneously. The RIP process always has a stream open on port 520.
  246. To receive a UDP datagram, call UDPRead. Then, when you finish with the buffer that holds the received datagram, call UDPBfrReturn. To send a UDP datagram, call UDPWrite. When you finish using a UDP port, call UDPRelease to close the UDP stream.
  247. Note:  Use of link-level packets larger than the maximum transfer unit (MTU) on LocalTalk networks is not advised because there are several problems with these packets on Datagram Delivery Protocol-Internet Protocol (DDP-IP) gateways. The packet MTU size should be negotiated by upper-layer protocols.
  248. UDP routines
  249. This section describes calls to the UDP driver. Table 3-1 lists each UDP routine and its function.
  250. Table 3-1  UDP routines
  251. Routine    Function
  252. UDPCreate    Opens a UDP stream
  253. UDPRead    Retrieves a datagram received on a UDP stream
  254. UDPBfrReturn    Returns a receive buffer to the UDP driver
  255. UDPWrite    Sends a datagram on a UDP stream
  256. UDPRelease    Closes a UDP stream
  257. UDPMTU    Returns the maximum size of UDP data that can be sent in a datagram without IP fragmentation
  258. UDP Multiport Create    Opens UDP connections on a consecutive series of ports
  259. UDP Multiport Send    Sends a datagram from a specified port
  260.  
  261. UDP Multiport Receive    Receives data from a port that was created with the UDP Multiport Create command
  262. UDPCreate
  263. Parameter block    Æ    26    word    csCode =UPDCreate
  264. ¨    28    long    stream pointer
  265. Æ    32    long    pointer to receive buffer area
  266. Æ    36    long    length of receive buffer area
  267. Æ    40    long    pointer to asynchronous notification routine (ASR)
  268. ´    44    word    local UDP port
  269. Æ    46    long    user data pointer
  270. UDPCreate opens a UDP stream. It must be called before any UDP datagrams can be sent or received on a particular UDP port. UDPCreate returns a stream pointer that must be used in all subsequent UDP calls that operate on this UDP stream.
  271. The receive buffer area is a block of memory that you must give to the UDP driver. UDP uses this memory to buffer incoming datagrams. This block of memory belongs to UDP while the stream is open; it cannot be modified or relocated until UDPRelease is called. The minimum allowed size of the receive buffer area is 2048 bytes, but it should be at least 2N + 256 bytes in length, where N is the size in bytes of the largest UDP datagram you expect to receive. If you expect to receive datagrams that are of the physical Maximum Transmission Unit (MTU) size, make the UDPMTU call and use the returned number N to calculate memory size.
  272. The ASR is called by UDP to notify the user of asynchronous events such as data arrival and Internet Control Message Protocol (ICMP) messages. If the routine is 0, you are not notified of asynchronous events. See the next section, “UDP Asynchronous Notification Routine,” for more information.
  273. If the local port is 0, UDP assigns an unused local port.
  274. The user data pointer is returned in all ASRs for the created UDP stream.
  275. Result codes    noErr    no error
  276. streamAlreadyOpen    an open stream is already using this receive buffer area
  277. invalidLength    the receive buffer area is too small
  278. invalidBufPtr    the receive buffer area pointer is 0
  279. duplicateSocket    an open stream is already using this local UDP port
  280. insufficientResources    64 UDP streams are already open
  281. UDP asynchronous notification routine
  282. The asynchronous notification routine (ASR), which was registered with UDP in the UDPCreate call, is called by UDP to notify you of asynchronous events relevant to a particular UDP stream.
  283. Since this routine is called from the interrupt level, you must not allocate or return memory to the system. Also, you are not allowed to make further synchronous MacTCP calls from an ASR. The values of all registers must be preserved except registers A0–A2 and D0–D2.
  284. The C description of the ASR is as follows:
  285. pascal void UDPNotifyProc (
  286.     StreamPtr udpStream,
  287.     unsigned short eventCode,
  288.     Ptr userDataPtr,
  289.     struct ICMPReport *icmpMsg);
  290. NotifyProc is passed to the UDPCreate call for use on notification of data arrival and ICMP message reception. If this method of notification is not desired, no procedure should be passed to the UDPCreate call. (Pass an ASR pointer value of NIL.) Asynchronous notification is used with the UDPRead command only. All other commands complete in a finite amount of time and can be called synchronously.
  291. At entry, A0 contains the stream pointer, A1 contains a pointer to the ICMP report structure if the event code in D0 is ICMP received, A2 contains the user data pointer, A5 is already set up to point to application globals, and D0 (word) contains an event code.
  292. Event codes    UDPDataArrival    a UDP datagram has arrived on this stream 
  293.     but no UDPRead commands are outstanding
  294. UDPICMPReceived    an ICMP has been received on this stream; register A1 points to the ICMP report
  295. An ICMP message reports an error in the processing of a datagram that was sent on a UDP stream. When an ICMP message is received, a data structure is passed up by UDP to the client to describe the received message. This data structure, called an ICMP report, has the following format:
  296. 0    long    stream pointer
  297. 4    long    local IP address of stream
  298. 8    word    local UDP port of stream
  299. 10    long    remote IP address (destination of original datagram)
  300. 14    word    remote UDP port
  301. 16    word    ICMP message type
  302. 18    word    optional additional information
  303. 20    long    optional additional information pointer
  304. The values for the ICMP message type are as follows:
  305. 0    network unreachable
  306. 1    host unreachable
  307. 2    protocol unreachable
  308. 3    port unreachable
  309. 4    fragmentation required
  310. 5    source route failed
  311. 6    time exceeded
  312. 7    parameter problem
  313. 8    missing required option
  314. Codes 0–3 are defined as follows:
  315. n    Net unreachable indicates that, according to the information in a gateway routing table, the network specified in the IP destination field of a UDP datagram is unreachable.
  316. n    Host unreachable indicates that a gateway determined that the host specified in the IP destination field of a UDP datagram is unreachable. 
  317. n    Protocol unreachable indicates that a UDP datagram was delivered to the destination host, but UDP was not ready to receive any datagrams.
  318. n    Port unreachable indicates that a UDP datagram was delivered to the destination host, but no UDP client was listening on that particular port. 
  319. These ICMP messages may be received occasionally when the topology of the internet changes. A single destination unreachable message should not be taken too seriously; however, if several successive UDPSend commands each result in an ICMP report indicating that the destination is unreachable, the UDP client should assume that the remote host has either crashed or is no longer accessible.
  320. The remaining codes (4–8) indicate problems in the format of the IP header on a UDP datagram. They are informational only. Since the UDP client has no access to the IP header, you cannot correct the error.
  321. UDPRead
  322. Parameter block    Æ    26    word    csCode = UDPRead
  323. Æ    28    long    stream pointer
  324. Æ    32    word    command timeout value in seconds 
  325. (0 = infinite)
  326. ¨    34    long    remote IP address
  327. ¨    38    word    remote UDP port
  328. ¨    40    long    pointer to UDP data
  329. ¨    44    word    length of UDP data
  330. Æ    46    word    reserved; must be set to 0
  331. Æ    48    long    user data pointer
  332. UDPRead retrieves a datagram that has been received on the UDP stream defined by the stream pointer. Some number of datagrams are buffered internally within UDP even when no UDPRead commands are outstanding, so it is not necessary to keep a UDPRead command outstanding at all times. The exact number of datagrams that can be buffered within the MacTCP driver depends on the size of the receive buffer area given to MacTCP in the UDPCreate call and the size of datagrams received.
  333. If a UDP datagram arrives on an open UDP stream and no UDPRead commands are outstanding, you are given a data arrival notification as a hint that a UDPRead command should be issued. See the section “UDP Asynchronous Notification Routine” earlier in this chapter for more information.
  334. The command timeout period is specified in seconds. If no datagram arrives within the timeout period, the UDPRead command is completed in error. The minimum allowed value for the command timeout is 2 seconds. A zero command timeout means infinite; the UDPRead command will not be completed until a datagram arrives.
  335. The remote IP address and remote UDP port specify the source of the datagram.
  336. UDPRead can return successfully even though the length of UDP data is 0. This happens when a UDP packet arrives that has the passed-in value of the UDP stream’s local UDP port, but contains no data. Since the UDPSend command permits sending zero-length UDP datagrams, the UDPRead command must pass up zero-length datagrams for symmetry.
  337. For every UDPRead command that is completed successfully and returns a nonzero amount of data, you must call UDPBfrReturn with the same stream pointer and UDP data pointer, to return the receive buffer to the UDP driver for reuse.
  338. Result codes    noErr    no error
  339. invalidStreamPtr    the specified UDP stream is not open
  340. commandTimeout    no data arrived within the specified period 
  341. connectionTerminated    a UDPRelease command closed the UDP 
  342. UDPBfrReturn
  343. Parameter block    Æ    26    word    csCode = UDPBfrReturn
  344. Æ    28    long    stream pointer
  345. Æ    40    long    pointer to UDP data
  346. Æ    48    long    user data pointer
  347. UDPBfrReturn returns a receive buffer to the UDP driver that had been passed to you because of a successful UDPRead call that returned a nonzero amount of data.
  348. Result codes    noErr    no error
  349. invalidStreamPtr    the specified UDP stream is not open
  350. invalidBufPtr    the user does not own the UDP receive buffer
  351. UDPWrite
  352. Parameter block    Æ    26    word    csCode = UDPWrite
  353. Æ    28    long    stream pointer
  354. Æ    34    long    remote IP address
  355. Æ    38    word    remote UDP port
  356. Æ    40    long    pointer to WDS
  357. Æ    44    byte    checksum flag
  358. Æ    46    word    reserved; must be set to zero
  359. Æ    48    long    user data pointer
  360. UDPWrite sends a datagram on a UDP stream. 
  361. The datagram’s destination is specified by the remote IP address and remote UDP parameter ports. The buffers described by the WDS must not be modified or relocated until the command has been completed. The WDS can describe up to 6 buffers. The total length of the UDP data described by the WDS must be between 0 and 8,192 inclusive. If the Checksum flag is nonzero, UDP computes and transmits a checksum; otherwise, the checksum is transmitted as 0. The reserved field must be set to 0.
  362. In an Ethernet environment, the size of UDPWrite packets should be restricted to less than or equal to 8192 bytes. Packets of this size can usually be reassembled by computers operating in Ethernet environments. In a LocalTalk environment, the size of UDPWrite packets should be restricted to less than or equal to 1458 bytes because of Datagram Delivery Protocol-Internet Protocol (DDP-IP) gateway performance considerations.
  363. Note:  Unless you have prior knowledge of the capabilities of the destination machine, the UDPWrite size should be limited to the value returned by the UDPMTU call for maximum interoperability.
  364. Result codes    noErr    no error
  365. invalidStreamPtr    the specified UDP stream is not open
  366. invalidWDS    too many buffers are in WDS or WDS pointer     is NIL
  367. invalidLength    the total amount of data described by the WDS     was greater than 65,535 bytes
  368. insufficientResources    too many datagrams are outstanding in the     transmit queue
  369. ipNoFragMemErr    insufficient internal memory was available to     fragment the packet
  370. ipRouteErr    unable to send the packet to an off-network     destination because all gateways are down
  371. UDPRelease
  372. Parameter block    Æ    26    word    csCode = UDPRelease
  373. Æ    28    long    stream pointer
  374. ¨    32    long    pointer to receive buffer area
  375. ¨    36    long    length of receive buffer area
  376. Æ    46    long    user data pointer
  377. UDPRelease closes a UDP stream. Any outstanding commands on that stream are terminated with an error. The ownership of the receive buffer area used to create the UDP stream passes back to you.
  378. Before UDPRelease is called, you must make sure that all pending UDPWrite commands have been completed. There is no way to abort a UDPWrite command in progress.
  379. Note:  UDP Release must be called to release memory that is held by the driver. Failure to do so may produce unpredictable results. 
  380. Result codes    noErr    no error
  381. invalidStreamPtr    the specified UDP stream is not open
  382. UDPMTU
  383. Parameter block    Æ    26    word    csCode = UDPMaxMTUSize
  384. ¨    32    word    maximum datagram size
  385. Æ    34    long    remote address
  386. Æ    38    long    user data pointer
  387. UDPMTU returns the maximum size of UDP data that can be sent in a single datagram without fragmentation. This number does not include the IP and UDP headers. The value is relative to the destination address. If the address is on the local network, the network MTU size is returned; otherwise, a value of 548 is returned.
  388. Result codes    noErr    no error
  389. UDP Multiport Create
  390. Parameter block    Æ    26    word    csCode = UDPMultiCreate
  391. ¨    28    long    stream pointer
  392. Æ    32    long    pointer to receive buffer area
  393. Æ    36    long    length of receive buffer area
  394. Æ    40    long    pointer to asynchronous notification routine             (ASR)
  395. Æ    44    word    starting UDP port
  396. Æ    46    long    user data pointer
  397. Æ    50    word    ending port
  398. UDP Multiport Create opens UDP connections on a consecutive series of ports. This routine is similar to UDPCreate except that it takes a starting and ending port instead of a single UDP port. The starting port must not be zero. The connection is established on a range of ports, from the starting port to the ending port, inclusive. The UDP Multiport Send routine must be used with this type of connection stream (see the next section, “UDP Multiport Send”). Reading datagrams from this type of stream is identical to UDPRead, except that the receiving port may change from datagram to datagram.
  399. Result codes    noErr    no error
  400. streamAlreadyOpen    an open stream is already using this receive buffer area
  401. invalidLength        the receive buffer area is too small
  402. invalidBufPtr        the receive buffer area pointer is 0
  403. duplicateSocket        an open stream is already using this local UDP port
  404. insufficientResources    64 UDP streams are already open
  405. UDP Multiport Send
  406. Parameter block    Æ    26    word    csCode = UDPMultiSend
  407. Æ    28    long    stream pointer
  408. Æ    34    long    remote IP address
  409. Æ    38    word    remote UDP port
  410. Æ    40    long    pointer to WDS
  411. Æ    44    byte    checksum flag
  412. Æ    46    word    reserved
  413. Æ    48    long    user data pointer
  414. Æ    52    word    local port
  415. UDP Multiport Send sends a datagram from a specified port. (See “UDPWrite.”)
  416. Result codes    noErr    no error
  417. invalidStreamPtr        the specified UDP stream is not open
  418. invalidWDS        too many buffers are in WDS or WDS pointer is NIL
  419. invalidLength        the total amount of data described by the WDS was greater than 65,535 bytes
  420. insufficientResources    too many datagrams are outstanding in the transmit queue
  421. ipNoFragMemErr        insufficient internal memory is available to fragment the packet
  422. ipRouteErr        unable to send the packet to an off-network destination because all gateways are down
  423. UDP Multiport Receive
  424. Parameter block    Æ    26    word    csCode = UDPMultiRead
  425. Æ    28    long    stream pointer
  426. Æ    32    word    command timeout value in seconds 
  427. (0 = infinite)
  428. ¨    34    long    remote IP address
  429. ¨    38    word    remote UDP port
  430. ¨    40    long    pointer to UDP data
  431. ¨    44    word    length of UDP data
  432. Æ    46    word    reserved; must be set to 0
  433. Æ    48    long    user data pointer
  434. ¨    52    long    destination host
  435. ¨    56    word    destination port
  436. UDP Multiport Receive receives data from a port created with the UDP Multiport Create command. The port and host address on which the packet was received is specified in the destination port and destination host parameter-block fields.
  437. Result codes    noErr    no error
  438. invalidStreamPtr        the specified UDP stream is not open
  439. commandTimeout        no data arrived within the specified period
  440.  
  441. connectionTerminated    a UDPRelease command closed the UDP stream
  442. C parameter-block definitions
  443. The following C type definitions are used with parameter-block Device Manager calls to UDP:
  444. #define UDPCreate    20
  445. #define UDPRead    21
  446. #define UDPBfrReturn    22
  447. #define UDPWrite    23
  448. #define UDPRelease    24
  449. #define UDPMaxMTUSize    25
  450. #define UDPStatus    26
  451. #define UDPMultiCreate    27
  452. #define UDPMultiSend    28
  453. #define UDPMultiRead    29
  454. typedef enum UDPEventCode {
  455.     UDPDataArrival = 1,
  456.     UDPICMPReceived,
  457.     lastUDPEvent = 32767
  458.     }UDPEventCode; 
  459. typedef pascal void (*UDPNotifyProc) (
  460.     StreamPtr udpStream, 
  461.     unsigned short eventCode, 
  462.     Ptr userDataPtr,
  463.     struct ICMPReport *icmpMsg);
  464. typedef void (*UDPIOCompletionProc) (struct UDPiopb *iopb);
  465. typedef unsigned short udp_port;
  466. The following parameter block is used for UDPCreate, UDPMultiCreate, and UDPRelease calls:
  467. typedef struct UDPCreatePB {
  468.     Ptr     rcvBuff;
  469.     unsigned long    rcvBuffLen;
  470.     UDPNotifyProc    notifyProc;
  471.     unsigned short    localPort;
  472.     Ptr    userDataPtr;
  473.     udp_port    endingPort;
  474. } UDPCreatePB;
  475. Continued on following page .
  476. typedef struct UDPSendPB {
  477.     unsigned short    reserved;
  478.     ip_addr    remoteHost;
  479.     udp_port    remotePort;
  480.     Ptr    wdsPtr;
  481.     Boolean    checkSum;
  482.     unsigned short    sendLength;
  483.     Ptr    userDataPtr;
  484.     udp_port    localPort;
  485. } UDPSendPB;
  486. The following parameter block is used with the UDPRead, UDPMultiReceive, and UDPBfrReturn commands:
  487. typedef struct UDPReceivePB {
  488.     unsigned short    timeOut;
  489.     ip_addr    remoteHost;
  490.     udp_port    remotePort;
  491.     Ptr     rcvBuff;
  492.     unsigned short    rcvBuffLen;
  493.     unsigned short    secondTimeStamp;
  494.     Ptr    userDataPtr;
  495.     ip_addr    destHost;
  496.     udp_port    destPort;
  497. } UDPReceivePB;
  498. typedef struct UDPMTUPB {
  499.     unsigned short    mtuSize;
  500.     ip_addr    remoteHost;
  501.     Ptr    userDataPtr;
  502. } UDPMTUPB;
  503. typedef struct UDPiopb {
  504.     char        fill12[12];
  505.     UDPIOCompletionProc    ioCompletion;
  506.     short    ioResult;
  507.     char        *ioNamePtr;
  508.     short    ioVRefNum;
  509.     short    ioCRefNum;
  510.     short    csCode;
  511.     StreamPtr    udpStream;
  512.     union {
  513.         struct UDPCreatePB    create;
  514.         struct UDPSendPB    send;
  515.         struct UDPReceivePB    receive;
  516.         struct UDPMTUPB    mtu;
  517.     } csParam;
  518. } UDPiopb;
  519. 4    Transmission Control Protocol
  520. The Transmission Control Protocol (TCP) is a highly reliable, connection-oriented byte-stream protocol. It is designed to operate over a wide variety of networks and to provide virtual circuit service with orderly transmission of user data. TCP serves as the basis for a reliable interprocess communication mechanism on top of the IP layer where loss, damage, duplication, delay, or misordering of packets can occur. 
  521. Data structures
  522. This section describes TCP Read and Write Data Structures and the receive buffer area.
  523. Read and Write Data Structures
  524. The MacTCP driver uses Read Data Structures and Write Data Structures (RDS/WDS) to pass data between the user and TCP. These structures allow a single read or write operation to handle multiple blocks of data; that is, they allow scatter-read and gather-write capability. Figure 4-1 shows TCP Read and Write Data Structures.
  525. Figure 4-1  TCP Read and Write Data Structures
  526. The simplest possible Read and Write Data Structures are 8 bytes in length: a word length, a long pointer, and a terminating word of 0. Up to 65,000 buffers can be described by an RDS/WDS used to transfer data between TCP and the user.
  527. Receive buffer area
  528. TCP does not allocate memory for storing TCP stream databases or for buffering received datagrams. Instead, you are required to pass TCP enough memory for these purposes in the TCPCreate call. This has two advantages: 
  529. n    The buffer memory can be allocated off the application heap instead of the system heap, which is very limited.
  530. n    You have control over the buffering provided by TCP and can allocate the appropriate amount of memory for the type of application and performance level desired.
  531. The buffer area for incoming datagrams belongs to the MacTCP driver as long as the TCP stream is open. When TCPRelease is called, this memory is returned to you and you can then reuse it or return it to the system.
  532. An application should allocate memory by first finding the MTU of the physical network (see the UDPMTU section in Chapter 3). Some network devices supported by MacTCP have very large MTU sizes. If an appropriate amount of memory is not allocated to the TCP connection, the connection will behave unpredictably. The minimum memory allocation should be 4N + 1024, where N is the size of the physical MTU returned by the UDPMTU call.
  533. Using TCP
  534. This section describes how to send and receive TCP segments.
  535. Streams and connections
  536. A TCP stream supports one connection at a time. But a TCP connection on a stream can be closed and another connection opened without releasing the TCP stream. The MacTCP driver can support 64 open TCP streams simultaneously.
  537. Asynchronous notification routine
  538. When a TCP stream is created, a routine can be registered that TCP uses to notify you of asynchronous events relevant to that TCP stream. This routine is called the asynchronous notification routine (ASR).
  539. Examples of events that the MacTCP driver communicates to the user by means of an ASR include Timeout Expired, Data Arrived, and Connection Terminated. Since the ASR is called from the interrupt level, it cannot allocate or release memory. In addition, synchronous MacTCP driver commands cannot be issued from an ASR.
  540. Connection opening
  541. To listen for an incoming connection, use the TCPPassiveOpen command. This command can be used to specify whether any incoming connection will be accepted or only connections from a particular remote IP address and TCP port.
  542. To initiate outgoing connections, use the TCPActiveOpen command.
  543. Receiving data
  544. Two methods are available for receiving data: a high-performance method and a simple method. You can choose the method that best suits the application or combine the two methods if desired.
  545. Using the TCPNoCopyRcv routine is the high-performance method. Data is delivered to the user directly from the internal TCP receive buffers and no copy is required. An RDS is formatted to allow many received segments to be delivered to the user in one TCPNoCopyRcv command. TCPBfrReturn must be called for every TCPNoCopyRcv that returns a nonzero amount of data in order to return the internal receive buffers to the MacTCP driver.
  546. Using the TCPRcv routine is the simple method of receiving data. Data is copied from the TCP internal receive buffers into the user’s buffer, which can be of arbitrary length and location. No RDS is used and no TCPBfrReturn call is required. 
  547. Sending data
  548. To send data on a connection that is already established, use the TCPSend command.
  549. Both commands use WDSs to implement a gather-write capability. This allows you to send several noncontiguous chunks of data in one operation.
  550. Timeouts
  551. TCP normally provides some timeout services to the upper-layer protocol (ULP). This timeout service is known as the ULP timeout. If there is data to send on a connection, but for some specified period of time the data cannot be sent (either because the remote TCP is not set to receive any data or the data has been sent but the remote TCP has not acknowledged it), then the ULP timeout expires.
  552. When the ULP timeout expires, TCP executes the specified ULP timeout action. There are two possible actions: abort the connection or report the timer expiration by means of an ASR and restart the timer.
  553. In addition to this normal TCP timer, the MacTCP driver provides command timeouts on commands that are not subject to the ULP timer. These commands are TCPPassiveOpen, TCPNoCopyRcv, and TCPRcv.
  554. A TCPPassiveOpen command instructs TCP to wait for an incoming connection. The ULP timer is not started until the first connection initiation segment arrives. To prevent a TCPPassiveOpen command from waiting indefinitely for a connection initiation segment to arrive, a command timeout is provided. If no connection initiation segment is received within the specified timeout period, the TCPPassiveOpen command is completed with an error code.
  555. Similarly, the TCPNoCopyRcv and TCPRcv commands are not protected by the ULP timer. In the absence of command timeouts, both commands could wait indefinitely for data to arrive. If a command timeout is specified on a TCPNoCopyRcv or TCPRcv command, the command is always completed within the specified time period. If no data has arrived at that point, the command is completed with an error. If some data has arrived, the command is completed successfully, returning the data that has arrived so far.
  556. Pushed data
  557. Usually, TCP is allowed to collect data sent by means of TCPSend commands and to send that data in segments, as convenient. By setting the Push flag in the TCPSend command, TCP can be instructed to send all unsent data at once.
  558. Similarly, TCP is allowed to collect received data internally and deliver it with reasonable promptness to the user. However, when pushed data arrives, TCP immediately delivers all received data to the user.
  559. Note that there is no necessary relationship between the Push flag in a TCPSend command and segment boundaries. The push function does not provide a method of marking message boundaries.
  560. Urgent mode
  561. The urgent mechanism for TCP allows the sending user to prompt the receiving user to accept urgent data. It also permits the receiving TCP to indicate to the receiving user when all currently known urgent data has been received.
  562. TCP does not define what the user is required to do when in urgent mode, but the general practice is that the receiving user takes action to process the arriving data quickly.
  563. A receiving user can be put in urgent mode in two ways: by means of an Urgent flag in a TCPNoCopyRcv or TCPRcv command, or by an urgent ASR notification. The user is always taken out of urgent mode by a Mark flag in the TCPNoCopyRcv or TCPRcv command that contains the last byte of urgent data.
  564. To send data as urgent, you must set the Urgent flag in the TCPSend command.
  565. Note:  RFC 793 contained an incorrect specification pertaining to the description of the end of urgent data. Consequently, many hosts have implemented urgent data incorrectly. RFC 1122 corrects the definition of urgent data. The MacTCP driver is compliant with both specifications, allowing you to send urgent data using either specification. 
  566. Since there’s currently no known way to programmatically determine whether the remote site is compliant with RFC 793 or 1122, there’s no way to determine which urgent data format to use. You must devise your own strategy.
  567. It is recommended that you make urgent data self-formatting to circumvent the problem of detecting the exact end of urgent data.
  568. An application can send urgent data according to RFC 793 or 1122. Unless an application specifies otherwise, urgent data is sent using the method specified in RFC 1122.
  569. Connection closing
  570. TCP closes communications gracefully. All outstanding Send requests are transmitted and acknowledged before the connection is allowed to close. You can issue several TCPSend commands followed by a TCPClose command and expect that all the data will be sent successfully to the remote TCP. 
  571. A TCPClose command means “I have no more data to send,” but it does not mean “I will receive no more data” or “shut down this connection immediately.” A connection may remain open indefinitely as the remote TCP continues to send data after a TCPClose command has been completed. When the remote TCP also issues a close command—and only then—the connection is closed. A TCPRcv command should be issued after a TCPClose command has been completed to make sure that all the data is received.
  572. If the desired effect is to break the connection without any assurance that all data in transit is delivered, use the TCPAbort command.
  573. Network management information
  574.  
  575. TCP keeps two types of network management information: global TCP information and stream-specific information, which is relevant only to a particular stream.
  576. The TCPGlobalInfo command makes global TCP information accessible. This command returns pointers to the actual structures where TCP stores this information. Thus, the user has read-write access to this information.
  577. The TCPStatus command makes stream-specific information accessible. Most stream-specific information is copied into the TCPStatus I/O parameter block, giving the user read-only access. But a direct pointer to the traffic statistics allows the user read-write access to those counters (see the section “TCPGlobalInfo” later in this chapter).
  578. Formatting MacTCP commands
  579. In most cases, a 0 value for a parameter in an I/O parameter block means that TCP will use its default value. Thus, you must initialize I/O parameter blocks and then fill in the required parameters, plus optional parameters.
  580. TCP routines
  581. This section presents calls to the TCP driver. Table 4-1 lists each TCP routine and its function. 
  582. Table 4-1  TCP routines
  583. Routine    Function
  584. TCPCreate    Opens a TCP stream
  585. TCPPassiveOpen    Listens for an incoming connection
  586. TCPActiveOpen    Initiates an outgoing call to a remote TCP
  587. TCPSend    Sends specified data on a connection
  588. TCPNoCopyRcv    Retrieves data that has been received on a connection
  589. TCPBfrReturn    Returns a set of receive buffers to the TCP driver
  590. TCPRcv    Retrieves data that has been received on a connection
  591. TCPClose    Signals that the user has no more data to send on this     connection
  592. TCPAbort    Terminates the connection without trying to send     outstanding data or deliver received data
  593. TCPStatus    Extracts information from TCP regarding a particular     connection
  594. TCPRelease    Closes a TCP stream
  595. TCPGlobalInfo    Allows the user access to global statistics and parameters that affect the operation of TCP
  596. TCPCreate
  597. Parameter block    Æ    26    word    csCode = TCPCreate
  598. ¨    28    long    stream pointer
  599. Æ    32    long    pointer to receive buffer area
  600. Æ    36    long    length of receive buffer area
  601. Æ    40    long    pointer to ASR
  602. Æ    44    long    user data pointer
  603. TCPCreate opens a TCP stream. A TCP stream is not equivalent to a TCP connection. The MacTCP driver returns a pointer to a stream database. The stream pointer is an input parameter in all subsequent commands affecting the stream.
  604. The receive buffer area is a block of memory that TCP uses to buffer incoming segments. Ownership of this block of memory passes to TCP. The memory—a minimum of 4096 bytes—cannot be modified or relocated until TCPRelease is called. The size of the receive window that TCP offers is based on the size of the receive buffer area passed to TCP in the TCPCreate call. High-performance and block-oriented applications should provide TCP with a large receive buffer area: 16 kilobytes (KB) is recommended and up to 128 KB can be useful in certain applications. Character-oriented applications can use the minimum value of 4096 bytes; however, at least 8192 bytes are recommended.
  605. An ASR may be provided. The ASR is called by TCP to notify you of asynchronous events such as Data arrival, Urgent data outstanding, and Connection terminated. If the routine is 0, you are not notified of asynchronous events.
  606. Result codes    noErr    no error
  607. streamAlreadyOpen    an open stream is already using this receive buffer area
  608. invalidLength    the receive buffer area is too small
  609. invalidBufPtr    the receive buffer area pointer is 0
  610. insufficientResources    64 TCP streams are already open
  611. TCP asynchronous notification routine
  612. The TCP asynchronous notification routine (ASR) is a user-supplied routine called by TCP to notify you of asynchronous events relevant to a particular TCP stream. You register this routine with TCP in the TCPCreate call.
  613. Since this routine is called at interrupt level, it cannot release or allocate memory. An ASR routine can issue additional asynchronous MacTCP driver calls.
  614. The C description of the ASR is as follows:
  615. pascal void    TCPNotifyProc (
  616.             StreamPtr tcpStream,
  617.             unsigned short eventCode,
  618.             Ptr userDataPtr,
  619.             unsigned short terminReason,
  620.             struct ICMPReport *icmpMsg);
  621. Register A1 contains a pointer to the Internet Control Message Protocol (ICMP) report structure if the event code in D0 is ICMP received, A2 contains the user data pointer, A5 is already set up to point to application globals, D0 (word) contains an event code, and D1 contains a reason for termination.
  622. Event codes    closing    all data on this connection has been received 
  623.     and delivered
  624. ULP timeout    no response from the remote TCP; reported only if TCP is configured to report a timeout instead of aborting the connection
  625. terminate    connection no longer exists
  626. data arrival    data arrived, no receive commands outstanding
  627. urgent data outstanding    user should go into urgent mode
  628. ICMP message received    an Internet Control Message has been received on the stream; register A1 points to the ICMP report
  629. For the terminate event, a reason for connection termination is given in D1 (word):
  630. remote abort    the remote TCP aborted the connection
  631. network failure    currently not in use
  632. security/precedence     invalid security option or precedence level
  633. mismatch
  634. ULP timeout    the ULP timeout expired; ULP timeout action is abort
  635. ULP abort    the user issued a TCPAbort command
  636. ULP close    the connection closed gracefully
  637. service failure    unexpected connection initiation segment read
  638. Note:  Refer to the Appendix for the values of these types.
  639. A closing notification means that the remote TCP has sent all the data it intends to send on this connection and that all data has been delivered to the user. Closing notification does not mean that the connection has been broken. You can continue to send data for an arbitrary length of time after a closing notification is given. Only when you issue a TCPClose command will the connection be terminated.
  640. The ULP timeout notification is given if the configured ULP timeout action for this connection is report, and the local TCP cannot get some data sent or acknowledged (or both), within the specified ULP timeout period. The ULP timer is restarted after notification and expires again in another ULP timeout period if nothing changes.
  641. For each connection, TCP issues exactly one terminate notification when the connection is broken. This rule applies both when the connection closes gracefully and when the connection terminates in error.
  642. Data arrival notification is given if a segment arrives and no receive commands are outstanding. Even if more data arrives later, TCP does not issue another data arrival notification until a receive command has been issued and completed. In other words, a data arrival notification is not given with every segment that arrives, but instead is intended to prompt you to issue a receive command.
  643. Urgent notification is given only if no receive commands are pending when TCP discovers outstanding urgent information on the connection. If there are outstanding receive commands, they are completed with the Urgent flag set, starting the reception of data in urgent mode.
  644. An ICMP message reports an error in the processing of a datagram that was sent on a TCP stream. When an ICMP message is received, a data structure is passed up by TCP to the client to describe the received message. This data structure, called an ICMP report, has the following format:
  645. 0    word    stream pointer
  646. 2    long    local IP address of stream
  647. 6    word    local TCP port of stream
  648. 8    long    remote IP address (destination of original datagram)
  649. 12    word    remote TCP port
  650. 14    word    ICMP message type
  651. 16    word    optional additional information
  652. 18    long    optional additional information pointer
  653. The values for the ICMP message type are as follows:
  654. 0    net unreachable
  655. 1    host unreachable
  656. 2    protocol unreachable
  657. 3    port unreachable
  658. 4    fragmentation required
  659. 5    source route failed
  660. 6    time exceeded
  661. 7    parameter problem
  662. 8    missing required option
  663. Codes 0–3 are defined as follows:
  664. n    Net unreachable indicates that, according to the information in a gateway routing table, the network specified in the IP destination field of a TCP segment is unreachable.
  665. n    Host unreachable indicates that a gateway determined that the host specified in the IP destination field of a TCP segment is unreachable.
  666. n    Protocol unreachable indicates that a TCP segment was delivered to the destination host, but there was no process on that host to receive TCP segments.
  667. n    Port unreachable indicates that a TCP segment was delivered to the destination host, but there was no client of TCP listening on that particular TCP port.
  668. If the TCP stream is configured for the ULP abort timeout action, the TCP client need not take any action in response to destination unreachable messages (they are informational only).
  669. TCP breaks the connection if there is data to send, but it is not acknowledged within the ULP timeout period. If, however, this TCP stream has been configured for the ULP report timeout action, then the TCP user has taken responsibility for deciding when and if the remote host is no longer available, and the connection should be broken.
  670. A single destination unreachable message should not be taken too seriously because such messages may be received occasionally when the topology of the internet changes. But if several successive TCPSend commands each result in an ICMP report indicating destination unreachable, the TCP client should assume that the remote host has either crashed or is no longer accessible and should break the connection.
  671. Codes 4–8 are defined as follows:
  672. n    Fragmentation required indicates that the TCP user has set the Don’t Fragment flag in a TCPOpen command, yet a segment on that TCP connection could not be delivered to its destination without fragmentation. To avoid this, don’t set the Don’t Fragment flag on TCPOpen commands.
  673. n    Source route failed indicates that the TCP user has specified the route this datagram should take in the IP options but that particular route was not available.
  674. n    Time exceeded indicates that the Time to Live specified in a TCPOpen command was too short to allow a TCP segment on this TCP stream to be delivered through all the necessary gateways on the way to its destination. A longer Time to Live value should be specified in the TCPOpen command.
  675. n    Parameter problem indicates that the IP header used on a TCP segment was not acceptable by either an intermediate gateway or the final destination. The additional information pointer in the ICMP report structure points to a static copy of the IP header used for sending segments on this TCP connection. The additional information value indicates a byte offset in the IP header where the parameter problem exists. For example, an offset of 1 indicates that the Type of Service field is invalid, and an offset of 20 indicates that the first option present is invalid.
  676. n    Missing required option means that the remote TCP requires that a specific IP option be present in the IP header. The IP option type code that is required by the remote TCP is passed in the additional information field.
  677. Much of the information that asynchronous notifications pass to you is also available in other ways. For example, you can tell that the remote TCP has closed a connection either by waiting for a closing notification or by submitting TCPRcv commands until one is returned with a connectionClosing error.
  678. TCPPassiveOpen
  679. Parameter block    Æ    26    word    csCode = TCPPassiveOpen
  680. Æ    28    long    stream pointer
  681. Æ    32    byte    ULP timeout value in seconds; 0 = use default
  682. Æ    33    byte    ULP timeout action; 0 = report, 
  683. nonzero = abort
  684. Æ    34    byte    validity bits for optional parameters
  685. Æ    35    byte    command timeout in seconds; 0 = infinity
  686. ´    36    long    remote IP address; can be 0
  687. ´    40    word    remote TCP port; can be 0
  688. ¨    42    long    local IP address
  689. ´    46    word    local TCP port; if 0, TCP assigns an unused port
  690. Æ    48    byte    type of service
  691. Æ    49    byte    precedence
  692. Æ    50    byte    don’t fragment flag
  693. Æ    51    byte    time to live
  694. Æ    52    byte    security flag
  695. Æ    53    byte    IP option count
  696. Æ    54    var.    IP options
  697. Æ    94    long    user data pointer
  698. TCPPassiveOpen listens for an incoming connection. The command is completed when a connection is established or when an error occurs.
  699. Several fields in the TCPPassiveOpen command are optional. To indicate whether the user is including these optional parameters, a set of validity bits is defined as follows:
  700. bit 4    precedence parameter is valid
  701. bit 5    type of service parameter is valid
  702. bit 6    ULP timeout action parameter is valid
  703. bit 7    ULP timeout value parameter is valid
  704. For example, a value of 0xC0 would mean that the ULP timeout value and action parameters are valid. If a validity bit is 0, TCP uses its default value for that parameter.
  705. If the remote IP address and remote TCP port are 0, a connection is accepted from any remote TCP. If they are nonzero, a connection is accepted only from that particular remote TCP. If the local TCP port is 0, TCP assigns an unused port value.
  706. If a connection is partly established but cannot be completed within the ULP timeout period after the first connection opening segment arrives, the ULP action is taken. If the ULP timeout action is abort (the default value), the connection is broken and the TCPPassiveOpen command is completed in error. If the ULP timeout action is report, an ASR call informs the ULP, and the ULP timer is restarted. The minimum value of the ULP timeout is 2 seconds; 0 means that TCP should use its default value of 2 minutes.
  707. If no connection opening packet arrives within the specified command timeout period after the TCPPassiveOpen command is issued, the command is completed in error. The minimum value of the command timeout is 2 seconds; 0 means infinite.
  708. You have control over many fields in the IP header of all segments sent on this connection. You can set these fields only when the connection is opened. They stay fixed during the connection. 
  709. The type of service is a 3-bit field:
  710. bit 0    set for low delay
  711. bit 1    set for high throughput
  712. bit 2    set for high reliability
  713. For example, a value of 0x02 means high throughput. The default value is 0.
  714. Precedence has the following values:
  715. 0    routine
  716. 1    priority
  717. 2    immediate
  718. 3    flash
  719. 4    flash-override
  720. 5    CRITIC/ECP
  721. 6    internetwork control
  722. 7    network control
  723. The default value for precedence is 0.
  724. If the Don’t Fragment flag is nonzero, all segments sent on this connection are prohibited from being fragmented by the local IP or any intermediate IP. If a segment cannot be delivered without fragmentation, it’s discarded.
  725. The Time to Live indicates the maximum time that segments on this connection are allowed to remain in the internet system. This value is decreased by every IP module that processes the segment; thus, it is effectively a maximum hop count (the number of times a segment can pass through a module). The minimum value is 2; 0 means TCP should use its default value (the default value is 60).
  726. If the Security flag is nonzero, TCP inserts its configured default IP security option into all segments sent on this connection. In addition, for all arriving segments that contain a security option, TCP verifies that the security matches the configured default security. Note that this flag is relevant only if no security option is present in the user-specified IP options.
  727. Finally, you can specify additional IP options to be sent with every segment. The option count is the number of long words in the IP option field. Pad bytes of 0 should be appended to the IP options so that the options are an integral number of long words. The maximum value of the option count field is 10 unless the Security flag is also nonzero, in which case the maximum value is 9.
  728. TCP does not perform any verification on the user-specified IP options, but simply inserts them into the IP header of every segment sent on the connection. If you specify an invalid list of IP options, the result cannot be predicted. See Request for Comment (RFC) 894 for the proper format of IP options.
  729. Result codes    noErr    no error
  730. invalidStreamPtr    the specified TCP stream is not open
  731. connectionExists    this TCP stream already has an open connection
  732. duplicateSocket    a connection already exists between this local IP address and TCP port, and the specified remote IP address and TCP port
  733. commandTimeout    no connection attempt was received in the specified time-out period
  734. openFailed    the connection came halfway up and then failed
  735. TCPActiveOpen
  736. Parameter block    Æ    26    word    csCode = TCPActiveOpen
  737. Æ    28    long    stream pointer
  738. Æ    32    byte    ULP timeout value in seconds; 0 = use default
  739. Æ    33    byte    ULP timeout action; 0 = report, 
  740. nonzero = abort
  741. Æ    34    byte    validity bits
  742. Æ    36    long    remote IP address; cannot be 0
  743. Æ    40    word    remote TCP port; cannot be 0
  744. ¨    42    long    local IP address
  745. ´    46    word    local TCP port; if 0, TCP assigns an unused port
  746. Æ    48    byte    type of service
  747. Æ    49    byte    precedence
  748. Æ    50    byte    don’t fragment flag
  749. Æ    51    byte    time to live
  750. Æ    52    byte    security flag
  751. Æ    53    byte    IP option count
  752. Æ    54    byte[40]    IP options
  753. Æ    94    long    user data pointer
  754. TCPActiveOpen initiates an outgoing call to a remote TCP. The command is completed when a connection is established or when an error occurs. 
  755. TCPActiveOpen accepts the same parameters as TCPPassiveOpen, except that the remote IP address and remote TCP port must be specified. Further, no command timeout is provided; if the connection cannot be established within the ULP timeout period, the command is completed in error.
  756. See TCPPassiveOpen for a description of other parameters.
  757. Result codes    noErr    no error
  758. invalidStreamPtr    the specified TCP stream is not open
  759. connectionExists    this TCP stream already has an open connection
  760. duplicateSocket    a connection already exists between this local IP address and TCP port, and the specified remote IP address and TCP port
  761. openFailed    the connection came halfway up and then failed
  762. TCPSend
  763. Parameter block    Æ    26    word    csCode = TCPSend
  764. Æ    28    long    stream pointer
  765. Æ    32    byte    ULP timeout value in seconds
  766. Æ    33    byte    ULP timeout action; nonzero = abort, 
  767. 0 = report
  768. Æ    34    byte    validity bits
  769. Æ    35    byte    push flag
  770. Æ    36    byte    urgent flag
  771. Æ    38    long    WDS pointer
  772. Æ    42    long    reserved
  773. Æ    46    word    reserved
  774. Æ    48    long    user data pointer
  775. TCPSend sends the specified data over the connection. The command is completed when all data has been sent and acknowledged or when an error occurs.
  776. If all data cannot be sent and acknowledged within the ULP timeout period, then the ULP action is taken. If the ULP action is abort, the connection is broken, all pending commands are returned, and a terminate notification is given. If the ULP action is report, a ULP timeout notification is given.
  777. Several fields in the TCPPassiveOpen command are optional. To indicate whether the user is including these optional parameters, a set of validity bits is defined as follows:
  778. bit 6    ULP timeout action parameter is valid
  779. bit 7    ULP timeout value parameter is valid
  780. If the Push flag is nonzero, TCP sends the data immediately without waiting to see if more TCPSend commands are issued. If the Urgent flag is 2, TCP sends the data using the noncompliant method described by RFC 793. If the Urgent flag is any other nonzero value, TCP sends the data using the method described by RFC 1122. For more information about the TCP urgent mechanism, refer to the section “Urgent Mode” earlier in this chapter.
  781. The WDS can be arbitrarily complex; that is, there is no limit to the number of buffers that can be sent in a TCPSend command. However, the total number of data bytes described by the WDS must be between 1 and 65,535, inclusive. You must not modify or relocate the WDS and the buffers it describes until the TCPSend command has been completed.
  782. Result codes    noErr    no error
  783. invalidStreamPtr    the specified TCP stream is not open
  784. invalidLength    the total amount of data described by the WDS was either 0 or greater than 65,535 bytes
  785. invalidWDS    the WDS pointer was 0
  786. connectionDoesntExist    there is no open connection on this TCP stream
  787. connectionClosing    a TCPClose command was already issued, so there is no more data to send on this connection
  788. connectionTerminated    the connection was broken; the reason will be given in a terminate ASR
  789. TCPNoCopyRcv
  790. Parameter block    Æ    26    word    csCode = TCPNoCopyRcv
  791. Æ    28    long    stream pointer
  792. Æ    32    byte    command timeout in seconds
  793. ¨    34    byte    mark flag
  794. ¨    35    byte    urgent flag
  795. Æ    42    long    RDS pointer; RDS is modified by TCP
  796. Æ    46    word    number of entries in RDS excluding terminating 0; not modified by TCP
  797. Æ    48    word    reserved
  798. Æ    50    long    user data pointer
  799. TCPNoCopyRcv retrieves data that has been received on a connection. Data is not copied out of the internal buffers of TCP; rather, an RDS is formatted to allow the user access to the TCP data in place. This command offers significant performance improvements over TCPRcv commands.
  800. The command is completed when
  801. n    pushed data arrives
  802. n    urgent data is outstanding
  803. n    a reasonable period passes after the arrival of nonpush, nonurgent data
  804. n    the RDS is full; that is, the received data is in more noncontiguous chunks than the RDS can describe
  805. n    the amount of data received is greater than or equal to 25 percent of the total receive buffering for this stream
  806. n    the command timeout expires
  807. You must allocate memory for the RDS, which can contain an unlimited number of elements. The specified number of entries in the RDS does not include the terminating 0. For example, the simplest possible RDS has one element and is 8 bytes in length: a word length field, a long pointer field, and a terminating word length field of 0.
  808. TCP formats the RDS to point to the received TCP data. The RDS may not be completely filled by TCP. For example, if you pass an RDS three entries, TCP may complete the TCPNoCopyRcv command with the RDS describing only one buffer. TCP does not modify the field in the TCPNoCopyRcv command that indicates the number of entries in the RDS; rather, it places a terminating zero in the RDS itself.
  809. The command timeout period starts when the receive command is issued, not when the first byte of data arrives. If no data arrives within this timeout period, the TCPNoCopyRcv command is completed in error. If some data has arrived when the command timeout expires, the TCPNoCopyRcv command is completed successfully, returning the data that has arrived so far. A command timeout of 0 indicates an infinite timeout period. In this case, the TCPNoCopyRcv command is not completed until some data has arrived.
  810. If the Urgent flag is nonzero, the data returned by this command is the beginning of the outstanding urgent data. This flag is one of two mechanisms that puts you in urgent mode. The other mechanism is by means of an urgent ASR notification, which is used when there are no outstanding TCPNoCopyRcv or TCPRcv commands.
  811. If the Mark flag is nonzero, the data returned by this command ends the urgent data. Since TCP does not deliver urgent and nonurgent data together, the last byte of data described by the RDS is the last byte of urgent data. The Mark flag is the only mechanism for taking you out of urgent mode.
  812. The Urgent flag is set only on the first TCPNoCopy Rcv or TCPRcv command that contains urgent data. The Mark flag will be set only on the last TCPNoCopyRcv or TCPRcv command that contains urgent data. For example, if three TCPNoCopyRcv or TCPRcv commands are required to deliver all urgent data, the settings of the Urgent and Mark flags will be as follows:
  813.     Urgent flag    Mark flag
  814. First TCPNoCopyRcv/TCPRcv command    1    0
  815. Second TCPNoCopyRcv/TCPRcv command    0    0
  816. Third TCPNoCopyRcv/TCPRcv command    0    1
  817. Both the Urgent flag and the Mark flag can be set in a single TCPNoCopyRcv or TCPRcv command if all outstanding urgent data can be delivered in a single command.
  818. You are responsible for calling TCPBfrReturn after every TCPNoCopyRcv command that is completed successfully, in order to return the receive buffers owned by the TCP driver. The RDS must be returned unmodified so that the TCP driver can correctly recover the appropriate receive buffers.
  819. Result codes    noErr    no error
  820. invalidStreamPtr    the specified TCP stream is not open
  821. connectionDoesntExist    this TCP stream has no open connection
  822. invalidLength    the RDS has 0 entries
  823. invalidBufPtr    the RDS pointer was 0
  824. commandTimeout    no data arrived within the specified timeout period
  825. connectionClosing    all data on this connection has already been delivered
  826. connectionTerminated    the connection was broken; the reason will be given in a terminate ASR
  827. TCPBfrReturn
  828. Parameter block    Æ    26    word    csCode = TCPRcvBfrReturn
  829. Æ    28    long    stream pointer
  830. Æ    42    long    RDS pointer
  831. Æ    50    long    user data pointer
  832. TCPBfrReturn returns to the TCP driver a set of receive buffers that a successfully completed TCPNoCopyRcv command passed directly to the user. The RDS must be identical to the RDS given to the user when the TCPNoCopyRcv command is completed. TCPBfrReturn returns an error if you attempt to return a set of buffers more than once.
  833. Result codes    noErr    no error
  834. invalidStreamPtr    the specified TCP stream is not open
  835. connectionDoesntExist    this TCP stream has no open connection
  836. invalidBufPtr    the RDS pointer was 0
  837. invalidRDS    the RDS refers to receive buffers not owned by the user
  838. TCPRcv
  839. Parameter block    Æ    26    word    csCode = TCPRcv
  840. Æ    28    long    stream pointer
  841. Æ    32    byte    command timeout in seconds
  842. ¨    34    byte    mark flag
  843. ¨    35    byte    urgent flag
  844. Æ    36    long    receive buffer pointer
  845. ´    40    word    receive buffer length
  846. Æ    48    word    reserved
  847. Æ    50    long    user data pointer
  848. TCPRcv retrieves data that has been received on a connection. Data is copied out of the TCP internal buffers into the user’s buffer. The command is completed when
  849. n    enough data has arrived to fill the receive buffer
  850. n    pushed data arrives
  851. n    urgent data is outstanding
  852. n    a reasonable period passes after the arrival of nonpushed, nonurgent data
  853. n    the amount of data received is greater than or equal to 25 percent of the total receive buffering for this stream
  854. n    the command timeout expires
  855. The command timeout period starts when the receive command is issued, not when the first byte of data arrives. If no data arrives within this command timeout period, the TCPRcv command is completed in error. If some data has arrived when the command timeout expires, the TCPRcv command is completed successfully. A command timeout of 0 means infinite; the TCPRcv command will not be completed until some data has arrived.
  856. If the Urgent flag is nonzero, the data returned by this command is the beginning of the outstanding urgent data. This flag is one of two mechanisms that puts you in urgent mode. The other mechanism is by means of an urgent ASR notification, which is used when there are no outstanding TCPNoCopyRcv or TCPRcv commands.
  857. If the Mark flag is nonzero, the data returned by this command ends the urgent data. Since TCP does not deliver urgent and nonurgent data together, the last byte of data in the receive buffer is the last byte of urgent data. The Mark flag is the only mechanism for taking you out of urgent mode.
  858. The Urgent flag is set only on the first TCPNoCopyRcv or TCPRcv command that contains urgent data. The Mark flag is set only on the last TCPNoCopyRcv or TCPRcv command that contains urgent data. For example, if three TCPNoCopyRcv or TCPRcv commands are required to deliver all urgent data, the settings of the Urgent and Mark flags will be as follows:
  859.     Urgent flag    Mark flag
  860. First TCPNoCopyRcv/TCPRcv command    1    0
  861. Second TCPNoCopyRcv/TCPRcv command    0    0
  862. Third TCPNoCopyRcv/TCPRcv command    0    1
  863. Both the Urgent flag and the Mark flag can be set in a single TCPNoCopyRcv or TCPRcv command if all outstanding urgent data can be delivered in a single command.
  864. The amount of data actually received is found in the receive buffer length field.
  865. If the TCPRcv command is completed in error, the receive buffer length is not modified by TCP, but no data is returned.
  866. Result codes    noErr    no error
  867. invalidStreamPtr    the specified TCP stream is not open
  868. invalidLength    the receive buffer length was 0
  869. invalidBufPtr    the receive buffer pointer was 0
  870. commandTimeout    no data arrived within the specified timeout period
  871. connectionDoesntExist    this TCP stream has no open connection
  872. connectionClosing    all data on this connection has already been delivered
  873. connectionTerminated    the connection was broken; the reason will be given in a terminate ASR
  874. TCPClose
  875. Parameter block    Æ    26    word    csCode = TCPClose
  876. Æ    28    long    stream pointer
  877. Æ    32    byte    ULP timeout value in seconds
  878. Æ    33    byte    ULP timeout action; 0 = report, 
  879. nonzero = abort
  880. Æ    34    byte    validity bits
  881. Æ    35    long    user data pointer
  882. TCPClose signals that the user has no more data to send on the connection. It does not mean that the connection should be broken. The remote TCP must also issue a close before the connection can be gracefully closed, so a connection may remain an arbitrary amount of time after you have issued a TCPClose. To break a connection without ensuring that all data has been sent and acknowledged, use the TCPAbort command. (See the section “Connection Closing” earlier in this chapter.)
  883. The command is completed when the FIN flag has been sent and acknowledged. If the FIN is not acknowledged within the ULP timeout period, the ULP timeout action is taken. If the ULP action is abort, the connection is broken, all pending commands are returned, and a terminate notification is given. If the ULP action is report, a ULP timeout notification is given.
  884. Several fields in the TCPPassiveOpen command are optional. To indicate whether the user is including these optional parameters, a set of validity bits is defined as follows:
  885. bit 6    ULP timeout action parameter is valid
  886. bit 7    ULP timeout value parameter is valid
  887. Result codes    noErr    no error
  888. invalidStreamPtr    the specified TCP stream is not open
  889. connectionDoesntExist    this TCP stream has no open connection
  890. connectionClosing    one TCPClose command was already issued for this connection
  891. connectionTerminated    the connection was broken; the reason will be given in a terminate ASR
  892. TCPAbort
  893. Parameter block    Æ    26    word    csCode = TCPAbort
  894. Æ    28    long    stream pointer
  895. Æ    32    long    user data pointer
  896. TCPAbort terminates the connection without attempting to send all outstanding data or to deliver all received data. TCPAbort returns the TCP stream to its initial state. You are also given a terminate notification.
  897. Result codes    noErr    no error
  898. invalidStreamPtr    the specified TCP stream is not open
  899. connectionDoesntExist    this TCP stream has no open connection
  900. TCPStatus
  901. Parameter block    Æ    26    word    csCode = TCPStatus
  902. Æ    28    long    stream pointer
  903. ¨    32    byte    ULP timeout value in seconds
  904. ¨    33    byte    ULP timeout action; 0 = report, 
  905. nonzero = abort
  906. ¨    38    long    remote IP address
  907. ¨    42    word    remote TCP port
  908. ¨    44    long    local IP address
  909. ¨    48    word    local TCP port
  910. ¨    50    byte    type of service
  911. ¨    51    byte    precedence
  912. ¨    52    byte    TCP connection state
  913. ¨    54    word    send window
  914. ¨    56    word    receive window
  915. ¨    58    word    amount of unacknowledged data
  916. ¨    60    word    amount of unread data
  917. ¨    62    long    security option pointer
  918. ¨    66    long    send unacknowledged
  919. ¨    70    long    send next
  920. ¨    74    long    congestion window
  921. ¨    78    long    receive next
  922. ¨    82    long    smoothed round-trip time in milliseconds
  923. ¨    86    long    last round-trip time in milliseconds
  924. ¨    90    long    maximum segment size that can be sent
  925. ¨    94    long    pointer to statistics block
  926. Æ    98    long    user data pointer
  927. TCPStatus allows you to extract information from TCP regarding a particular connection.
  928. See the TCPPassiveOpen command for a description of the usual open parameters (bytes 32–51).
  929. The TCP connection state has the following values:
  930. 0    Closed    no connection exists on this stream
  931. 2    Listen    listening for an incoming connection
  932. 4    SYN received    incoming connection is being established
  933. 6    SYN sent    outgoing connection is being established
  934. 8    Established    connection is up
  935. 10    FIN Wait 1    connection is up; close has been issued
  936. 12    FIN Wait 2    connection is up; close has been completed
  937. 14    Close Wait    connection is up; close has been received
  938. 16    Closing    connection is up; close has been issued and         received
  939. 18    Last Ack    connection is up; close has been issued and         received
  940. 20    Time Wait    connection is being broken
  941. The send window is the amount of data the remote TCP is currently willing to accept from the local TCP. The receive window is the amount of data the local TCP is currently willing to accept from the remote TCP.
  942. The statistics block has the following structure:
  943. 0    long    number of data segments received
  944. 4    long    number of data segments sent
  945. 8    long    number of data segments retransmitted
  946. 12    long    number of data bytes received
  947. 16    long    number of duplicate data bytes received
  948. 20    long    number of data bytes received beyond receive window
  949. 24    long    number of data bytes sent
  950. 28    long    number of data bytes retransmitted
  951. 32    struct    size histogram of sent segments
  952. The histogram is a variable-length structure of the following format:
  953. 0    word    number of size buckets
  954. 2    word    value: smallest segment size
  955. 4    long    counter number: number of segments sent between this size and the next larger size
  956. 8    word    value: second smallest segment size
  957. 10    long    counter number: number of segments sent between this size and the next larger size
  958. You are free to update the statistics block. Only the counters in the segment-size histogram should be modified. The number of size buckets and the segment-size value for each bucket cannot be changed.
  959. Result codes    noErr    no error
  960. invalidStreamPtr    the specified TCP stream is not open
  961. connectionDoesntExist    this TCP stream has no open connection
  962. TCPRelease
  963. Parameter block    Æ    26    word    csCode = TCPRelease
  964. Æ    28    long    stream pointer
  965. ¨    32    long    pointer to receive buffer area
  966. ¨    36    long    length of receive buffer area
  967. Æ    44    long    user data pointer
  968. TCPRelease closes a TCP stream. If there is an open connection on the stream, the connection is first broken as though a TCPAbort command had been issued.
  969. The receive buffer area passed to the MacTCP driver in the TCPCreate call is returned to the user. You are now free to reuse or release this buffer area.
  970. Result codes    noErr    no error
  971. invalidStreamPtr    the specified TCP stream is not open
  972. TCPGlobalInfo
  973. Parameter block    Æ    26    word    csCode = TCPGlobalInfo
  974. ¨    32    long    pointer to TCP parameters
  975. ¨    36    long    pointer to TCP statistics
  976. ¨    40    long    pointer to CDB table
  977. Æ    44    long    user data pointer
  978. The TCPGlobalInfo command allows you access to
  979. n    parameters that affect the operation of TCP
  980. n    global statistics collected by TCP
  981. You should not modify the TCP parameters. The structure has the following format:
  982. 0    long    pointer to Pascal string describing retransmission timeout algorithm
  983. 4    long    minimum value of retransmission timeout (in milliseconds)
  984. 8    long    maximum value of retransmission timeout (in milliseconds)
  985. 12    long    maximum segment size this TCP can receive
  986. 16    long    maximum number of streams the MacTCP driver can support
  987. 20    long    maximum value of receive window the MacTCP driver can offer
  988. The TCP statistics are the sum of traffic information for all streams that have been opened since system startup time. The counters will wrap around to 0 when incremented past their maximum value. You can modify these statistics. 
  989. The TCP statistics structure has the following format:
  990. 0    long    number of outgoing connections attempted
  991. 4    long    number of outgoing connections opened
  992. 8    long    number of incoming connections accepted
  993. 12    long    number of connections that closed gracefully
  994. 16    long    number of connections that were aborted
  995. 20    long    number of data bytes received
  996. 24    long    number of data bytes sent
  997. 28    long    number of duplicate data bytes received
  998. 32    long    number of data bytes retransmitted
  999. 36    long    total number of segments received (includes acknowledgments)
  1000. 40    long    total number of segments sent (includes acknowledgments)
  1001. 44    long    number of segments received that contained all duplicate data
  1002. 48    long    number of segments retransmitted
  1003.  
  1004. Result codes    noErr    no error
  1005. C parameter-block definitions
  1006. The following C type definitions are used with parameter-block Device Manager calls to TCP:
  1007. #define TCPCreate    30
  1008. #define TCPPassiveOpen    31
  1009. #define TCPActiveOpen    32
  1010. #define TCPSend    34
  1011. #define TCPNoCopyRcv    35
  1012. #define TCPRcvBfrReturn    36
  1013. #define TCPRcv    37
  1014. #define TCPClose    38
  1015. #define TCPAbort    39
  1016. #define TCPStatus    40
  1017. #define TCPExtendedStat    41
  1018. #define TCPRelease    42
  1019. #define TCPGlobalInfo    43
  1020. typedef enum TCPEventCode {
  1021.     TCPClosing = 1,
  1022.     TCPULPTimeout,
  1023.     TCPTerminate,
  1024.     TCPDataArrival,
  1025.     TCPUrgent,
  1026.     TCPICMPReceived,
  1027.     lastEvent = 32767
  1028. } TCPEventCode;
  1029. typedef enum TCPTerminationReason {
  1030.     TCPRemoteAbort = 2,
  1031.     TCPNetworkFailure,
  1032.     TCPSecPrecMismatch,
  1033.     TCPULPTimeoutTerminate,
  1034.     TCPULPAbort,
  1035.     TCPULPClose,
  1036.     TCPServiceError,
  1037.     lastReason = 32767
  1038. } TCPTerminationReason; 
  1039. typedef pascal void (*TCPNotifyProc) (
  1040.     StreamPtr tcpStream,
  1041.     unsigned short eventCode,
  1042.     Ptr userDataPtr,
  1043.     unsigned short terminReason,
  1044.     struct ICMPReport *icmpMsg);
  1045. Continued on following page .
  1046. typedef void (*TCPIOCompletionProc) (struct TCPiopb *iopb);
  1047. typedef unsigned short tcp_port;
  1048. typedef unsigned char byte;
  1049. enum {  /* ValidityFlags */
  1050.     timeoutValue = 0x80,
  1051.     timeoutAction = 0x40,
  1052.     typeOfService = 0x20,
  1053.     precedence = 0x10
  1054. };
  1055. enum {  /* TOSFlags */
  1056.     lowDelay = 0x01,
  1057.     throughPut = 0x02,
  1058.     reliability = 0x04
  1059. };
  1060. typedef struct TCPCreatePB {
  1061.     Ptr rcvBuff;
  1062.     unsigned long rcvBuffLen;
  1063.     TCPNotifyProc notifyProc;
  1064.     Ptr userDataPtr;
  1065. }TCPCreatePB;
  1066. The following parameter block is used with the TCPPassiveOpen and TCPActiveOpen commands:
  1067. typedef struct TCPOpenPB {
  1068.     byte ulpTimeoutValue;
  1069.     byte ulpTimeoutAction;
  1070.     byte validityFlags;
  1071.     byte commandTimeoutValue;
  1072.     ip_addr remoteHost;
  1073.     tcp_port remotePort;
  1074.     ip_addr localHost;
  1075.     tcp_port localPort;
  1076.     byte tosFlags;
  1077.     byte precedence;
  1078.     Boolean dontFrag;
  1079.     byte timeToLive;
  1080.     byte security;
  1081.     byte optionCnt;
  1082.     byte options[40];
  1083.     Ptr userDataPtr;
  1084. }TCPOpenPB;
  1085. typedef struct TCPSendPB {
  1086.     byte ulpTimeoutValue;
  1087.     byte ulpTimeoutAction;
  1088.     byte validityFlags;
  1089.     Boolean pushFlag;
  1090.     Boolean urgentFlag;
  1091.     Ptr wdsPtr;
  1092.     unsigned long sendFree;
  1093.     unsigned short sendLength;
  1094.     Ptr userDataPtr;
  1095. }TCPSendPB;
  1096. The following parameter block is used with the TCPRcv, TCPBfrReturn, and TCPNoCopyRcv commands:
  1097. typedef struct TCPReceivePB {
  1098.     byte commandTimeoutValue;
  1099.     byte filler;
  1100.     Boolean markFlag;
  1101.     Boolean urgentFlag;
  1102.     Ptr rcvBuff;
  1103.     unsigned short rcvBuffLen;
  1104.     Ptr rdsPtr;
  1105.     unsigned short rdsLength;
  1106.     unsigned short secondTimeStamp;
  1107.     Ptr userDataPtr;
  1108. }TCPReceivePB;
  1109. typedef struct TCPClosePB {
  1110.     byte ulpTimeoutValue;
  1111.     byte ulpTimeoutAction;
  1112.     byte validityFlags;
  1113.     Ptr userDataPtr;
  1114. }TCPClosePB;
  1115. typedef struct HistoBucket {
  1116.     unsigned short value;
  1117.     unsigned long counter;
  1118. };
  1119. #define NumOfHistoBuckets    7
  1120. Continued on following page .
  1121. typedef struct TCPConnectionStats {
  1122.     unsigned long dataPktsRcvd;
  1123.     unsigned long dataPktsSent;
  1124.     unsigned long dataPktsResent;
  1125.     unsigned long bytesRcvd;
  1126.     unsigned long bytesRcvdDup;
  1127.     unsigned long bytesRcvdPastWindow;
  1128.     unsigned long bytesSent;
  1129.     unsigned long bytesResent;
  1130.     unsigned short numHistoBuckets;
  1131.     struct HistoBucket sentSizeHisto[NumOfHistoBuckets];
  1132.     unsigned short lastRTT;
  1133.     unsigned short tmrSRTT;
  1134.     unsigned short rttVariance;
  1135.     unsigned short tmrRTO;
  1136.     byte sendTries;
  1137.     byte sourchQuenchRcvd;
  1138. }TCPConnectionStats;
  1139. typedef struct TCPStatusPB {
  1140.     byte ulpTimeoutValue;
  1141.     byte ulpTimeoutAction;
  1142.     long unused;
  1143.     ip_addr remoteHost;
  1144.     tcp_port remotePort;
  1145.     ip_addr localHost;
  1146.     tcp_port localPort;
  1147.     byte tosFlags;
  1148.     byte precedence;
  1149.     byte connectionState;
  1150.     unsigned short sendWindow;
  1151.     unsigned short rcvWindow;
  1152.     unsigned short amtUnackedData;
  1153.     unsigned short amtUnreadData;
  1154.     Ptr securityLevelPtr;
  1155.     unsigned long sendUnacked;
  1156.     unsigned long sendNext;
  1157.     unsigned long congestionWindow;
  1158.     unsigned long rcvNext;
  1159.     unsigned long srtt;
  1160.     unsigned long lastRTT;
  1161.     unsigned long sendMaxSegSize;
  1162.     struct TCPConnectionStats *connStatPtr;
  1163.     Ptr userDataPtr;
  1164. }TCPStatusPB;
  1165. typedef struct TCPAbortPB {
  1166.     Ptr userDataPtr;
  1167. }TCPAbortPB;
  1168. typedef struct TCPParam {
  1169.     unsigned long tcpRtoA;
  1170.     unsigned long tcpRtoMin;
  1171.     unsigned long tcpRtoMax;
  1172.     unsigned long tcpMaxSegSize;
  1173.     unsigned long tcpMaxConn;
  1174.     unsigned long tcpMaxWindow;
  1175. }TCPParam;
  1176. typedef struct TCPStats {
  1177.     unsigned long tcpConnAttempts;
  1178.     unsigned long tcpConnOpened;
  1179.     unsigned long tcpConnAccepted;
  1180.     unsigned long tcpConnClosed;
  1181.     unsigned long tcpConnAborted;
  1182.     unsigned long tcpOctetsIn;
  1183.     unsigned long tcpOctetsOut;
  1184.     unsigned long tcpOctetsInDup;
  1185.     unsigned long tcpOctetsRetrans;
  1186.     unsigned long tcpInputPkts;
  1187.     unsigned long tcpOutputPkts;
  1188.     unsigned long tcpDupPkts;
  1189.     unsigned long tcpRetransPkts;
  1190. }TCPStats;
  1191. typedef struct TCPGlobalInfoPB {
  1192.     struct TCPParam *tcpParamPtr;
  1193.     struct TCPStats *tcpStatsPtr;
  1194.     StreamPtr *tcpCDBTable[];
  1195.     Ptr userDataPtr;
  1196.     unsigned short maxTCPConnections;
  1197. }TCPGlobalInfoPB;
  1198. Continued on following page .
  1199. typedef struct TCPiopb {
  1200.     char     fill12[12];
  1201.     TCPIOCompletionProc    ioCompletion;
  1202.     short     ioResult;
  1203.     char     *ioNamePtr;
  1204.     short     ioVRefNum;
  1205.     short    ioCRefNum;
  1206.     short    csCode;
  1207.     StreamPtr    tcpStream;
  1208.     union {
  1209.     struct TCPCreatePB    create;
  1210.         struct TCPOpenPB    open;
  1211.         struct TCPSendPB    send;
  1212.         struct TCPReceivePB    receive;
  1213.         struct TCPClosePB    close;
  1214.         struct TCPAbortPB    abort;
  1215.         struct TCPStatusPB    status;
  1216.         struct TCPGlobalInfoPB    globalInfo;
  1217.         } csParam;
  1218. }TCPiopb;
  1219. 5    Name-to-Address Resolution
  1220. Textual names are resolved to IP addresses using internal caches and the domain name server. The AddressXlation interface accomplishes this task by searching an internal table originally derived from the static file Hosts, making queries to domain name servers, and finding information in the internal cache of domain name server responses. 
  1221. The AddressXlation.h header file
  1222. The AddressXlation.h interface supports the domain name resolver (DNR) function using the procedure calls listed in Table 5-1 and described in the following sections.
  1223. Table 5-1  AddressXlation.h routines
  1224. Routine    Function
  1225. OpenResolver    Opens the resolver and allocates internal resources
  1226. StrToAddr    Converts an ASCII text string to the corresponding IP     address
  1227. AddrToStr    Converts an IP address into its text dotted decimal     notation (W.X.Y.Z)
  1228. EnumCache    Enumerates all the name-to-address mappings cached by     the resolver
  1229. AddrToName    Converts an IP address to its corresponding textual name     using the resolver
  1230. HInfo    Returns details about the system whose name is being     queried
  1231. MXInfo    Returns mail box information for the system whose name     is being queried
  1232. CloseResolver    Closes the resolver and deallocates internal resources
  1233. The OpenResolver call
  1234. extern OSErr OpenResolver(char *fileName);
  1235. The OpenResolver call must be made before any resolver queries are attempted. The full pathname of the default Hosts file must be passed in the fileName field. If the value NIL is passed, the resolver uses the filename Hosts in the default startup folder, which is typically the System Folder. The Hosts file is used to load the internal cache with name-to-address mappings and domain name server values. The syntax of this file is outlined on page 33 of Request for Comments (RFC) 1035.
  1236. Result codes    Resource Manager error result codes may be returned.
  1237. The StrToAddr call
  1238. #define NUM_ALT_ADDRS 4
  1239. typedef struct hostInfo {
  1240.     int rtnCode;
  1241.     char cname[255];
  1242.     unsigned long addr[NUM_ALT_ADDRS];
  1243. };
  1244. typedef pascal void (*ResultProcPtr)(
  1245.     struct hostInfo *hostInfoPtr,
  1246.     char *userDataPtr);
  1247. extern OSErr StrToAddr(
  1248.     char *hostName,
  1249.     struct hostInfo *hostInfoPtr,
  1250.     ResultProcPtr ResultProc,
  1251.     char *userDataPtr);
  1252. The hostInfo record is passed into the address translation routine in the StrToAddr call. The rtnCode indicates whether the result fields are valid for this call; a value of noErr indicates that the call was successful. The cname is the official name of the hostName that was specified. The addr array is a list of addresses for the hostName that was specified. Multiple addresses are returned for hosts that are multihomed.
  1253. StrToAddr takes a string in one of two forms and translates it into a 32-bit IP address. The string can be in IP dot notation (that is, W.X.Y.Z) or in a valid domain name syntax. The translated address is returned immediately if the passed in host is in IP dot notation or if the matching address is contained in the local cache. If the address is not contained in the local cache, the rtnCode is cacheFault and the domain name server is contacted to resolve the address. When the response has been returned from the domain name server or the domain name query has not been successfully completed, the ResultProc is called with the appropriate rtnCode and return information. The StrToAddr procedure can be called with a userDataPtr, which is user-defined and not modified by the resolver. The userDataPtr is returned when the ResultProc is called. Domain names that contain no domain name delimiters, that is, no dots (.), are terminated with the domain name suffix specified for the default domain name server in the Control Panel. They are terminated with a dot if no default is specified.
  1254. Result codes    nameSyntaxErr    the hostName field had a syntax error
  1255. cacheFault    the name specified cannot be found in the cache
  1256. noResultProc    no result procedure is passed to the address translation call when the resolver must be used to find the address
  1257. noNameServer    no name server can be found for the specified name string
  1258. authNameErr    this domain name does not exist
  1259. noAnsErr    none of the known name servers are responding
  1260. dnrErr    the domain name server has returned an error
  1261. outOfMemory    not enough memory is available to issue the needed domain name resolver (DNR) query or to build the DNR cache
  1262. notOpenErr    the driver isn’t open
  1263. The AddrToStr call
  1264. extern OSErr AddrToStr(unsigned long addr, char *addrStr);
  1265. The AddrToStr call takes an IP address and returns a string with the ASCII equivalent of the form W.X.Y.Z where W, X, Y, and Z are decimal numbers. The application must provide the storage for the return string. The string can have a maximum length of 16 bytes.
  1266. Result codes    notOpenErr    the driver isn’t open
  1267. The EnumCache call
  1268. typedef enum AddrClasses {
  1269.     A = 1,
  1270.     NS,
  1271.     CNAME = 5,
  1272.     HINFO = 13,
  1273.     MX = 15,
  1274.     lastClass = 32767
  1275. }AddrClasses;
  1276. typedef struct cacheEntryRecord {
  1277.     char *cname;
  1278.     unsigned short type;
  1279.     unsigned short cacheClass;
  1280.     unsigned long ttl;
  1281.     union {
  1282.         char *name;
  1283.         ip_addr *addr;
  1284.     } rdata;
  1285. };
  1286. typedef pascal void (*EnumResultProcPtr)(
  1287.     struct cacheEntryRecord *cacheEntryRecordPtr,
  1288.     char *userDataPtr);
  1289. extern OSErr EnumCache(
  1290.     EnumResultProcPtr enumResultProc,
  1291.     char *userDataPtr);
  1292. If the application wants to enumerate all the entries in the cache, the EnumCache procedure should be called. This procedure returns no errors and has completed enumerating the cache when it returns. For every entry in the cache, enumResultProc is called with a pointer to a cache entry. The fields and values returned in the CacheEntryRecord are as follows:
  1293. name    The name of the entry.
  1294. type    The type of the entry, where
  1295. —A (value = 1) is an address. The value of rdata is an addr.
  1296. —NS (value = 2) is a name server. The value of rdata is a name.
  1297. —CNAME (value = 5) is an alias for the canonical name (cname) found in the rdata field.
  1298. cacheClass    The class of the entry. The only class allowed is IN (value 1).
  1299. ttl    The time that the entry has to live in the cache relative to the current time (GetCurrent).
  1300. rdata    The rdata field as determined by the type of entry specified in the type field.
  1301. Result codes    notOpenErr    the driver isn’t open
  1302. The AddrToName call
  1303. extern OSErr AddrToName(
  1304.     ip_addr addr,
  1305.     struct hostInfo *hostInfoPtr,
  1306.     ResultProcPtr ResultProc,
  1307.     char *userDataPtr);
  1308. The AddrToName call is used to acquire the canonical name of a host given its IP address. The domain name server is queried using an IN-ADDR query. The application passes to the AddrToName call the IP address of the host in question, a pointer to a hostInfo record, the result procedure to be notified with the result, and an optional user data pointer. The AddrToName call always returns immediately with the return code cacheFault or the return code noNameServer if no name server can be found in the internal name server lists that can resolve the DNR query. The passed-in result procedure is called with the appropriate result code. If the result code is noErr, the cname field contains the canonical name for the IP address passed to the AddrToName call.
  1309. Result codes    cacheFault    the name specified cannot be found in the 
  1310.     cache
  1311. noNameServer    no name server can be found for the specified name string
  1312. authNameErr    this domain name does not exist
  1313. noAnsErr    none of the known name servers are responding
  1314. dnrErr    the domain name server has returned an error
  1315. outOfMemory    not enough memory is available to issue the needed DNR query or to build the DNR cache
  1316. notOpenErr    the driver isn’t open
  1317. The HInfo call
  1318. typedef struct HinfoRec {
  1319.     char cpuType[30];
  1320.     char osType[30];
  1321. }; 
  1322. typedef struct returnRec {
  1323.     int rtnCode;
  1324.     char cname[255];
  1325.     union {
  1326.         unsigned long addr[NUM_ALT_ADDRS];
  1327.         struct HInfoRec hinfo;
  1328.         struct MXRec mx;
  1329.     } rdata;
  1330. };
  1331. typedef pascal void (*ResultProc2Ptr)(
  1332.     struct returnRec *returnRecPtr, 
  1333.     char *userDataPtr);
  1334. extern OSErr HInfo(
  1335.     char *hostName,
  1336.     struct returnRec *returnRecPtr,
  1337.     ResultProc2Ptr resultProc,
  1338.     char *userDataPtr);
  1339. The HInfo call returns details about the system whose name is being queried. The call returns two strings, cpuType and osType, that specify in ASCII the values of the CPU and operating system type.
  1340. The HInfo call follows the calling conventions for queries described in the section “DNR Operation” later in this chapter.
  1341. Result codes    nameSyntaxErr    the hostName field has a syntax error
  1342. noNameServer    no name server can be found for the specified name string
  1343. noAnsErr    none of the known name servers are responding
  1344. dnrErr    the domain name server has returned an error
  1345. outOfMemory    not enough memory is available to issue the needed DNR query or to build the DNR cache
  1346. notOpenErr    the driver isn’t open
  1347. The MXInfo call
  1348. typedef struct MXRec {
  1349.     unsigned short preference;
  1350.     char exchange[255];
  1351.     };
  1352. typedef struct returnRec {
  1353.     int rtnCode;
  1354.     char cname[255];
  1355.     union {
  1356.         unsigned long addr[NUM_ALT_ADDRS];
  1357.         struct HInfoRec hinfo;
  1358.         struct MXRec mx;
  1359.     } rdata;
  1360. };
  1361. typedef pascal void (*ResultProc2Ptr)(
  1362.     struct returnRec *returnRecPtr, 
  1363.     char *userDataPtr);
  1364. extern OSerr MXInfo
  1365.     (char *hostName,
  1366.     struct returnRec *returnRecPtr,
  1367.     ResultProc2Ptr resultProc,
  1368.     char *userDataPtr);
  1369. The MXInfo call returns mail box information for the system whose name is being queried. The call returns two values:
  1370. n    preference, an unsigned integer specifying the preference that is given to the returned system name
  1371. n    exchange, the domain name for the system that is receiving mail for the specified host
  1372. The MXInfo call follows the calling conventions for queries described in the section “DNR Operation” later in this chapter.
  1373. Result codes    nameSyntaxErr    the hostName field has a syntax error
  1374. noNameServer    no name server can be found for the specified name string
  1375. noAnsErr    none of the known name servers are responding
  1376. dnrErr    the domain name server has returned an error
  1377. outOfMemory    not enough memory is available to issue the needed domain name resolver (DNR) query or to build the DNR cache
  1378.  
  1379. notOpenErr    the driver isn’t open
  1380. The CloseResolver call
  1381. extern OSerr CloseResolver ();
  1382. Before the application exits, the CloseResolver call must be made to release memory structures and terminate all outstanding domain name server calls. CloseResolver must not be called until all outstanding resolver calls have been completed.
  1383. Result codes    notOpenErr    the driver isn’t open
  1384. Binding the DNR to the application
  1385. The domain name resolver (DNR) in the MacTCP driver is implemented as a code resource in the MacTCP driver file.
  1386. A file called DNR.c in the Libraries Folder of the MacTCP release disk provides a working example of how to open the DNR. Compile and link this file to your application. MPW version 3.2 produces a file called DNR.o in the Libraries Folder of the MacTCP release disk that provides procedural access to the DNR. Sources have also been provided if you need to port the functionality to another development system.
  1387. To use the DNR, the application must first find the procedure pointers that are part of the DNR resource. In Macintosh system software version 6.0.x, the DNR resource, named dnrp, is attached to the driver file, which is in the System Folder of the startup disk. The driver file is of type cdev, creator ztcp. In Macintosh system software version 7.0, the driver file is in the Control Panels folder (see the chapter “The Finder Interface” in Inside Macintosh, Volume VI). The resource can be opened using the Resource Manager routines in the Toolbox. 
  1388. Once the resource is opened, the first long word of the resource is a pointer to a procedure that jumps to the correct DNR procedure. You should make calls to this procedure using the procedure index value as the first argument of the call, followed by the arguments for the procedure as they are specified in the AddressXlation.h interface. The procedure assignments are as follows:
  1389. OpenResolver    1
  1390. CloseResolver    2
  1391. StrToAddr    3
  1392. AddrToStr    4
  1393. EnumCache    5
  1394. AddrToName    6
  1395. HInfo    7
  1396. MXInfo    8
  1397. DNR operation
  1398. This section describes how the domain name server (DNS) list is used when making DNS queries.
  1399. If a default name extension and server are identified in the Control Panel, they are used for all nonqualified requests. For example, if the name homer is passed to the DNR and the default extension is pundit.edu, the name homer.pundit.edu is used in the query; however, if the name homer.drama.pundit.edu is passed to the DNR, the extension is not appended.
  1400. The extension of the name passed to the DNR determines which name servers are chosen. Servers that match the full extension are found first, followed by servers that serve the ancestor of the full extension (for example, for the name homer.drama.pundit.edu, the server that serves drama.pundit.edu would be found first followed by the server that serves pundit.edu). If no servers are found, the default server is used. If you did not set a default, the DNR returns noNameServer. In the MacTCP Control Panel, you should enter a default domain and select the Default button.
  1401. Once a list of servers that support the domain is found, those servers are queried in the order of their distance from the querying host. First servers on the local network are queried, followed by servers on other networks. When you use the AddrToName query, you must select a default server.
  1402. 6    Miscellaneous Interfaces
  1403. This chapter describes types that are found throughout the programmatic interfaces supplied with the MacTCP driver.
  1404. MacTCPCommontypes
  1405. This file defines result code name-to-number mapping, Internet Control Message Protocol (ICMP) message report structures, and other miscellaneous types throughout the MacTCP driver.
  1406. Result codes
  1407. The result codes in MacTCPCommontypes are described as follows. Chapters 3, 4, and 5 contain specific occurrences of the result codes described in this section.
  1408. #define inProgress    1    When an IOPB is still pending, ioResult is set to inProgress.
  1409. #define ipBadLapErr    -23000    Unable to initialize the local network handler.
  1410. #define ipBadCnfgErr    -23001    The manually set address is configured improperly.
  1411. #define ipNoCnfgErr    -23002    A configuration resource is missing.
  1412. #define ipLoadErr    -23003    Not enough room in the application heap (Macintosh 512K enhanced only).
  1413. #define ipBadAddr    -23004    Error in getting an address from a server or the address is already in use by another machine.
  1414. #define connectionClosing    -23005    A TCPClose command was already issued so there is no more data to send on this connection.
  1415. #define invalidLength    -23006    The total amount of data described by the WDS was either 0 or greater than 65,535 bytes.
  1416. #define connectionExists    -23007    The TCP or UDP stream already has an open connection.
  1417. #define connectionDoesntExist    -23008    This TCP stream has no open connection.
  1418. #define insufficientResources    -23009    64 TCP or UDP streams are already open.
  1419. #define invalidStreamPtr    -23010    The specified TCP or UDP stream is not open.
  1420. #define streamAlreadyOpen    -23011    An open stream is already using this receive buffer area.
  1421. #define connectionTerminated    -23012    The TCP connection was broken; the reason will be given in a terminate ASR.
  1422. #define invalidBufPtr    -23013    The receive buffer area pointer is 0.
  1423. #define invalidRDS    -23014    The RDS refers to receive buffers not owned by the user.
  1424. #define invalidWDS    -23014    The WDS pointer was 0.
  1425. #define openFailed    -23015    The connection came halfway up and then failed.
  1426. #define commandTimeout    -23016    The specified command action was not completed in the specified time period.
  1427. #define duplicateSocket    -23017    A stream is already open using this local UDP port or a TCP connection already exists between this local IP address and TCP port, and the specified remote IP address and TCP port.
  1428. #define ipDontFragErr    -23032    The packet is too large to send without fragmenting and the Don’t Fragment flag is set.
  1429. #define ipDestDeadErr    -23033    The destination host is not responding to address resolution requests.
  1430. #define icmpEchoTimeoutErr    -23035    The icmp echo packet was not responded to in the indicated timeout period.
  1431. #define ipNoFragMemErr    -23036    Insufficient internal driver buffers available to fragment this packet on send.
  1432. #define ipRouteErr    -23037    No gateway available to manage routing of packets to off-network destinations.
  1433. #define nameSyntaxErr    -23041    The hostName field had a syntax error. The address was given in dot notation (that is, W.X.Y.Z) and did not conform to the syntax for an IP address.
  1434. #define cacheFault    -23042    The name specified cannot be found in the cache. The domain name resolver will now query the domain name server and return the answer in the call-back procedure.
  1435. #define noResultProc    -23043    No result procedure is passed to the address translation call when the resolver must be used to find the address.
  1436. #define noNameServer    -23044    No name server can be found for the specified name string.
  1437. #define authNameErr    -23045    This domain name does not exist.
  1438. #define noAnsErr    -23046    None of the known name servers are responding.
  1439. #define dnrErr    -23047    The domain name server has returned an error.
  1440. #define outOfMemory    -23048    Not enough memory is available to issue the needed DNR query or to build the DNR cache.
  1441. Miscellaneous types
  1442. This section describes types that are common to all the programmatic interfaces in the MacTCP driver.
  1443. #define BYTES_16WORD  2    /* bytes per 16 bit ip word */
  1444. #define BYTES_32WORD  4    /* bytes per 32 bit ip word */
  1445. #define BYTES_64WORD  8    /* bytes per 64 bit ip word */
  1446. typedef unsigned char b_8;    /* 8-bit quantity */
  1447. typedef unsigned short b_16;    /* 16-bit quantity */
  1448. typedef unsigned long b_32;    /* 32-bit quantity */
  1449. typedef b_32 ip_addr;        /* IP address is 32-bits */
  1450. typedef b_16 ip_port
  1451. typedef struct ip_addrbytes {
  1452.     union {
  1453.         b_32 addr;
  1454.         char byte[4];
  1455.         } a;
  1456.     } ip_addrbytes;
  1457. typedef struct wdsEntry {
  1458.     unsigned short length;    /* length of buffer */
  1459.     char * ptr;            /* pointer to buffer */
  1460.     } wdsEntry;
  1461. typedef struct rdsEntry {
  1462.     unsigned short length;    /* length of buffer */
  1463.     char * ptr;            /* pointer to buffer */
  1464.     } rdsEntry;
  1465. typedef unsigned long BufferPtr;
  1466. typedef unsigned long StreamPtr;
  1467. Internet Control Message Protocol report structures
  1468. In TCP and UDP, the ASR routine can be called with an Internet Control Message Protocol (ICMP) message. This section describes the types and structures of the ICMP messages.
  1469. typedef enum ICMPMsgType {
  1470.     netUnreach, hostUnreach, protocolUnreach,
  1471.     portUnreach, fragReqd, sourceRouteFailed, 
  1472.     timeExceeded, parmProblem, missingOption, 
  1473.     lastICMPMsgType = 65535
  1474.     } ICMPMsgType;
  1475. typedef struct ICMPReport {
  1476.     StreamPtr streamPtr;
  1477.     ip_addr localHost;
  1478.     ip_port localPort;
  1479.     ip_addr remoteHost;
  1480.     ip_port remotePort;
  1481.     short reportType;
  1482.     unsigned short optionalAddlInfo;
  1483.     unsigned long optionalAddlInfoPtr;
  1484.     } ICMPReport;
  1485. Refer to the section “UDP Asynchronous Notification Routine” in Chapter 3 and “TCP Asynchronous Notification Routine” in Chapter 4 for details on how the ICMP report structure is used.
  1486. GetMyIPAddr
  1487. This section describes how an application obtains the IP address of the machine on which it is running. GetMyIPAddr describes the parameter block that makes the PBControl call that returns the IP address and subnet mask of the local host. The csCode for this call is 15, and the driver reference number is returned from the Open Driver call.
  1488. #define ipctlGetAddr    15    /* csCode to get our IP 
  1489.                         address */
  1490. #define IPParamBlockHeader    \
  1491.     struct QElem *qLink;    \
  1492.     short qType;            \
  1493.     short ioTrap;            \
  1494.     Ptr ioCmdAddr;            \
  1495.     ProcPtr ioCompletion;    \
  1496.     OSErr ioResult;        \
  1497.     StringPtr ioNamePtr;    \
  1498.     short ioVRefNum;        \
  1499.     short ioCRefNum;        \
  1500.     short csCode
  1501. struct IPParamBlock {
  1502.     IPParamBlockHeader;        /* standard I/O header */
  1503.     ip_addr ourAddress;        /* our IP address */
  1504.     long ourNetMask;        /* our IP net mask */
  1505.     };
  1506.  
  1507. The IP address is returned in the ourAddress field and the subnet mask is returned in the ourNetMask field.
  1508. ICMP echo
  1509. The ICMP echo request message allows a host to determine whether a remote host is operational without bringing up a protocol like TCP or UDP. ICMP echo can also be used to determine the responsiveness of a network. The following interface to ICMP echo is provided:
  1510. #define ipctlEchoICMP    17
  1511. #define ipmplEchoTimeoutErr    -23035
  1512. typedef void (*ICMPEchoNotifyProc)
  1513.     (struct ICMPParamBlock *iopb);
  1514. The following structure is used to make the PBControl call initiate an ICMP echo request. The destination address is in the dest field, and the data to be echoed is described by wdsEntry in the data field. The specified timeout indicates how long to wait for the echo reply. The icmpCompletion routine is called either at timeout or when a packet is returned from the remote site. When a timeout occurs, the result code in the ICMPParamBlock is icmpEchoTimeoutErr. When an ICMP echo returns successfully, the time in ticks when the reply was received is contained in the echoReplyIn field. The time in ticks when the request was dispatched is contained in the echoRequestOut field. The echoed data contains the data received in the response packet.
  1515. You can send options in an echo packet by filling the options field. Options must be well-formed (see RFC 791) and terminated on a long word boundary. The length field specifies the length of the options field in bytes. The icmpCompletion routine is called with the options field set if options are found in the echo response packet. The userdata pointer can be passed into the echo call and is returned unmodified in the icmpCompletion routine.
  1516. struct IPParamBlock {
  1517.     IPParamBlockHeader;
  1518.     struct {
  1519.         ip_addr dest;
  1520.         wdsEntry data;
  1521.         short timeout;
  1522.         Ptr options;
  1523.         unsigned short optLength;
  1524.         ICMPEchoNotifyProc icmpCompletion;
  1525.         unsigned long userDataPtr;
  1526.         } IPEchoPB;
  1527.     };
  1528. struct ICMPParamBlock {
  1529.     IPParamBlockHeader;
  1530.     short params [11];
  1531.     struct {
  1532.         unsigned long echoRequstOut;
  1533.         unsigned long echoReplyIn;
  1534.         struct rdsEntry echoedData;
  1535.         Ptr options;
  1536.         unsigned long userDataPtr;
  1537.         } icmpEchoInfo;
  1538.     };
  1539. Appendix    Constants
  1540. This appendix presents command codes, UDP asynchronous event codes, TCP asynchronous event codes, and reasons for TCP termination.
  1541. Command codes
  1542. UDPCreate    20
  1543. UDPRead    21
  1544. UDPBfrReturn    22
  1545. UDPWrite    23
  1546. UDPRelease    24
  1547. UDPMaxMTUSize    25
  1548. UDPStatus    26
  1549. UDPMultiCreate    27
  1550. UDPMultiSend    28
  1551. UDPMultiRead    29
  1552. TCPCreate    30
  1553. TCPPassiveOpen    31
  1554. TCPActiveOpen    32
  1555. TCPSend    34
  1556. TCPNoCopyRcv    35
  1557. TCPBfrReturn    36
  1558. TCPRcv    37
  1559. TCPClose    38
  1560. TCPAbort    39
  1561. TCPStatus    40
  1562. TCPRelease    42
  1563. TCPGlobalInfo    43
  1564. UDP asynchronous event codes
  1565. data arrival    1
  1566. ICMP message received    2
  1567. TCP asynchronous event codes
  1568. closing    1
  1569. ULP timeout    2
  1570. terminate    3
  1571. data arrival    4
  1572. urgent data outstanding    5
  1573. ICMP message received    6
  1574. Reasons for TCP termination
  1575. remote abort    2
  1576. network failure    3
  1577. security/precedence mismatch    4
  1578. ULP timeout    5
  1579. ULP abort    6
  1580. ULP close    7
  1581. service failure    8
  1582. ‘◊#ˇ ˇˇˇˇ#◊ 
  1583. d, p    AppleIconp
  1584.  .°dONLNd6|Vñ+önK,N Helvetica Narrow
  1585. °dONLNd@ÆTî)2MacTCP Programmer’s Guideˇ
  1586. ∫◊#ˇ ˇˇˇˇ#◊ 
  1587. d,Times
  1588. .°dONLNd;F&+<c°dONLNd;0Fä)Apple Computer, Inc.
  1589.     °dONLNdITœ(p<0This manual and the software described in it are°dONLNdHS^—*
  1590. 0copyrighted, with all rights reserved. Under the°dONLNdy]hÓ*
  1591. 6copyright laws, this manual or the software may not be°dONLNd∞gr·*
  1592. 4copied, in whole or part, without written consent of°dONLNdÂq|‰*
  1593. 5Apple, except in the normal use of the software or to°dONLNd{ÜÃ*
  1594. ,make a backup copy of the software. The same°dONLNdHÖê„*
  1595. 4proprietary and copyright notices must be affixed to°dONLNd}èö‚*
  1596. 5any permitted copies as were affixed to the original.°dONLNd≥ô§‚*
  1597. 3This exception does not allow copies to be made for°dONLNdÁ£Æ⁄*
  1598. 4others, whether or not sold, but all of the material°dONLNd≠∏Ì*
  1599. 6purchased (with all backup copies) may be sold, given,°dONLNdS∑¬„*
  1600. 3or loaned to another person. Under the law, copying°dONLNdá¡ÃÊ*
  1601. 5includes translating into another language or format.°dONLNdΩŒŸ‰*
  1602. 1You may use the software on any computer owned by°dONLNdÔÿ„Í*
  1603. 6you, but extra copies cannot be made for this purpose.°dONLNd&ÂŸ*
  1604. 1The Apple logo is a registered trademark of Apple°dONLNdXÔ˙Ÿ*
  1605. /Computer, Inc. Use of the “keyboard” Apple logo°dONLNdà˘Í*
  1606. 4(Option-Shift-K) for commercial purposes without the°dONLNdΩÀ*
  1607. -prior written consent of Apple may constitute°dONLNdÎ
  1608. Ÿ*
  1609. 0trademark infringement and unfair competition in°dONLNd"†*
  1610. $violation of federal and state laws.,     Helvetica°dONLNdA%.%*
  1611. ©°dONLNdB$%/í) Apple Computer, Inc., 1993°dONLNd_.9u(U<20525 Mariani Avenue°dONLNdu8Câ*
  1612. Cupertino, CA  95014-6299°dONLNdèBM[*
  1613. (408) 996-1010°dONLNdûOZ‘*
  1614. .Apple, the Apple logo, AppleTalk, LaserWriter,°dONLNdÕYdÕ*
  1615. )LocalTalk, Macintosh, MacTCP, and MPW are°dONLNd˜cnÁ*
  1616. 5trademarks of Apple Computer, Inc., registered in the°dONLNd-mxù*
  1617. "United States and other countries.°dONLNdPzÖ€*
  1618. 1Simultaneously published in the United States and°dONLNdÇÑè<*
  1619. Canada.°dONLNdãëú„*
  1620. 4Mention of third-party products is for informational°dONLNd¿õ¶È*
  1621. 4purposes only and constitutes neither an endorsement°dONLNdı•∞ª*
  1622. &nor a recommendation. Apple assumes no°dONLNdØ∫Í*
  1623. 6responsibility with regard to the performance of these°dONLNdSπƒA*
  1624.     products.ˇ◊#ˇ ˇˇˇˇ#◊ 
  1625. d,N Helvetica Narrow
  1626. .°dONLNdATTõ+rnContents,Times
  1627. °dONLNd    ßÆ¥H+Zb!Preface: About This Guide  /  vii°dONLNd, ù◊¢(Ûª1°dONLNd. Æ◊˜)Introduction  /  1°dONLNdA›ÆÍ/*Architectural overview  /  2
  1628. °dONLNd^Ì∫¯ò+ 3Application, presentation, and session layers  /  2°dONLNdí˚∫*Transport layer  /  3
  1629. °dONLNd®Δw+ )Transmission Control Protocol (TCP)  /  3°dONLNd“Δ^* "User Datagram Protocol (UDP)  /  3
  1630. °dONLNdı!∫,(HÿNetwork layer  /  4°dONLNd    /∫:*Data link layer  /  4°dONLNd=∫H*Physical layer  /  4
  1631. °dONLNd5^ùk¢(áª2°dONLNd7^Æk")The MacTCP Driver  /  5°dONLNdOqÆ~*The PBOpen call  /  6°dONLNdeÉÆê*The PBControl call  /  7°dONLNd~ïÆ¢*The PBClose call  /  8°dONLNdï߯¥ *The Gestalt call  /  8°dONLNd¨πÆΔ**Implementation notes  /  9
  1632. °dONLNd«…∫‘[+ "Fragmentation and reassembly  /  9°dONLNdÍ◊∫‚Û*
  1633. Routing  /  9
  1634. °dONLNd˘¯ú¢(!∫3°dONLNd˚¯Æ7)User Datagram Protocol  /  11°dONLNd Æ*Data structures  /  12
  1635. °dONLNd0∫&5+ Write Data Structures  /  12°dONLNdM)∫4-*Receive buffer area  /  13
  1636. °dONLNdh9ÆF(bÃUsing UDP  /  13°dONLNdyKÆX *UDP routines  /  14
  1637. °dONLNdç[∫f+ UDPCreate  /  15
  1638. °dONLNdûfΔqÅ+ ,UDP asynchronous notification routine  /  16
  1639. °dONLNdÀu∫Ä(úÿUDPRead  /  18°dONLNd⁄É∫é*UDPBfrReturn  /  19 ÃpÃ)ˇr◊#ˇ ˇˇˇˇ#◊ 
  1640. d,Times
  1641. .°dONLNd Ñ+Ã+¢GUDPWrite  /  20°dONLNd.Ñ9÷*UDPRelease  /  21°dONLNd"<ÑGÕ*
  1642. UDPMTU  /  21°dONLNd0JÑU*UDP Multiport Create  /  22°dONLNdLXÑc˝*UDP Multiport Send  /  23°dONLNdffÑq    *UDP Multiport Receive  /  24
  1643. °dONLNdÉvxÉ (üñ$C parameter-block definitions  /  25,N Helvetica Narrow°dONLNd©ôf¶l(¬Ñ4°dONLNd´ôx¶)$Transmission Control Protocol  /  29°dONLNd–¨xπ⁄*Data structures  /  30
  1644. °dONLNdÁºÑ«-+ %Read and Write Data Structures  /  30°dONLNd
  1645.  Ñ’Ù*Receive buffer area  / 30
  1646. °dONLNd'⁄xÁ…(ñUsing TCP  /  31
  1647. °dONLNd8ÍÑı+ Streams and connections  /  31°dONLNdW¯Ñ=*(Asynchronous notification routine  /  31°dONLNdÄѸ*Connection opening  /  31°dONLNdöÑ·*Receiving data  /  32°dONLNd∞"Ñ-⁄*Sending data  /  32°dONLNdƒ0Ñ;…*Timeouts  /  32°dONLNd‘>ÑI’*Pushed data  /  33°dONLNdÁLÑW€*Urgent mode  /  33°dONLNd˙ZÑe˜*Connection closing  /  34°dONLNdhÑs=*%Network management information  /  34°dONLNd:vÑÅ1*!Formatting MacTCP commands  /  35
  1648. °dONLNd\Üxì“(ØñTCP routines  /  35
  1649. °dONLNdpñѰœ+ TCPCreate  /  36
  1650. °dONLNdŰê¨J+ ,TCP asynchronous notification routine  /  37
  1651. °dONLNdÆ∞ѪÎ(◊¢TCPPassiveOpen  /  41°dONLNdƒæÑ…Ë*TCPActiveOpen  /  44°dONLNdŸÃÑ◊…*TCPSend  /  45°dONLNdË⁄ÑÂÍ*TCPNoCopyRcv  /  47°dONLNd¸ËÑÛ‡*TCPBfrReturn  /  49°dONLNdˆÑ¿* TCPRcv  / 50°dONLNdÑÀ*TCPClose  /  52°dONLNd-ÑÕ*TCPAbort  /  53°dONLNd= Ñ+Õ*TCPStatus  /  54°dONLNdN.Ñ9‘*TCPRelease  /  56°dONLNd`<ÑGÂ*TCPGlobalInfo  /  57
  1652. °dONLNduLxY (uñ$C parameter-block definitions  /  59
  1653. (Ÿ<iv
  1654. )Contents Ã:ÃÛˇ^◊#ˇ ˇˇˇˇ#◊ 
  1655. d,N Helvetica Narrow
  1656. .°dONLNdù,¢+ªH5°dONLNdÆ,G)!Name-to-Address Resolution  /  65,Times°dONLNd$2Æ?f*'The AddressXlation.h header file  /  66
  1657. °dONLNdLB∫M<+ The OpenResolver call  /  67°dONLNdiP∫[.*The StrToAddr call  /  68°dONLNdÉ^∫i.*The AddrToStr call  /  69°dONLNdùl∫w4*The EnumCache call  /  70°dONLNd∑z∫Ö<*The AddrToName call  /  72°dONLNd“à∫ì*The HInfo call  /  73°dONLNdËñ∫°"*The MXInfo call  /  74°dONLNdˇ§∫Ø<*The CloseResolver call  /  75
  1658. °dONLNd¥Æ¡p(›Ã)Binding the DNR to the application  /  75°dONLNdGΔÆ”*DNR operation  /  76°dONLNd]Èùˆ¢(ª6°dONLNd_ÈÆˆ5)Miscellaneous Interfaces  /  77°dONLNd¸Æ    ;*MacTCPCommontypes  /  78
  1659. °dONLNdò ∫
  1660. + Result codes  /  78°dONLNd¨∫%0*Miscellaneous types  /  81°dONLNd«(∫3¿*:Internet Control Message Protocol report structures  /  81
  1661. °dONLNd8ÆE(aÃGetMyIPAddr  /  82°dONLNdJÆW*ICMP echo  /  83°dONLNd'myz¢(ñóAppendix°dONLNd0mÆz¯)5Constants  /  85°dONLNdAÄÆç*Command codes  /  85°dONLNdVíÆüa*#UDP asynchronous event codes  /  85°dONLNdz§Æ±^*#TCP asynchronous event codes  /  86°dONLNdû∂Æ√T*"Reasons for TCP termination  /  86
  1662. (ŸÈContents
  1663. ):v ÃpÃ)ˇ
  1664. ~◊#ˇ ˇˇˇˇ#◊ 
  1665. d,N Helvetica Narrow
  1666. .°dONLNdATTì+rnPreface°dONLNdAÆT4)ZAbout This Guide,Times
  1667. °dONLNd™Æµ˛*cFThis guide describes how to create application programs for the MacTCP°dONLNd`∏Æ√Ó*Adriver. The MacTCP driver, Apple Computer’s implementation of the°dONLNd¢ΔÆ—˚*Gprotocol suite known as Transmission Control Protocol/Internet Protocol°dONLNdÍ‘ÆflÂ*D(TCP/IP), increases the Macintosh computer’s ability to operate in a°dONLNd/‚ÆÌ`*#heterogeneous computer environment.
  1668. °dONLNdS˝Æ
  1669. *What’s in this guide
  1670. °dONLNdhÆ ¸*IThis guide is divided into six chapters and one appendix that contain the°dONLNd≤#Æ.*following information:, p    AppleIconp
  1671. °dONLNd…7Æ?≥*n
  1672. °dONLNdÀ5ª@Â)
  1673. =Chapter 1, “Introduction,” provides an overview of the MacTCP°dONLNd    CªNÙ*
  1674. architecture.p
  1675. °dONLNdWÆ_≥(|Ãn
  1676. °dONLNdUª`˙)
  1677. @Chapter 2, “The MacTCP Driver,” describes the PBOpen, PBControl,°dONLNdZcªnfl*@PBClose, and Gestalt calls and describes internal algorithms and°dONLNdõqª|B*decisions made by the driver.p
  1678. °dONLNdπÖÆç≥(™Ãn
  1679. °dONLNdªɪéfl)
  1680. <Chapter 3, “User Datagram Protocol,” describes UDP routines.p
  1681. °dONLNd¯óÆü≥(ºÃn
  1682. °dONLNd˙惘˚)
  1683. CChapter 4, “Transmission Control Protocol,” describes TCP routines.p
  1684. °dONLNd>©Æ±≥(ŒÃn
  1685. °dONLNd@ߪ≤    )
  1686. DChapter 5, “Name-to-Address Resolution,” describes how textual names°dONLNdÖµª¿<*are resolved to IP addresses.p
  1687. °dONLNd£…Æ—≥(ÓÃn
  1688. °dONLNd•«ª“Ó)
  1689. CChapter 6, “Miscellaneous Interfaces,” describes the types that are°dONLNdÈ’ª‡„*>found throughout the programmatic interfaces supplied with the°dONLNd(„ªÓ*MacTCP driver.p
  1690. °dONLNd7˜Æˇ≥(Ãn
  1691. °dONLNd9ıª“)
  1692. 6The Appendix, “Constants,” presents command codes, UDP°dONLNdpª*Casynchronous event codes, TCP asynchronous event codes, and reasons°dONLNd¥ª*for TCP termination.
  1693. °dONLNd…,Æ9@(UÃWho should read this guide
  1694. °dONLNd‰DÆOÎ*AThis guide is designed both for Macintosh programmers who are not°dONLNd&RÆ]
  1695. *Ifamiliar with TCP/IP and for TCP/IP programmers who are not familiar with°dONLNdp`Ækr*&the Macintosh programming environment. ÃpÃ)ˇå◊#ˇ ˇˇˇˇ#◊ 
  1696. d,N Helvetica Narrow
  1697. .°dONLNdx,Û+ñHDocument conventions,Times
  1698. °dONLNd7xB¡*@This document reflects the Macintosh Programmer’s Workshop (MPW)°dONLNdVExPr*8conventions for types and sizes of variables and fields.
  1699. °dONLNdè`xm›*Related documents
  1700. °dONLNd°xxÉ{*8You might find the following reference materials useful., p    AppleIconp
  1701. °dONLNd⁄åxî}*n
  1702. °dONLNd‹äÖï)
  1703. MacTCP Administrator’s Guidep
  1704. °dONLNd˘ûx¶}(√ñn
  1705. °dONLNd˚úÖß◊)
  1706. Inside Macintosh,°dONLNd ú◊ß)R
  1707.  Volumes I–VIp
  1708. °dONLNd∞x∏}(’ñn
  1709. °dONLNdÆÖπ“)
  1710. Douglas Comer, °dONLNd+Æ“πY)MInternetworking with TCP/IP,°dONLNdGÆYπœ)á Second Edition (Prentice°dONLNd`Æœπ”)v-°dONLNdaºÖ«π(„£ Hall, 1991)p
  1711. °dONLNdm–xÿ}(ıñn
  1712. °dONLNdoŒÖŸ—)
  1713. DThe MacTCP driver implements protocols that conform to the following°dONLNd¥‹ÖÁµ*<Request for Comments (RFC) and Military Standards (MIL-STD):°dONLNdÒÍÖı3*!—RFC 768 (User Datagram Protocol)°dONLNd¯Öx*/—RFC 791, 894; MIL-STD 1777 (Internet Protocol)°dONLNdCÖb*,—RFC 792 (Internet Control Message Protocol)°dONLNdpÖ†*6—RFC 793; MIL-STD 1778 (Transmission Control Protocol)°dONLNdß"Ö-G*&—RFC 826 (Address Resolution Protocol)°dONLNdŒ0Ö;m*.—RFC 903 (Reverse Address Resolution Protocol)°dONLNd˝>ÖI*—RFC 950 (Internet Subnetting)°dONLNdLÖW7*#—RFC 951, 1048 (Bootstrap Protocol)°dONLNd@ZÖeR*'—IDEA004 (Routing Information Protocol)°dONLNdhhÖsH*%—RFC 1010 (Internet Assigned Numbers)°dONLNdévÖÅT*&—RFC 1034, 1035 (Domain Name Resolver)°dONLNdµÑÖè!*—RFC 1060 (Assigned Numbers)°dONLNd“íÖù‘*@—RFC 1122 (Requirements for Internet Hosts—Communication Layers)
  1714. (Ÿ<viii
  1715. )Preface Ã:ÃÛˇ¯◊#ˇ ˇˇˇˇ#◊ 
  1716. d,N Helvetica Narrow
  1717. 0.°dONLNd*TZj+rn1
  1718. °dONLNdAÆT )Z Introduction,Times
  1719. °dONLNd™ÆµË*cBThe MacTCP driver is a software driver for the Macintosh Operating°dONLNdR∏Æ√*JSystem that allows developers to create Macintosh applications for network°dONLNdùΔÆ—*Ienvironments that use the Transmission Control Protocol/Internet Protocol°dONLNdÁ‘Æfl·*B(TCP/IP). TCP/IP is a widely used industry standard for connecting°dONLNd*‚ÆÌ¸*Fmultivendor computers. The TCP/IP protocol layers are fully compatible°dONLNdqÆ˚È*Dacross all implementations on different hardware platforms, allowing°dONLNd∂˛Æ    
  1720. *Kdifferent vendors’ computers that run TCP/IP to interoperate and share data°dONLNd ÆË*
  1721. and services.°dONLNd!Æ,œ*=This chapter provides an overview of the MacTCP architecture. ÃpÃ)ˇ}¶◊#ˇ ˇˇˇˇ#◊ 
  1722. d,N Helvetica Narrow
  1723. .°dONLNd-ë+<IArchitectural overview,Times
  1724. °dONLNd8xC≠+ZAMacTCP protocols partially conform to the International Standards°dONLNdYFxQ©*?Organization (ISO) Open Systems Interconnection (OSI) layers of°dONLNdôTx_«*Fnetworking functionality. Figure 1-1 shows a comparison of the OSI and°dONLNd‡bxm+*#MacTCP communications architecture.
  1725. 4úèùê°d
  1726. ONLNf‰
  1727. ùêÉÀ<ò(@;@;ùê›ÀŸŸŸ8»Ú˜q∏ÚE(ÒH…§ÚEÒé–ÒHI§ÚD»™S0ÒHr∏ÚD(™SÒHB†ÚE(™SÒH¬†Ú8»©éÒGB†ÚŸŸŸŸŸŸŸŸŸŸÄ?„ˇ˛(@o„ˇ˛+2¢r`O„ˇ˛*™’UPO„ˇ˛:™√UPO„ˇ˛F™’UPO„ˇ˛G2£2PO„ˇ˛
  1728.  ˝O„ˇ˛
  1729.  ˝O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛p˛@O„ˇ˛HÅO„ˇ˛KFL—”O„ˇ˛r®™©jøœ„ˇ˛B‰ÍôjÄO„ˇ˛BÇä©jÄO„ˇ˛BljX“ÄO„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛0@˛O„ˇ˛ H¸O„ˇ˛A…ÄO„ˇ˛2¢U@O„ˇ˛ ëU@O„ˇ˛J’@O„ˇ˛1≥I@o„ˇ˛    ˙?„ˇ˛    ˙?„ˇ˛    ˙o„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛ |¸O„ˇ˛O„ˇ˛LlMÄO„ˇ˛™ä©O„ˇ˛jJ©ˇœ„ˇ˛ò(@Ä;@Ä;›êÀ™*©O„ˇ˛jÃHÄO„ˇ˛
  1730. ˛˛O„ˇ˛
  1731. ˛˛O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙o„ˇ˛    ˙?„ˇ˛    ˙?„ˇ˛    ˙o„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛HÄO„ˇ˛H ÄO„ˇ˛i:ì†O„ˇ˛z™™√ˇˇœ„ˇ˛[™™¿O„ˇ˛J*™¿O„ˇ˛Iï†O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙o„ˇ˛    ˙?„ˇ˛    ˙?„ˇ˛    ˙o„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛pO„ˇ˛H O„ˇ˛I4 O„ˇ˛J™¨ˇˇœ„ˇ˛I¶¨O„ˇ˛J™¨O„ˇ˛qñ™O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛ò(Ä¿;Ä¿;ê]À    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙„ˇ˛    ˙„ˇ˛    ˙„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛    ˙O„ˇ˛˙@¸ ¯@¯ ˚˙@¸ ¯@¯ ˚r@@¸ ¯@¯ ˚J@¸ ¯@¯ ˚K)»ê@˘ˇ¸˘ˇ¸˘ˇ˛ˇr™UP@˘ˇ¸˘ˇ¸˘ˇ˛ˇB©P◊ˇˇ¿˘ˇ¸˘ˇ¸˘ˇ˛ˇBê’P@˘ˇ¸˘ˇ¸˘ˇ˛ˇBìH–@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˝@˘ˇ¸˘ˇ¸˘ˇ˛ˇ ˝@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@·˙@·˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ò(¿Ê;¿Ê;]êÉÀ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙@˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙p˘ˇ¸˘ˇ¸˘ˇ˛ˇ˙˘ˇ¸˘ˇ¸˘ˇ˛ˇŸŸŸŸŸŸŸŸŸŸ Ûˇ˛˜ˇı Ûˇ˛˜ˇıÛˇ˛˛˛ˇÄ?Œ˘Ûˇ˛˛    ˇÄ
  1732. )˘Ûˇ˛JI10fçE∞ˇ
  1733. ë
  1734.     ˘Ûˇ˛˛™ †UUK@ˇ
  1735. ™ä˘Ûˇ˛ÍÍ´†UUI ˇ
  1736. ö
  1737. (˘Ûˇ˛ää™ UUKˇ
  1738. ™ä(˘Ûˇ˛di1†d僇ˇ
  1739. ô    »˘Ûˇ˛˛ @˝ˇıÓ @ÔŸŸòÅ<@;HH˙v¯<IJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  1740. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  1741. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  1742.  
  1743.  
  1744.  ˛êêê@;ùê›À'ÅÅ≈ÅÅ≈ÅÅ≈,˜˛ˇ˛ˇˇˇˇ˝ˇÅ˛¸ˇ˛ˇ˛ˇ˛ˇˇ˛ˇä3¯ˇ˛ˇˇˇˇˇ˝ˇÅ¸ˇˇ˛
  1745. ˇˇˇˇˇˇˇã>¯ˇ˛ˇ˛˝ˇ˛˛ˇ˛˛˛ˇ˛˛ˇˇˇ˛Å¸ˇˇ˝ ˇˇ˛ˇˇˇã>¯ˇ˛ˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅ¸ˇˇ˝˛ˇˇˇ˛ˇä8¯ˇ˛ˇ˝ˇˇ˛
  1746. ˇˇˇˇˇˇ˚ˇÅ¸ˇˇ˝ˇ˝ˇˇˇà>¯˛˛˛ˇˇˇ˛ˇˇˇˇ˛ˇˇˇ˛ˇÅ¸˛ˇ˛ˇ˛˝ˇˇˇà7˜˛ˇ˛ˇˇˇ˛ˇˇˇˇˇ˛˛ˇ˝ˇÅ¸ˇ˛˛ˇˇ˝ˇˇˇàÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ˆˇ˜ˇˇ˜ˇÎÅˇÑˇ¸‘˜ˇˇ¯ˇ˜ˇÍˇˇˇÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ;ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔˇ¿‡ˇ¸'˜ˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇˇÛˇˇÔ˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛ÔÔˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸(˜!ˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇ˛ˇ˛ˇ˛Ùˇˇ˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ôˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸È˜˛ˇ ˇˇˇˇˇˇˇ˝
  1747. ˇˇˇˇˇˇˇˇÙˇˇÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ;ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔˇ¿‡ˇ¸)¯ˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÙˇˇ˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ôˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸X¯˛˛
  1748. ˛ˇˇˇˇˇˇˇ˛
  1749. ˇˇˇˇˇ˛ˇÙˇˇÔ˛ÔÔ ˇ˛Ô ˇÔÔ ˇÔÔÔˇfl‡‡ ˇ‡‡fl˛‡flˇ¸?Ûˇ˛ˇ€ ˇˇÔÔÔˇÃˇÔÔˇÃˇÔÔˇÃˇÔÔˇ˛‡ˇÃˇ˙‡ˇ¸CÛˇ˛ˇ€ˇˇÔ˛ÔÔˇÃˇ˛ÔˇÃˇÔÔˇÃ    ˇÔÔÔˇfl‡‡ˇÃˇ‡‡fl˛‡flˇ¸;»ˇˇ˛Ô˛ÔˇÃˇÔÔÔˇÃˇÔÔˇÃˇ˛Ôˇ‡‡flˇÃˇfl˛‡fl‡‡ˇ¸7» ˇˇÔÔÔˇÃˇÔÔˇÃˇÔÔˇÃˇÔÔˇ˛‡ˇÃˇ˙‡ˇ¸C¯˛ˇ‰ˇÚˇˇ˛Ô˛ÔˇÃˇÔÔÔˇÃˇÔÔˇÃˇ˛Ôˇ‡‡flˇÃˇfl˛‡fl‡‡ˇ¸ç¯˛ˇÓˇ˚ˇˇˇÔ˛ÔÔˇÏ˛ˇ˛˛ˇ˛˛ˇ˛Ìˇ˛Ôˇ˛˛ˇ˛˝ˇÁˇÔÔˇÔˇ˛ˇ˛ˇˇˇ˛˛ˇ˛    ˇÔÔÔˇfl‡‡ˇÔ    ˇˇˇˇˇ˛ˇ˛ˇˇ‡‡fl˛‡flˇ¸ß¯ˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇ˛˛ˇˇˇˇ¯ ˇˇÔÔÔˇÏˇ¸ˇˇˇÓˇÔÔˇÓˇ˚ˇ˘ˇˇÔÔˇˇˇˇ˛ˇ˝ˇˇˇÒˇÔÔˇ˛‡ˇ
  1750. ˇˇˇˇˇ˛ˇˇˇÒˇ˙‡ˇ¸±¯˛ˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇˇ˘ˇˇÔ˛ÔÔˇÏˇ¸ˇˇˇÓˇ˛ÔˇÓˇˇ˛˛ˇ˛ˇˇˇÒˇÔÔˇˇ˝ˇˇˇˇ˝ˇˇˇÒ    ˇÔÔÔˇfl‡‡ˇˇ˝ˇˇˇˇˇˇˇˇˇÒˇ‡‡fl˛‡flˇ¸±¯ˇ˝ˇ˛ˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇˇˇ˘ˇˇ˛Ô˛ÔˇÏ ˇ˛ˇˇˇ˛ˇˇÌˇÔÔÔˇÓ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇÔÔˇÔˇˇˇˇ˛ˇ˝ˇ˛ˇˇˇ˛Ôˇ‡‡flˇÔ˛ˇ˛˛ˇ    ˇˇ˛ˇˇ˛ˇˇfl˛‡fl‡‡ˇ¸ü¯ˇ˝ˇˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˘ ˇˇÔÔÔˇÏˇ¸ˇˇÎˇÔÔˇÓˇ˛ˇˇˇˇ˛ˇˇˇÔÔˇÌˇˇˇˇˇ˝ˇˇÓˇÔÔˇ˛‡ˇÌ
  1751. ˇˇˇˇˇˇˇˇˇÓˇ˙‡ˇ¸™¯ˇ˝ˇˇˇˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇˇˇˇ˘ˇˇ˛Ô˛ÔˇÏˇ¸ˇˇÎˇÔÔÔˇÓˇˇ˝ˇˇˇˇ˛ˇˇÔÔˇ    ˇˇˇˇˇ˝ˇˇÓˇ˛Ôˇ‡‡flˇˇˇˇˇˇˇˇˇÓˇfl˛‡fl‡‡ˇ¸Ä»ˇˇÔ˛ÔÔˇÏˇ¸ˇˇÎˇ˛ÔˇÓˇˇˇˇˇ˛ˇ˛ˇÒˇÔÔˇÔˇ˛ˇˇˇ˝˛ˇÓ    ˇÔÔÔˇfl‡‡ˇÔˇˇˇˇˇˇˇˇÓˇ‡‡fl˛‡flˇ¸7» ˇˇÔÔÔˇÃˇÔÔˇÃˇÔÔˇÃˇÔÔˇ˛‡ˇÃˇ˙‡ˇ¸;»ˇˇÔ˛ÔÔˇÃˇ˛ÔˇÃˇÔÔˇÃ    ˇÔÔÔˇfl‡‡ˇÃˇ‡‡fl˛‡flˇ¸;»ˇˇ˛Ô˛ÔˇÃˇÔÔÔˇÃˇÔÔˇÃˇ˛Ôˇ‡‡flˇÃˇfl˛‡fl‡‡ˇ¸@˜ˇˇÙˇ‚ ˇˇÔÔÔˇÃˇÔÔˇÃˇÔÔˇÃˇÔÔˇ˛‡ˇÃˇ˙‡ˇ¸B¯ˇˇ’ˇˇ˛Ô˛ÔˇÃˇÔÔÔˇÃˇÔÔˇÃˇ˛Ôˇ‡‡flˇÃˇfl˛‡fl‡‡ˇ¸K¯˛¸ˇ˛
  1752. ˇˇˇˇ˛ˇˇˇÈˇˇÔ˛ÔÔ ˇ˛Ô ˇÔÔ ˇÔÔÔˇfl‡‡ ˇ‡‡fl˛‡flˇ¸·˜ˇˇˇˇˇ˛ ˇˇˇˇˇˇÍˇˇÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ;ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔˇ¿‡ˇ¸ıˇ˛ˇˇ˛
  1753. ˇˇˇˇˇˇÍˇˇÔ˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛ÔÔˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸¯ˇˇˇ¸ˇ˛    ˇˇ˛ˇ˛ˇÍˇˇ˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ô˛Ôˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸·˜ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÍˇˇˇÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ;ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔˇ¿‡ˇ¸(«Åˇ¿ˇfl˙ˇfl˙ˇfl˙ˇfl˙ˇfl˙ˇfl˙ˇfl˙ˇfl˛ˇ¸«˛ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇˇÅ‡à‡ˇ¸»ˇˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇ˙‡ëˇı‡íˇ˙‡ˇ¸.»ˇˇ‡‡fl˛‡flˇìˇ˛‡fl˛‡fl˛‡flˇîˇfl˛‡fl‡‡ˇ¸.»ˇˇfl˛‡fl‡‡ˇìˇ‡fl˛‡fl˛‡fl‡‡ˇîˇ‡‡fl˛‡flˇ¸»ˇˇ˙‡ˇìˇı‡ˇîˇ˙‡ˇ¸.»ˇˇfl˛‡fl‡‡ˇìˇ‡fl˛‡fl˛‡fl‡‡ˇîˇ‡‡fl˛‡flˇ¸6¯ˇˇ˛ˇˇ÷ˇˇ‡‡fl˛‡flˇìˇ˛‡fl˛‡fl˛‡flˇîˇfl˛‡fl‡‡ˇ¸AˆˇÊˇˇˇ˙‡ˇ—¸ˇˇˇ˝ˇ—ˇı‡ˇ“ˇ˛ˇ˛ˇ˝ˇ“ˇ˙‡ˇ¸gˆ
  1754. ˇˇˇˇˇˇ˛ˇˇˇˇ˛ˇˇˇˇˇÒˇˇ‡‡fl˛‡flˇœˇˇˇˇŒˇ˛‡fl˛‡fl˛‡flˇ“ˇ˛ˇ˚ˇœˇfl˛‡fl‡‡ˇ¸fˆ
  1755. ˇˇˇˇˇˇˇ˛ ˇˇˇˇˇˇˇˇfl˛‡fl‡‡ˇœˇ˛¸ˇŒˇ‡fl˛‡fl˛‡fl‡‡ˇ“ˇ˛ˇ˝˛ˇœˇ‡‡fl˛‡flˇ¸Vˆˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˙‡ˇœˇˇ¸˝ˇ—ˇı‡ˇ“ˇ˛ˇ˝ˇ˝ˇ“ˇ˙‡ˇ¸òÅ<@Ä;HH˙r∏=IJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  1756. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  1757. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  1758.  
  1759.  
  1760.  ˛êêê@Ä;›êÀ'fˆ ˇˇˇˇˇˇ˛
  1761. ˇˇˇˇˇˇˇˇˇfl˛‡fl‡‡ˇœˇˇ¸ˇŒˇ‡fl˛‡fl˛‡fl‡‡ˇ“ˇ˛ˇ˝ˇˇœˇ‡‡fl˛‡flˇ¸gˆ˛ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇÒˇˇ‡‡fl˛‡flˇœ˛ˇˇ˛Œˇ˛‡fl˛‡fl˛‡flˇ“ˇ˛ˇ˚˛œˇfl˛‡fl‡‡ˇ¸:¡Âˇˇ˙‡ˇœˇ˛ˇˇˇŒˇı‡ˇ—˛ˇ˛ˇˇœˇ˙‡ˇ¸2¡Âˇˇ‡‡fl˛‡flˇìˇ˛‡fl˛‡fl˛‡flˇîˇfl˛‡fl‡‡ˇ¸.»ˇˇfl˛‡fl‡‡ˇìˇ‡fl˛‡fl˛‡fl‡‡ˇîˇ‡‡fl˛‡flˇ¸»ˇˇ˙‡ˇìˇı‡ˇîˇ˙‡ˇ¸.»ˇˇfl˛‡fl‡‡ˇìˇ‡fl˛‡fl˛‡fl‡‡ˇîˇ‡‡fl˛‡flˇ¸.»ˇˇ‡‡fl˛‡flˇìˇ˛‡fl˛‡fl˛‡flˇîˇfl˛‡fl‡‡ˇ¸»ˇˇ˙‡ëˇı‡íˇ˙‡ˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸Ç«¯ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˛ˇ¸«˛ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇÅ‡à‡ˇ¸»ˇˇ‡‡fl˛‡flŎñˇfl˛‡fl‡‡ˇ¸»ˇˇfl˛‡fl‡‡ˇÅòˇ‡‡fl˛‡flˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸»ˇˇfl˛‡fl‡‡ˇÅòˇ‡‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡flˇÅòˇfl˛‡fl‡‡ˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸/¯ˇˇÓˇÈˇˇ‡‡fl˛‡flˇèˇ˝ˇêˇfl˛‡fl‡‡ˇ¸2¯˛ˇ¸ˇÙˇÈˇˇfl˛‡fl‡‡ˇèˇ˛çˇ‡‡fl˛‡flˇ¸8¯ˇˇˇˇ˛ˇˇˇˇ˛ˇˇÎˇˇ˙‡ˇèˇˇçˇ˙‡ˇ¸?¯˝ˇˇˇˇˇˇˇˇˇˇˇˇ˝Ìˇˇfl˛‡fl‡‡ˇèˇ˝ˇêˇ‡‡fl˛‡flˇ¸?¯ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÍˇˇ‡‡fl˛‡flˇè˛ˇçˇfl˛‡fl‡‡ˇ¸7¯ˇˇˇ˛ˇˇˇˇˇˇˇˇˇÍˇˇ˙‡ˇèˇˇçˇ˙‡ˇ¸@¯ˇˇˇˇˇˇˇ˛ˇˇˇˇÎˇˇ‡‡fl˛‡flˇèˇˇçˇfl˛‡fl‡‡ˇ¸»ˇˇfl˛‡fl‡‡ˇÅòˇ‡‡fl˛‡flˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸»ˇˇfl˛‡fl‡‡ˇÅòˇ‡‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡flˇÅòˇfl˛‡fl‡‡ˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸»ˇˇ‡‡fl˛‡flŎñˇfl˛‡fl‡‡ˇ¸»ˇˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇˇÅ‡à‡ˇ¸Ç«¯ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˛ˇ¸«˛ˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇˇÅ‡à‡ˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇfl˛‡fl‡‡Åˇñˇ‡‡fl˛‡flˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸»ˇˇfl˛‡fl‡‡ˇÅòˇ‡‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡flˇÅòˇfl˛‡fl‡‡ˇ¸-»ˇˇ˙‡ˇÆˇ¯ˇ˙ˇÎˇ˛ˇÏˇØˇ˙‡ˇ¸c»ˇˇ‡‡fl˛‡flˇÆˇ˛ˇˇˇˇ˝ˇ˛ˇˇˇ˛ˇ˛ˇˇˇ˛ˇ˛ ˇˇˇˇˇˇˇ˛ˇˇˇˇØˇfl˛‡fl‡‡ˇ¸`»ˇˇfl˛‡fl‡‡ˇÆˇ˛ˇˇˇˇˇ¸˛¸ ˇˇˇˇˇˇˇ˛ˇ˛˛˛ˇˇ˛ˇ˛ˇ˛ˇ˛˛˛ˇØˇ‡‡fl˛‡flˇ¸R»ˇˇ˙‡ˇÆˇ˛ˇ˛ˇˇ¸˝ˇ˝ˇ˛˛ˇˇˇˇ˛ˇ˝ˇˇˇ˛ˇˇˇ¸ˇˇØˇ˙‡ˇ¸\»ˇˇfl˛‡fl‡‡ˇÆˇ˛ˇ˛ˇˇ¸ˇˇ˝ˇ˛ˇ¸ˇ˛ˇˇ˝ˇˇˇ˛ˇˇˇ¸ˇˇØˇ‡‡fl˛‡flˇ¸^»ˇˇ‡‡fl˛‡flˇÆˇ˛ˇ˛ˇˇ˛˘ˇ˛ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛˛˛ˇ˛ˇ˛ˇ˛Øˇfl˛‡fl‡‡ˇ¸»ˇˇ˙‡ˇÅòˇ˙‡ˇ¸/¯˛ˇÚˇ˛ˇ˝ˇÌˇˇ‡‡fl˛‡flˇÅòˇfl˛‡fl‡‡ˇ¸0¯˛ˇ¸ˇ˘ˇ˘ˇÌˇˇfl˛‡fl‡‡Åˇñˇ‡‡fl˛‡flˇ¸-¯ ˇˇˇˇˇˇ¸ˇ˛˛ˇˇˇÔˇˇÅ‡à‡ˇ¸M¯
  1762. ˇˇˇˇˇˇˇ˝ˇ˛ˇˇˇˇˇÔˇˇfl˛‡fl‡‡∑ˇ˛‡fl˛‡∏ˇ˛‡fl˛‡fl∏ˇ‡‡fl˛‡flˇ¸U¯
  1763. ˇˇ˛ˇˇˇˇ˝˛˛˛ˇˇˇˇÓˇˇ‡‡fl˛‡flˇπˇ‡fl˛‡fl‡ˇ∫ˇ‡fl˛‡fl‡‡ˇ∫ˇfl˛‡fl‡‡ˇ¸D¯
  1764. ˇˇˇˇˇˇˇ˝ˇ˛ˇˇˇˇˇÓˇˇ˙‡ˇπˇ˙‡ˇ∫ˇ˘‡ˇ∫ˇ˙‡ˇ¸v¯˛ˇ˛ˇˇˇˇˇ˝˛ˇˇˇˇˇˇÔˇˇ‡‡fl˛‡flˇ‰ˇˇ¸ˇ˝ˇÊˇ‡fl˛‡fl‡ˇÊ˝ˇ˙ˇ˝ˇÁˇ‡fl˛‡fl‡‡ˇÊ¸ˇ˘˝ˇÊˇfl˛‡fl‡‡ˇ¸a»ˇˇfl˛‡fl‡‡ˇ‰ˇ˛¸ˇˇ˛ˇÁˇ˛‡fl˛‡ˇÊ˛˜ˇˇ‰ˇ˛‡fl˛‡flˇ‰ˇˇ˘ˇ˛ˇÁˇ‡‡fl˛‡flˇ¸R»ˇˇ˙‡ˇ„ˇˇ˚ˇˇ˛ˇÁˇ˙‡ˇÊˇ¯ˇˇˇ‰ˇ˘‡ˇ‰ˇˇ¸ˇˇˇ˛ˇÁˇ˙‡ˇ¸\»ˇˇfl˛‡fl‡‡ˇÂˇˇˇ˝ˇ¸ˇÊˇ˛‡fl˛‡ˇÊ˝ˇ˜˝ˇÁˇ˛‡fl˛‡flˇ‰ˇˇ˝ˇ¸ˇÊˇ‡‡fl˛‡flˇ¸_»ˇˇ‡‡fl˛‡flˇÂˇˇ˛ˇˇ˝ˇ˛˛ˇ„ˇ‡fl˛‡fl‡ˇÊˇ¯˛ˇˇ˛‰ˇ‡fl˛‡fl‡‡ˇ‰ˇˇ˝˛˛ˇ˛„ˇfl˛‡fl‡‡ˇ¸K»ˇˇ˙‡ˇÂˇˇˇ˝ˇˇˇ„ˇ˙‡ˇÊˇÙˇ‰ˇ˘‡ˇ‰ˇˇ˝ˇˇˇ„ˇ˙‡ˇ¸]»ˇˇ‡‡fl˛‡flˇÊˇ˝¸ˇ˝ˇ„ˇ‡fl˛‡fl‡ˇÊ˝ˇ˛ˇˇ˛ˇˇ‰ˇ‡fl˛‡fl‡‡ˇ‰ˇ¸ˇ˝ˇ„ˇfl˛‡fl‡‡ˇ¸òÅ<Ä¿;HH˙v¯>IJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  1765. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  1766. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  1767.  
  1768.  
  1769.  ˛êêêÄ¿;ê]À'6»ˇˇfl˛‡fl‡‡ˇπˇ˛‡fl˛‡ˇ∫ˇ˛‡fl˛‡flˇ∫ˇ‡‡fl˛‡flˇ¸%»ˇˇ˙‡ˇπˇ˙‡ˇ∫ˇ˘‡ˇ∫ˇ˙‡ˇ¸-»ˇˇfl˛‡fl‡‡∑ˇ˛‡fl˛‡∏ˇ˛‡fl˛‡fl∏ˇ‡‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇÅ‡à‡ˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»˝ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸ÇΔ˘ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˙ˇ‡˛ˇ¸»˝ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇ˙‡∑ˇ˙‡∏ˇ˘‡∏ˇ˙‡ˇ¸6»ˇˇ‡‡fl˛‡flˇπˇ‡fl˛‡fl‡ˇ∫ˇ‡fl˛‡fl‡‡ˇ∫ˇfl˛‡fl‡‡ˇ¸6»ˇˇfl˛‡fl‡‡ˇπˇ˛‡fl˛‡ˇ∫ˇ˛‡fl˛‡flˇ∫ˇ‡‡fl˛‡flˇ¸%»ˇˇ˙‡ˇπˇ˙‡ˇ∫ˇ˘‡ˇ∫ˇ˙‡ˇ¸6»ˇˇfl˛‡fl‡‡ˇπˇ˛‡fl˛‡ˇ∫ˇ˛‡fl˛‡flˇ∫ˇ‡‡fl˛‡flˇ¸6»ˇˇ‡‡fl˛‡flˇπˇ‡fl˛‡fl‡ˇ∫ˇ‡fl˛‡fl‡‡ˇ∫ˇfl˛‡fl‡‡ˇ¸M»ˇˇ˙‡ˇÏˇÚˇ¸ˇ˝ˇÍˇ˙‡ˇÎ˝ˇˇˇÓˇÏˇ˘‡ˇ¸ˇÔ˛ˇˇËˇ˙‡ˇ¸[»ˇˇ‡‡fl˛‡flˇÏˇÚˇ˛ˇ˚ˇÍˇ‡fl˛‡fl‡ˇÎˇ¸ˇˇÓˇÏˇ‡fl˛‡fl‡‡ˇÓˇÍˇÊˇfl˛‡fl‡‡ˇ¸ì»ˇˇfl˛‡fl‡‡ˇÏˇ˛ˇˇˇ˛ˇˇˇ˛ˇ˛ˇ˛ˇÏˇ˛‡fl˛‡ˇÎˇ¸˛ˇˇ˛ ˇˇˇˇˇˇˇÏˇ˛‡fl˛‡flˇÓˇ˝ˇˇˇ˛ˇ˛˘
  1770. ˇˇˇˇˇˇˇ‡‡fl˛‡flˇ¸Å»ˇˇ˙‡ˇÏˇ˛ˇˇˇ¸ˇˇ˛ˇ˛ˇˇˇÎˇ˙‡ˇÎ˝ˇˇˇ˛ˇ˛ ˇˇˇˇˇˇÏˇ˘‡ˇÓˇ˝ˇˇˇ˛ˇ˚˛ˇˇ˛ˇ˛ˇˇ˙‡ˇ¸ã»ˇˇfl˛‡fl‡‡ˇÏˇ˛ˇˇˇ˝ˇˇˇ˛ˇ˛ˇˇÍˇ˛‡fl˛‡ˇÎˇ¸ˇˇ˛˛ˇˇˇˇ˛ˇˇÏˇ˛‡fl˛‡flˇÓˇ˝ˇ˝˛ˇˇˆˇ˛ˇ˛ˇˇ‡‡fl˛‡flˇ¸ì»ˇˇ‡‡fl˛‡flˇÏˇ˛ˇˇˇ˛ˇˇˇ˛ˇ˛ˇˇ˛Ïˇ‡fl˛‡fl‡ˇÎˇ¸ˇ˛˛˛˛ ˛ˇˇˇˇ˛Ïˇ‡fl˛‡fl‡‡ˇÓˇ˝˛ˇˇ˛ˇ¯ˇˇ˛ˇ˛ˇˇfl˛‡fl‡‡ˇ¸}»ˇˇ˙‡ˇÏ˝ˇˇ˛ˇˇˇˇˇ˛ˇˇˇ˛ˇÍˇ˙‡ˇÎ˝ˇˇˇ˝ ˇˇˇˇˇˇ˛ˇÏˇ˘‡ˇÓˇˇˇ˝ˇˇˇˇ¯ˇˇ˛ˇˇˇˇ˙‡ˇ¸:»ˇˇ‡‡fl˛‡flˇπˇ‡fl˛‡fl‡ˇ∫ˇ‡fl˛‡fl‡‡ˇÃˇˇfl˛‡fl‡‡ˇ¸;»ˇˇfl˛‡fl‡‡ˇπˇ˛‡fl˛‡ˇ∫ˇ˛‡fl˛‡flˇŒˇˇÔˇ‡‡fl˛‡flˇ¸%»ˇˇ˙‡ˇπˇ˙‡ˇ∫ˇ˘‡ˇ∫ˇ˙‡ˇ¸6»ˇˇfl˛‡fl‡‡ˇπˇ˛‡fl˛‡ˇ∫ˇ˛‡fl˛‡flˇ∫ˇ‡‡fl˛‡flˇ¸6»ˇˇ‡‡fl˛‡flˇπˇ‡fl˛‡fl‡ˇ∫ˇ‡fl˛‡fl‡‡ˇ∫ˇfl˛‡fl‡‡ˇ¸»ˇˇ˙‡∑ˇ˙‡∏ˇ˘‡∏ˇ˙‡ˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡ˇ‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡ˇ˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇ‘‡ˇ≥‡ˇ±‡ˇ÷‡ˇ¸»ˇˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡ˇ˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡flˇ¸»ˇˇ‡‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡ˇ‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇfl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl˛‡fl‡‡ˇ¸»ˇˇ‘‡ˇ≥‡ˇ±‡ˇ÷‡ˇ¸ »ˇÅˇÜˇ¸»ˇ—ˇ≥ˇ±ˇ–»ˇ—ˇ≥ˇ±ˇ–"¯˛ˇˇ˜ˇ¯ˇÏˇ—ˇ≥ˇ±ˇ–¯ˇˇˇÌ˛Ïˇ—ˇ≥ˇ±ˇ–0¯
  1771. ˇˇˇˇˇˇ˛ˇˇ˛ˇˇÏˇ˜∑ˇ˙∏ˇ˘∏ˇÙ;¯˛ˇˇˇˇˇˇˇˇˇˇˇˇÏˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ9¯˛˝
  1772. ˇˇˇˇˇ˛ˇ˝ˇ˛ˇÏˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙd¯ˇ˝ˇˇˇ˝ ˇˇˇˇˇˇˇÏˇ˜ˇflˇ˝ˇ˝ˇÊˇ˙ˇÊˇ˝ˇˇˇ˘ˇËˇ˘ˇÂˇˇˇ¸ˇ„ˇÙįˇ˝ˇˇˇˇˇˇˇ˛ˇˇˇÏˇ˜ˇ„ˇˇˇ˝ˇ˝ˇÊˇ˙ˇÊˇ˝ˇˇˇ˘ˇËˇ˘ˇÌˇ˛ˇˇ˛ˇˇ¸ˇˇ˛    ˇˇˇˇˇÚˇÙfÓ˛‹ˇ˜ˇ„˛ˇ˛˝ˇ˝ˇÊˇ˙ˇÊˇ˝ˇˇˇ˘˛Ëˇ˘ˇÌ˛˛˛ˇ¸˛ˇ˛ˇˇ˛ˇˇˇˇˇ˛ˇÒˇÙ\Ôˇ€ˇ˜ˇ‚ˇˇ‹ˇ˙ˇÊˇ˝ˇ˛ˇ˘ˇËˇ˘ˇÌˇ˛ˇˇ¸ˇˇ˛ˇˇˇ˝ˇˇ˛ˇˇÒˇÙX»ˇ˜ˇ‚ˇˇ‹ˇ˙ˇÊˇ˝ˇˇˇ˘ˇËˇ˘ˇÌˇ˛ˇ˛ˇ¸ˇ˛ˇˇˇ˝ˇˇˇ˛ˇÒˇÙH»ˇ˜ˇ·˛ˇ‹ˇ˙ˇÊ˛˝ˇ˛ˇ˘ˇËˇ˘ˇfl˛˛˛ˇˇ˛˙˛ˇ˛ÒˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ»ˇ˜∑ˇ˙∏ˇ˘∏ˇÙ
  1773. »ˇÅŎ
  1774. »ˇÅŎ»ˇ˜∑ˇ˙∏ˇ˘∏ˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ<»ˇ˜ˇπˇ˙ˇÎ˛ˇ˛ˇ˛Ó˛Ïˇ˘ˇ˛ˇ˛ˇÔ˛ˇˇˇËˇÙ3»ˇ˜ˇπˇ˙ˇÎˇ¸ˇˇÓˇÏˇ˘ˇÓˇÍˇÊˇÙ[»ˇ˜ˇπˇ˙ˇÎˇ˝˛ˇˇˇˇˇ˛ˇ˛ˇˇˇÏˇ˘ˇÓˇˇˇ˝ˇˇˇˇˇ˙
  1775. ˇˇˇˇˇˇÙ_»ˇ˜ˇπˇ˙ˇÎˇ˛ˇˇˇˇ˛ˇ˛ ˇˇˇˇˇˇÏˇ˘ˇÓˇ˝ˇ˛ˇ˛ˇ˚ˇˇ˛ˇ˛ˇ˛ˇˇÙU»ˇ˜ˇπˇ˙ˇÎˇ¸ˇˇ˛˛ˇˇˇˇ˛ˇˇÏˇ˘ˇÓˇ˝ˇ˝˛ˇˇˆˇ˛ˇ˛ˇˇÙg»ˇ˜ˇ„˛ˇˇˇ˝ˇˇ‰ˇ˙ˇÎˇ¸ˇˇ˛ˇ˛ˇˇˇˇ˝ˇÏˇ˘ˇÓˇ˝ˇˇˇ˛ˇ¯ˇˇ˛ˇ˛ˇˇÙc»ˇ˜ˇ‰ˇ˘˛ˇ·ˇ˙ˇÎ˛ˇ˛ˇ˛˝ ˇˇ˛ˇˇ˛˛˛Ïˇ˘ˇÓˇˇˇ˝˛ˇˇˇ¯ˇˇ˛ˇˇˇˇÙòÅ<¿Ê;HH˙r∏?IJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  1776. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  1777. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  1778.  
  1779.  
  1780.  ˛êêê¿Ê;]êÉÀ'*»ˇ˜ˇ‰ˇ¯ˇ·ˇ˙ˇ∫ˇ˘ˇÃˇˇÙ*»ˇ˜ˇ„˛ˇ˚ˇ·ˇ˙ˇ∫ˇ˘ˇÃˇˇÙ'»ˇ˜ˇ‰ˇ˘ˇˇ·ˇ˙ˇ∫ˇ˘ˇ∫ˇÙ/»ˇ˜ˇ‰ˇ˝    ˇˇˇˇÂˇ˙ˇ∫ˇ˘ˇ∫ˇÙ0»ˇ˜ˇ„˛ˇˇˇ˝ˇˇ‰ˇ˙ˇ∫ˇ˘ˇÿˇ‰ˇÙ"»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇÿˇ‰ˇÙ;»ˇ˜ˇπˇ˙ˇ„ˇ˛ˇˇˇˇ„ˇ˘ˇ„ˇˇˇ˛ˇˇ‰ˇÙ4»ˇ˜ˇπˇ˙ˇ‰ˇ¸ˇˇˇ‚ˇ˘ˇ‰ˇ¯ˇˇ‰ˇÙ:»ˇ˜ˇπˇ˙ˇ‰ˇ˝ˇ˛ˇ˛‚ˇ˘ˇ‰ˇ˛ˇ˛˝ˇˇ‰ˇÙ9»ˇ˜ˇπˇ˙ˇ‰ˇ˛ˇˇˇˇ‚ˇ˘ˇ‰ˇˇ˚ˇˇ‰ˇÙ8»ˇ˜ˇπˇ˙ˇ„ˇ˛ˇˇˇˇ„ˇ˘ˇ„ˇ˛ˇ¸ˇ‰ˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ»ˇ˜ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙ»˛ˇ˘ˇπˇ˙ˇ∫ˇ˘ˇ∫ˇÙΔˇˇ˙∑ˇ˙∏ˇ˘∏ˇÙÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈ÅÅ≈
  1781. ëÚˇØÚˇ•&ëˇÔ˛Ô˛Ô˛ÔˇØˇ˛‡fl˛‡fl˛‡fl‡ˇ•9ëˇÔÔÔÔÔÔˇ˝˛ˇÛˇ·ˇÊˇÙ‡ˇ˝ˇ˛ˇ¯˘ˇ˛ˇƒPëˇÔ˛Ô˛Ô˛Ôˇ˝ˇˇÙˇ·ˇ¯ˇˇ˛‡fl˛‡fl˛‡fl‡ˇ˝ˇ˛ˇˆˇˇ˛ˇˇˇ≈Ñ롲Ô˛Ô˛ÔÔˇ˝˛ˇˇˇˇˇˇ˛ˇ˛˛˛ˇ˛¸ˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇ˛Ùˇ‡fl˛‡fl˛‡fl˛‡ˇ˝ˇˇ˛ˇ˛˛˛˝ˇˇ¸ˇ˛≈uëˇÔÔÔÔÔÔˇ˝ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇÚˇÙ‡ˇ˝ ˇˇˇˇˇˇˇˇ˛ˇˇ¸˛ˇƒÄ롲Ô˛Ô˛ÔÔˇ˝ˇˇ˛ˇˇˇ˛ˇ
  1782. ˇˇˇˇˇ˛ˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇÛˇ‡fl˛‡fl˛‡fl˛‡ˇ˝
  1783. ˇˇˇˇˇˇˇ¸ˇˇ˛ˇˇ¬ÉëˇÔ˛Ô˛Ô˛Ôˇ˝ˇˇˇ˛ˇˇˇ˛
  1784. ˇˇˇˇˇˇ˛ˇ˚˛ˇ˛ˇ˛ˇ˛ˇ˛ˇˇˇ˛ˇÙˇ˛‡fl˛‡fl˛‡fl‡ˇ˝ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¬tëˇÔÔÔÔÔÔˇ˝˛ˇ˛ˇˇˇ˛
  1785. ˇˇˇˇˇˇ˛ˇˇˇ˚ˇˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇÛˇÙ‡ˇ˝ ˇˇˇˇˇˇ˝ˇ˛ˇˇ¬ëÚˇÊˇÛˇ⁄Úˇ•ÅÁˇÛˇÅÔÅÅ≈ÅÅ≈
  1786. <°d
  1787. ONLNf§
  1788. ùêÉÀ<°d
  1789. ONLNfZ
  1790. .Ê;Ê;(ù꠆憬†ø) °d
  1791. ONLNf≤4
  1792. d
  1793. .°dONLNdixtû+Û
  1794. Figure 1-1°dONLNdiût>)&)  MacTCP protocols and OSI network layers
  1795. °dONLNd8àxì«(ØñGThe TCP/IP protocols shown in Figure 1-1 are described in the following°dONLNdÄñx°ü*    sections.
  1796. °dONLNdä±xæd*-Application, presentation, and session layers
  1797. °dONLNd∏…x‘æ*HServices in the upper-layer protocols such as the File Transfer Protocol°dONLNd◊x‚ *F(FTP), Telnet, and the Simple Mail Transfer Protocol (SMTP) correspond°dONLNdHÂx¡*Ito the application, presentation, and session layers of the OSI model. As°dONLNdíÛx˛Õ*Lindicated in Figure 1-1, such services are typically developer products that°dONLNdflx Ø*Baugment the services of TCP, IP, and the User Data Protocol (UDP).
  1798. (Ÿ<2
  1799. )    Chapter 1)) )/ Introduction Ã:ÃÛˇ†æ†¬°¿/, 128 string def
  1800. °¿5{currentfile , readstring {(,,,,,,,,,,,,,,,,) search
  1801. °¿K{pop pop pop {currentfile read {46 eq {exit} if} {exit} ifelse} loop exit}
  1802. °¿+{pop} ifelse} {pop exit} ifelse} bind loop
  1803. †ø†æ†¬°¿í,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.
  1804. †ø†æ†¬°¿-%%BeginDocument: Adobe Illustrator(TM) 3.2.2
  1805. °¿%!PS-Adobe-3.0 °¿    EPSF-3.0
  1806. °¿'%%Creator: Adobe Illustrator(TM) 3.2.2
  1807. °¿*%%For: (Debbie McDaniel) (Apple Computer)
  1808. °¿$%%CreationDate: (4/13/93) (1:59 PM)
  1809. °¿%%BoundingBox: 134 383 449 613
  1810. °¿%%DocumentProcessColors: Black
  1811. °¿"%%DocumentFonts: Helvetica-Narrow
  1812. °¿%%+ Helvetica-Narrow-Bold
  1813. °¿=%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0
  1814. °¿"%%+ procset Adobe_cmykcolor 1.1 0
  1815. °¿%%+ procset Adobe_cshow 1.1 0
  1816. °¿$%%+ procset Adobe_customcolor 1.0 0
  1817. °¿'%%+ procset Adobe_typography_AI3 1.0 1
  1818. °¿)%%+ procset Adobe_IllustratorA_AI3 1.0 1
  1819. °¿%AI3_ColorUsage: Black&White
  1820. °¿"%AI3_TemplateBox: 306 396 306 396
  1821. °¿%AI3_TileBox: 30 31 582 761
  1822. °¿$%AI3_DocumentPreview: Macintosh_Pic
  1823. °¿%%EndComments
  1824. °¿%%BeginProlog
  1825. †ø†æ†¬°¿1%%BeginResource: procset Adobe_packedarray 2.0 0
  1826. °¿"%%Title: (Packed Array Operators)
  1827. °¿%%Version: 2.0 
  1828. °¿%%CreationDate: (8/2/90) ()
  1829. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  1830. °¿1userdict /Adobe_packedarray 5 dict dup begin put
  1831. °¿/initialize            % - initialize -
  1832. °¿{
  1833. °¿/packedarray where
  1834. °¿    {
  1835. °¿    pop
  1836. °¿    }
  1837. °¿    {
  1838. °¿    Adobe_packedarray begin
  1839. °¿    Adobe_packedarray
  1840. °¿        {
  1841. °¿
  1842.         dup xcheck
  1843. °¿            {
  1844. °¿            bind
  1845. °¿            } if
  1846. °¿        userdict 3 1 roll put
  1847. °¿         } forall
  1848. °¿    end
  1849. °¿
  1850.     } ifelse
  1851. °¿} def
  1852. °¿/terminate            % - terminate -
  1853. °¿{
  1854. °¿} def
  1855. °¿2/packedarray        % arguments count packedarray array
  1856. °¿{
  1857. °¿array astore readonly
  1858. °¿} def
  1859. °¿%/setpacking            % boolean setpacking -
  1860. °¿{
  1861. °¿pop
  1862. °¿} def
  1863. °¿(/currentpacking        % - setpacking boolean
  1864. °¿{
  1865. °¿false
  1866. °¿} def
  1867. °¿currentdict readonly pop end
  1868. °¿%%EndResource
  1869. °¿'Adobe_packedarray /initialize get exec
  1870. °¿/%%BeginResource: procset Adobe_cmykcolor 1.1 0
  1871. °¿ %%Title: (CMYK Color Operators)
  1872. °¿%%Version: 1.1 
  1873. °¿%%CreationDate: (1/23/89) ()
  1874. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  1875. °¿currentpacking true setpacking
  1876. °¿/userdict /Adobe_cmykcolor 4 dict dup begin put
  1877. °¿/initialize            % - initialize -
  1878. °¿{
  1879. °¿/setcmykcolor where
  1880. °¿    {
  1881. °¿    pop
  1882. °¿    }
  1883. °¿    {
  1884. °¿5    userdict /Adobe_cmykcolor_vars 2 dict dup begin put
  1885. °¿    /_setrgbcolor
  1886. °¿        /setrgbcolor load def
  1887. °¿    /_currentrgbcolor
  1888. °¿        /currentrgbcolor load def
  1889. °¿    Adobe_cmykcolor begin
  1890. °¿    Adobe_cmykcolor
  1891. °¿        {
  1892. °¿
  1893.         dup xcheck
  1894. °¿            {
  1895. °¿            bind
  1896. °¿            } if
  1897. °¿
  1898.         pop pop
  1899. °¿         } forall
  1900. °¿    end
  1901. °¿    end
  1902. °¿    Adobe_cmykcolor begin
  1903. °¿
  1904.     } ifelse
  1905. °¿} def
  1906. °¿/terminate            % - terminate -
  1907. °¿{
  1908. °¿currentdict Adobe_cmykcolor eq
  1909. °¿    {
  1910. °¿    end
  1911. °¿    } if
  1912. °¿} def
  1913. °¿:/setcmykcolor        % cyan magenta yellow black setcmykcolor -
  1914. °¿{
  1915. °¿1 sub 4 1 roll
  1916. °¿3
  1917. °¿    {
  1918. °¿    3 index add neg dup 0 lt
  1919. °¿        {
  1920. °¿        pop 0
  1921. °¿        } if
  1922. °¿
  1923.     3 1 roll
  1924. °¿
  1925.     } repeat
  1926. °¿,Adobe_cmykcolor_vars /_setrgbcolor get exec
  1927. °¿pop
  1928. °¿} def 
  1929. °¿A/currentcmykcolor    % - currentcmykcolor cyan magenta yellow black
  1930. °¿{
  1931. °¿0Adobe_cmykcolor_vars /_currentrgbcolor get exec
  1932. °¿3
  1933. °¿    {
  1934. °¿    1 sub neg 3 1 roll
  1935. °¿
  1936.     } repeat
  1937. °¿0
  1938. °¿} def
  1939. °¿currentdict readonly pop end
  1940. °¿ setpacking
  1941. °¿%%EndResource
  1942. °¿+%%BeginResource: procset Adobe_cshow 1.1 0
  1943. °¿%%Title: (cshow Operator)
  1944. °¿%%Version: 1.1 
  1945. °¿%%CreationDate: (1/23/89) ()
  1946. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  1947. °¿currentpacking true setpacking
  1948. °¿+userdict /Adobe_cshow 3 dict dup begin put
  1949. °¿/initialize            % - initialize -
  1950. °¿{
  1951. °¿
  1952. /cshow where
  1953. °¿    {
  1954. °¿    pop
  1955. °¿    }
  1956. °¿    {
  1957. °¿1    userdict /Adobe_cshow_vars 1 dict dup begin put
  1958. °¿    /_cshow        % - _cshow proc
  1959. °¿            {} def
  1960. °¿    Adobe_cshow begin
  1961. °¿
  1962.     Adobe_cshow
  1963. °¿        {
  1964. °¿
  1965.         dup xcheck
  1966. °¿            {
  1967. °¿            bind
  1968. °¿            } if
  1969. °¿        userdict 3 1 roll put
  1970. °¿         } forall
  1971. °¿    end
  1972. °¿    end
  1973. °¿
  1974.     } ifelse
  1975. °¿} def
  1976. °¿/terminate            % - terminate -
  1977. °¿{
  1978. °¿} def
  1979. °¿ /cshow                % proc string cshow -
  1980. °¿{
  1981. °¿exch
  1982. °¿Adobe_cshow_vars
  1983. °¿    exch /_cshow
  1984. °¿
  1985.     exch put
  1986. °¿    {
  1987. °¿'    0 0 Adobe_cshow_vars /_cshow get exec
  1988. °¿
  1989.     } forall
  1990. °¿} def
  1991. °¿currentdict readonly pop end
  1992. °¿ setpacking
  1993. °¿%%EndResource
  1994. °¿1%%BeginResource: procset Adobe_customcolor 1.0 0
  1995. °¿"%%Title: (Custom Color Operators)
  1996. °¿%%Version: 1.0 
  1997. °¿%%CreationDate: (5/9/88) ()
  1998. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  1999. °¿currentpacking true setpacking
  2000. °¿1userdict /Adobe_customcolor 5 dict dup begin put
  2001. °¿/initialize            % - initialize -
  2002. °¿{
  2003. °¿/setcustomcolor where
  2004. °¿    {
  2005. °¿    pop
  2006. °¿    }
  2007. °¿    {
  2008. °¿    Adobe_customcolor begin
  2009. °¿    Adobe_customcolor
  2010. °¿        {
  2011. °¿
  2012.         dup xcheck
  2013. °¿            {
  2014. °¿            bind
  2015. °¿            } if
  2016. °¿
  2017.         pop pop
  2018. °¿         } forall
  2019. °¿    end
  2020. °¿    Adobe_customcolor begin
  2021. °¿
  2022.     } ifelse
  2023. °¿} def
  2024. °¿/terminate            % - terminate -
  2025. °¿{
  2026. °¿!currentdict Adobe_customcolor eq
  2027. °¿    {
  2028. °¿    end
  2029. °¿    } if
  2030. °¿} def
  2031. °¿Q/findcmykcustomcolor    % cyan magenta yellow black name findcmykcustomcolor object
  2032. °¿{
  2033. °¿5 packedarray
  2034. °¿}  def
  2035. °¿0/setcustomcolor        % object tint setcustomcolor -
  2036. °¿{
  2037. °¿exch
  2038. °¿aload pop pop
  2039. °¿4
  2040. °¿    {
  2041. °¿    4 index mul 4 1 roll
  2042. °¿
  2043.     } repeat
  2044. °¿5 -1 roll pop
  2045. °¿
  2046. setcmykcolor
  2047. °¿} def
  2048. °¿(/setoverprint        % boolean setoverprint -
  2049. °¿{
  2050. °¿pop
  2051. °¿} def
  2052. °¿currentdict readonly pop end
  2053. °¿ setpacking
  2054. °¿%%EndResource
  2055. °¿4%%BeginResource: procset Adobe_typography_AI3 1.1 0
  2056. °¿ %%Title: (Typography Operators)
  2057. °¿%%Version: 1.0 
  2058. °¿%%CreationDate:(5/31/90) ()
  2059. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  2060. °¿currentpacking true setpacking
  2061. °¿5userdict /Adobe_typography_AI3 47 dict dup begin put
  2062. °¿/initialize            % - initialize -
  2063. °¿{
  2064. °¿/TZ
  2065. °¿ where
  2066. °¿    {
  2067. °¿    pop
  2068. °¿    }
  2069. °¿    {
  2070. °¿    Adobe_typography_AI3 begin
  2071. °¿    Adobe_typography_AI3
  2072. °¿        {
  2073. °¿
  2074.         dup xcheck
  2075. °¿            {
  2076. °¿            bind
  2077. °¿            } if
  2078. °¿
  2079.         pop pop
  2080. °¿         } forall
  2081. °¿    end
  2082. °¿    Adobe_typography_AI3 begin
  2083. °¿
  2084.     } ifelse
  2085. °¿} def
  2086. °¿/terminate            % - terminate -
  2087. °¿{
  2088. °¿$currentdict Adobe_typography_AI3 eq
  2089. °¿    {
  2090. °¿    end
  2091. °¿    } if
  2092. °¿} def
  2093. °¿b% [ number value stream [ array for encoding modification ] modifyEncoding ==> [ modified array ]
  2094. °¿/modifyEncoding
  2095. °¿{
  2096. °¿    /_tempEncode exch ddef
  2097. °¿    
  2098. °¿$    % pointer for sequential encodings
  2099. °¿    /_pntr 0 ddef
  2100. °¿    
  2101. °¿    {
  2102. °¿        % get bottom object
  2103. °¿        counttomark -1 roll
  2104. °¿        % is it a mark ?
  2105. °¿        dup type dup /marktype eq         
  2106. °¿        {
  2107. °¿
  2108.             % exit
  2109. °¿            pop pop exit
  2110. °¿        }
  2111. °¿        {
  2112. °¿            % ... object ... type ....
  2113. °¿            % insert if a nametype
  2114. °¿            /nametype eq
  2115. °¿            {
  2116. °¿5                % insert the name at _pntr and increment pointer
  2117. °¿B                _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
  2118. °¿                put
  2119. °¿            }
  2120. °¿            {
  2121. °¿#                % reset _pntr if it's a number
  2122. °¿                /_pntr exch ddef                    
  2123. °¿            }
  2124. °¿
  2125.             ifelse
  2126. °¿        }
  2127. °¿            ifelse
  2128. °¿    }
  2129. °¿    loop    
  2130. °¿    
  2131. °¿     % return the modified encoding
  2132. °¿
  2133.     _tempEncode
  2134. °¿}
  2135. °¿def
  2136. °¿9/TE    % Set std platform encoding     % (encoding pairs) TE -
  2137. °¿{
  2138. °¿1    StandardEncoding 256 array copy modifyEncoding 
  2139. °¿    /_nativeEncoding exch def
  2140. °¿} def
  2141. °¿% re-define font
  2142. °¿% expected arguments
  2143. °¿% for 'normal fonts : 
  2144. °¿L% [ /_Helvetica-Bold/Helvetica-Bold direction fontScript defaultEncoding TZ
  2145. °¿%
  2146. °¿5% for cartographic, pictographic, and expert fonts :
  2147. °¿1% [ ... number value stream ... /_Symbol/Symbol 
  2148. °¿*%    direction fontScript defaultEncoding TZ
  2149. °¿*% for blended fonts w/ default encoding :
  2150. °¿-% [ /_AdobeSans_20ULig1XCond-Bold/AdobeSans 
  2151. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  2152. °¿*% for blended fonts w/ special encoding :
  2153. °¿D% [ ... number value stream ... /_AdobeSans_20ULig1XCond/AdobeSans 
  2154. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  2155. °¿/TZ        
  2156. °¿{
  2157. °¿"    % set weight vector (if present)
  2158. °¿=    dup type /arraytype eq {/_wv exch def} {/_wv 0 def} ifelse 
  2159. °¿"    % platform dependent coding flag
  2160. °¿    /_useNativeEncoding exch def
  2161. °¿    % pop fontScript & direction
  2162. °¿        pop pop
  2163. °¿    
  2164. °¿'    % create a new dictionary with length
  2165. °¿+    % equal to original dictionary length + 2
  2166. °¿+    % copy all the key/value pairs except FID
  2167. °¿C    % call makeblended font with the weight values if _wv is an array
  2168. °¿P    findfont _wv type /arraytype eq {_wv makeblendedfont} if dup length 2 add dict
  2169. °¿    
  2170. °¿    begin
  2171. °¿    
  2172. °¿$        % copy all the values but the FID
  2173. °¿        % into the new dictionary
  2174. °¿         mark exch
  2175. °¿        {
  2176. °¿/            1 index /FID ne { def } if cleartomark mark
  2177. °¿        }
  2178. °¿            forall
  2179. °¿        % discard last mark
  2180. °¿        pop
  2181. °¿        
  2182. °¿        % define FontName
  2183. °¿        /FontName exch def
  2184. °¿        
  2185. °¿(        % if no re-encoding stream is present
  2186. °¿1        % then if the base encoding vector of the font
  2187. °¿$        % is the same as StandardEncoding
  2188. °¿/        % and the use platform encoding flag is true
  2189. °¿&        % then install AI platform encoding
  2190. °¿+        % else leave the base encoding in effect
  2191. °¿        counttomark 0 eq
  2192. °¿        {
  2193. °¿            1 _useNativeEncoding eq
  2194. °¿            {
  2195. °¿"                /Encoding _nativeEncoding def
  2196. °¿            }
  2197. °¿            if
  2198. °¿            % clean up
  2199. °¿            cleartomark
  2200. °¿        }
  2201. °¿        {    
  2202. °¿             % custom encoding to be done
  2203. °¿;            % start off with a copy of the font's standard encoding
  2204. °¿"            /Encoding load 256 array copy 
  2205. °¿%            modifyEncoding /Encoding exch def
  2206. °¿        }
  2207. °¿         ifelse        
  2208. °¿        FontName currentdict
  2209. °¿    end
  2210. °¿    
  2211. °¿    % register the new font
  2212. °¿    definefont pop
  2213. °¿}
  2214. °¿def
  2215. °¿% text painting operators
  2216. °¿"/tr                    % string tr ax ay string 
  2217. °¿{
  2218. °¿_ax _ay 3 2 roll
  2219. °¿} def
  2220. °¿2/trj                % string trj cx cy fillchar ax ay string 
  2221. °¿{
  2222. °¿_cx _cy _sp _ax _ay 6 5 roll
  2223. °¿} def
  2224. °¿/a0
  2225. °¿{
  2226. °¿#/Tx    % text                            % textString Tx -
  2227. °¿    {
  2228. °¿    dup 
  2229. °¿    currentpoint 3 2 roll
  2230. °¿        tr _psf
  2231. °¿    newpath moveto
  2232. °¿    tr _ctm _pss
  2233. °¿    } ddef
  2234. °¿*/Tj    % justified text                % textString Tj -
  2235. °¿    {
  2236. °¿    dup
  2237. °¿    currentpoint 3 2 roll
  2238. °¿     trj _pjsf
  2239. °¿    newpath moveto
  2240. °¿    trj _ctm _pjss
  2241. °¿    } ddef
  2242. °¿    
  2243. °¿} def
  2244. °¿/a1
  2245. °¿{
  2246. °¿#/Tx    % text                            % textString Tx -
  2247. °¿    {
  2248. °¿!    dup currentpoint 4 2 roll gsave
  2249. °¿    dup currentpoint 3 2 roll
  2250. °¿        tr _psf
  2251. °¿    newpath moveto
  2252. °¿    tr _ctm _pss
  2253. °¿     grestore 3 1 roll moveto tr sp
  2254. °¿    } ddef
  2255. °¿*/Tj    % justified text                % textString Tj -
  2256. °¿    {
  2257. °¿!    dup currentpoint 4 2 roll gsave
  2258. °¿    dup currentpoint 3 2 roll
  2259. °¿     trj _pjsf
  2260. °¿    newpath moveto
  2261. °¿    trj _ctm _pjss
  2262. °¿     grestore 3 1 roll moveto tr sp
  2263. °¿    } ddef
  2264. °¿    
  2265. °¿} def
  2266. °¿/e0
  2267. °¿{
  2268. °¿#/Tx    % text                            % textString Tx -
  2269. °¿    {
  2270. °¿        tr _psf
  2271. °¿    } ddef
  2272. °¿*/Tj    % justified text                % textString Tj -
  2273. °¿    {
  2274. °¿     trj _pjsf
  2275. °¿    } ddef
  2276. °¿} def
  2277. °¿/e1
  2278. °¿{
  2279. °¿#/Tx    % text                            % textString Tx -
  2280. °¿    {
  2281. °¿"    dup currentpoint 4 2 roll gsave 
  2282. °¿     tr _psf  
  2283. °¿!    grestore 3 1 roll moveto tr sp 
  2284. °¿    } ddef
  2285. °¿*/Tj    % justified text                % textString Tj -
  2286. °¿    {
  2287. °¿"    dup currentpoint 4 2 roll gsave 
  2288. °¿     trj _pjsf
  2289. °¿!    grestore 3 1 roll moveto tr sp 
  2290. °¿    } ddef
  2291. °¿} def
  2292. °¿/i0
  2293. °¿{
  2294. °¿#/Tx    % text                            % textString Tx -
  2295. °¿    {
  2296. °¿    tr sp
  2297. °¿    } ddef
  2298. °¿*/Tj    % justified text                % textString Tj -
  2299. °¿    {
  2300. °¿        trj jsp
  2301. °¿    } ddef
  2302. °¿} def
  2303. °¿/i1
  2304. °¿{
  2305. °¿W N
  2306. °¿} def
  2307. °¿/o0
  2308. °¿{
  2309. °¿#/Tx    % text                            % textString Tx -
  2310. °¿    {
  2311. °¿    tr sw rmoveto
  2312. °¿    } ddef
  2313. °¿*/Tj    % justified text                % textString Tj -
  2314. °¿    {
  2315. °¿    trj swj rmoveto
  2316. °¿    } ddef
  2317. °¿} def
  2318. °¿/r0
  2319. °¿{
  2320. °¿#/Tx    % text                            % textString Tx -
  2321. °¿    {
  2322. °¿    tr _ctm _pss
  2323. °¿    } ddef
  2324. °¿*/Tj    % justified text                % textString Tj -
  2325. °¿    {
  2326. °¿    trj _ctm _pjss
  2327. °¿    } ddef
  2328. °¿} def
  2329. °¿/r1
  2330. °¿{
  2331. °¿#/Tx    % text                            % textString Tx -
  2332. °¿    {
  2333. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  2334. °¿    tr _ctm _pss 
  2335. °¿!    grestore 3 1 roll moveto tr sp 
  2336. °¿    } ddef
  2337. °¿*/Tj    % justified text                % textString Tj -
  2338. °¿    {
  2339. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  2340. °¿    trj _ctm _pjss
  2341. °¿!    grestore 3 1 roll moveto tr sp 
  2342. °¿    } ddef
  2343. °¿} def
  2344. °¿% font operators
  2345. °¿
  2346. % Binding
  2347. °¿&/To    % begin text                     % bindType To -
  2348. °¿{
  2349. °¿    pop _ctm currentmatrix pop
  2350. °¿} def
  2351. °¿/TO    % end text                    % TO -
  2352. °¿{
  2353. °¿    Te _ctm setmatrix newpath
  2354. °¿} def
  2355. °¿
  2356. % Text paths
  2357. °¿6/Tp    % begin text path                % a b c d tx ty startPt Tp -
  2358. °¿{
  2359. °¿$    pop _tm astore pop _ctm setmatrix 
  2360. °¿"    _tDict begin /W {} def /h {} def
  2361. °¿} def
  2362. °¿/TP    % end text path                    % TP -
  2363. °¿{
  2364. °¿    end
  2365. °¿    iTm 0 0 moveto
  2366. °¿} def
  2367. °¿!% Render mode & matrix operators
  2368. °¿&/Tr    % begin render                    % render Tr - 
  2369. °¿{
  2370. °¿/    _render 3 le {currentpoint newpath moveto} if
  2371. °¿/    dup 8 eq {pop 0} {dup 9 eq {pop 1} if} ifelse
  2372. °¿    dup /_render exch ddef
  2373. °¿!    _renderStart exch get load exec
  2374. °¿} def
  2375. °¿K/iTm % internal set text matrix        % - iTm -    (uses _tm as implicit argument)
  2376. °¿{
  2377. °¿8_ctm setmatrix _tm concat 0 _rise translate _hs 1 scale
  2378. °¿} def
  2379. °¿./Tm % set text matrix                % a b c d tx ty Tm -
  2380. °¿{
  2381. °¿_tm astore pop iTm 0 0 moveto
  2382. °¿} def
  2383. °¿+/Td % translate text matrix         % tx ty Td -
  2384. °¿{
  2385. °¿7_mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
  2386. °¿} def
  2387. °¿/Te    % end render                    % - Te -
  2388. °¿{
  2389. °¿W    _render -1 eq {} {_renderEnd _render get dup null ne {load exec} {pop} ifelse} ifelse
  2390. °¿    /_render -1 ddef
  2391. °¿} def
  2392. °¿
  2393. % Attributes
  2394. °¿)/Ta    % set alignment                    % alignment Ta -
  2395. °¿{
  2396. °¿pop
  2397. °¿} def
  2398. °¿3/Tf    % set font name and size        % fontname size Tf -
  2399. °¿{
  2400. °¿dup 1000 div /_fScl exch ddef
  2401. °¿%exch findfont exch scalefont setfont
  2402. °¿} def
  2403. °¿6/Tl    % set leading                    % leading paragraphLeading Tl -
  2404. °¿{
  2405. °¿pop
  2406. °¿ exch _leading astore pop
  2407. °¿} def
  2408. °¿//Tt    % set user tracking                % userTracking Tt -
  2409. °¿{
  2410. °¿pop
  2411. °¿} def
  2412. °¿</TW % set word spacing                % minSpace optSpace maxSpace TW -
  2413. °¿{
  2414. °¿3 npop
  2415. °¿} def
  2416. °¿0/Tw    % set computed word spacing        % wordSpace Tw
  2417. °¿{
  2418. °¿/_cx exch ddef
  2419. °¿} def
  2420. °¿@/TC % set character spacing            % minSpace optSpace maxSpace TC -
  2421. °¿{
  2422. °¿3 npop
  2423. °¿} def
  2424. °¿2/Tc    % set computed char spacing     % charSpace Tc -
  2425. °¿{
  2426. °¿/_ax exch ddef
  2427. °¿} def
  2428. °¿0/Ts % set super/subscripting (rise)    % rise Ts -
  2429. °¿{
  2430. °¿/_rise exch ddef
  2431. °¿
  2432. currentpoint
  2433. °¿iTm
  2434. °¿moveto
  2435. °¿} def
  2436. °¿M/Ti    % set indentation                % firstStartIndent otherStartIndent stopIndent Ti -
  2437. °¿{
  2438. °¿3 npop
  2439. °¿} def
  2440. °¿2/Tz % set horizontal scaling        % scalePercent Tz -
  2441. °¿{
  2442. °¿100 div /_hs exch ddef
  2443. °¿iTm
  2444. °¿} def
  2445. °¿-/TA % set pairwise kerning            % autoKern TA -
  2446. °¿+                                    %    autoKern = 0 -> no pair kerning
  2447. °¿,                                    %             = 1 -> automatic pair kerning
  2448. °¿{
  2449. °¿pop
  2450. °¿} def
  2451. °¿0/Tq % set hanging quotes            % hangingQuotes Tq -
  2452. °¿3                                    %    hangingQuotes     = 0 -> no hanging quotes
  2453. °¿&                                    %                     = 1 -> hanging quotes
  2454. °¿{
  2455. °¿pop
  2456. °¿} def
  2457. °¿% Text Bodies
  2458. °¿/TX {pop} def
  2459. °¿.%/Tx    % non-justified text            % textString Tx -
  2460. °¿+%/Tj    % justified text                % textString Tj -
  2461. °¿+/Tk    % kern                            % autoKern kernValue Tk -
  2462. °¿;                                    %      autoKern = 0 -> manual kern, = 1 -> auto kern
  2463. °¿3                                    %    kernValue = kern value in em/1000 space
  2464. °¿{
  2465. °¿!exch pop _fScl mul neg 0 rmoveto
  2466. °¿} def
  2467. °¿5/TK    % non-printing kern                % autoKern kernValue TK -
  2468. °¿{
  2469. °¿2 npop
  2470. °¿} def
  2471. °¿+/T* % carriage return & line feed    % - T* -
  2472. °¿{
  2473. °¿_leading aload pop neg Td
  2474. °¿} def
  2475. °¿6/T*- % carriage return & negative line feed    % - T*- -
  2476. °¿{
  2477. °¿_leading aload pop Td
  2478. °¿} def
  2479. °¿,/T-    % print a discretionary hyphen    % - T- -
  2480. °¿{
  2481. °¿ _hyphen Tx
  2482. °¿} def
  2483. °¿+/T+    % discretionary hyphen hyphen    % - T+ -
  2484. °¿{} def
  2485. °¿3/TR    % reset pattern matrix             % a b c d tx ty TR -
  2486. °¿{
  2487. °¿_ctm currentmatrix pop     
  2488. °¿_tm astore pop 
  2489. °¿iTm 0 0 moveto 
  2490. °¿} def
  2491. °¿4/TS    % special chars                    % textString justified TS -
  2492. °¿{
  2493. °¿0 eq {Tx} {Tj} ifelse
  2494. °¿} def
  2495. °¿currentdict readonly pop end
  2496. °¿ setpacking
  2497. °¿%%EndResource
  2498. °¿6%%BeginResource: procset Adobe_IllustratorA_AI3 1.0 2
  2499. °¿@%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog)
  2500. °¿%%Version: 1.0 
  2501. °¿%%CreationDate: (7/22/89) ()
  2502. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  2503. °¿currentpacking true setpacking
  2504. °¿7userdict /Adobe_IllustratorA_AI3 61 dict dup begin put
  2505. °¿% initialization
  2506. °¿ /initialize                % - initialize -
  2507. °¿{
  2508. °¿I% 47 vars, but leave slack of 10 entries for custom Postscript fragments
  2509. °¿<userdict /Adobe_IllustratorA_AI3_vars 57 dict dup begin put
  2510. °¿% paint operands
  2511. °¿/_lp /none def
  2512. °¿ /_pf {} def
  2513. °¿ /_ps {} def
  2514. °¿
  2515. /_psf {} def
  2516. °¿
  2517. /_pss {} def
  2518. °¿/_pjsf {} def
  2519. °¿/_pjss {} def
  2520. °¿
  2521. /_pola 0 def
  2522. °¿/_doClip 0 def
  2523. °¿% paint operators
  2524. °¿$/cf    currentflat def    % - cf flatness
  2525. °¿% typography operands
  2526. °¿/_tm matrix def
  2527. °¿5/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def 
  2528. °¿6/_renderEnd [null null null null /i1 /i1 /i1 /i1] def
  2529. °¿/_render -1 def
  2530. °¿
  2531. /_rise 0 def
  2532. °¿]/_ax 0 def            % x character spacing    (_ax, _ay, _cx, _cy follows awidthshow naming convention)
  2533. °¿#/_ay 0 def            % y character spacing
  2534. °¿/_cx 0 def            % x word spacing
  2535. °¿/_cy 0 def            % y word spacing
  2536. °¿/_leading [0 0] def
  2537. °¿/_ctm matrix def
  2538. °¿/_mtx matrix def
  2539. °¿/_sp 16#020 def
  2540. °¿/_hyphen (-) def
  2541. °¿
  2542. /_fScl 0 def
  2543. °¿ /_cnt 0 def
  2544. °¿ /_hs 1 def
  2545. °¿/_nativeEncoding 0 def
  2546. °¿/_useNativeEncoding 0 def
  2547. °¿/_tempEncode 0 def
  2548. °¿
  2549. /_pntr 0 def
  2550. °¿/_tDict 2 dict def
  2551. °¿% typography operators
  2552. °¿ /Tx {} def
  2553. °¿ /Tj {} def
  2554. °¿% compound path operators
  2555. °¿/CRender {} def
  2556. °¿ % printing
  2557. °¿/_AI3_savepage {} def
  2558. °¿% color operands
  2559. °¿/_gf null def
  2560. °¿/_cf 4 array def
  2561. °¿/_if null def
  2562. °¿/_of false def
  2563. °¿ /_fc {} def
  2564. °¿/_gs null def
  2565. °¿/_cs 4 array def
  2566. °¿/_is null def
  2567. °¿/_os false def
  2568. °¿ /_sc {} def
  2569. °¿
  2570. /_i null def
  2571. °¿Adobe_IllustratorA_AI3 begin
  2572. °¿Adobe_IllustratorA_AI3
  2573. °¿    {
  2574. °¿     dup xcheck
  2575. °¿        {
  2576. °¿        bind
  2577. °¿        } if
  2578. °¿        pop pop
  2579. °¿
  2580.     } forall
  2581. °¿end
  2582. °¿end
  2583. °¿Adobe_IllustratorA_AI3 begin
  2584. °¿"Adobe_IllustratorA_AI3_vars begin
  2585. °¿newpath
  2586. °¿} def
  2587. °¿/terminate                % - terminate -
  2588. °¿{
  2589. °¿end
  2590. °¿end
  2591. °¿} def
  2592. °¿% definition operators
  2593. °¿/_                    % - _ null
  2594. °¿    null def
  2595. °¿/ddef                % key value ddef -
  2596. °¿{
  2597. °¿)Adobe_IllustratorA_AI3_vars 3 1 roll put
  2598. °¿} def
  2599. °¿$/xput                % key value literal xput -
  2600. °¿{
  2601. °¿&dup load dup length exch maxlength eq
  2602. °¿    {
  2603. °¿    dup dup load dup
  2604. °¿    length 2 mul dict copy def
  2605. °¿    } if
  2606. °¿load begin def end
  2607. °¿} def
  2608. °¿/npop                % integer npop -
  2609. °¿{
  2610. °¿    {
  2611. °¿    pop
  2612. °¿
  2613.     } repeat
  2614. °¿} def
  2615. °¿% marking operators
  2616. °¿/sw                    % ax ay string sw x y 
  2617. °¿{
  2618. °¿dup length exch stringwidth
  2619. °¿%exch 5 -1 roll 3 index 1 sub mul add
  2620. °¿ 4 1 roll 3 1 roll 1 sub mul add
  2621. °¿} def
  2622. °¿./swj                % cx cy fillchar ax ay string swj x y
  2623. °¿{
  2624. °¿
  2625. dup 4 1 roll
  2626. °¿dup length exch stringwidth 
  2627. °¿%exch 5 -1 roll 3 index 1 sub mul add
  2628. °¿!4 1 roll 3 1 roll 1 sub mul add 
  2629. °¿6 2 roll /_cnt 0 ddef
  2630. °¿3{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop
  2631. °¿Nexch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
  2632. °¿} def
  2633. °¿#/ss                    % ax ay string matrix ss -
  2634. °¿{
  2635. °¿    4 1 roll
  2636. °¿'    {                % matrix ax ay char 0 0 {proc} -
  2637. °¿        2 npop 
  2638. °¿     (0) exch 2 copy 0 exch put pop
  2639. °¿    gsave
  2640. °¿    false charpath currentpoint
  2641. °¿    4 index setmatrix
  2642. °¿    stroke
  2643. °¿
  2644.     grestore
  2645. °¿    moveto
  2646. °¿    2 copy rmoveto
  2647. °¿    } exch cshow
  2648. °¿3 npop
  2649. °¿} def
  2650. °¿3/jss                % cx cy fillchar ax ay string matrix jss -
  2651. °¿{
  2652. °¿    4 1 roll
  2653. °¿9    {                % cx cy fillchar matrix ax ay char 0 0 {proc} -   
  2654. °¿        2 npop 
  2655. °¿    (0) exch 2 copy 0 exch put 
  2656. °¿    gsave
  2657. °¿        _sp eq 
  2658. °¿        {
  2659. °¿5        exch 6 index 6 index 6 index 5 -1 roll widthshow  
  2660. °¿        currentpoint
  2661. °¿        }
  2662. °¿        {
  2663. °¿        false charpath currentpoint
  2664. °¿        4 index setmatrix stroke
  2665. °¿
  2666.         }ifelse
  2667. °¿
  2668.     grestore
  2669. °¿    moveto
  2670. °¿    2 copy rmoveto
  2671. °¿    } exch cshow
  2672. °¿6 npop
  2673. °¿} def
  2674. °¿% path operators
  2675. °¿/sp                    % ax ay string sp -
  2676. °¿{
  2677. °¿    {
  2678. °¿    2 npop (0) exch
  2679. °¿    2 copy 0 exch put pop
  2680. °¿    false charpath
  2681. °¿    2 copy rmoveto
  2682. °¿    } exch cshow
  2683. °¿2 npop
  2684. °¿} def
  2685. °¿-/jsp                    % cx cy fillchar ax ay string jsp -
  2686. °¿{
  2687. °¿0    {                    % cx cy fillchar ax ay char 0 0 {proc} -
  2688. °¿        2 npop 
  2689. °¿    (0) exch 2 copy 0 exch put 
  2690. °¿        _sp eq 
  2691. °¿        {
  2692. °¿5        exch 5 index 5 index 5 index 5 -1 roll widthshow  
  2693. °¿        }
  2694. °¿        {
  2695. °¿        false charpath
  2696. °¿
  2697.         }ifelse
  2698. °¿    2 copy rmoveto
  2699. °¿    } exch cshow
  2700. °¿5 npop
  2701. °¿} def
  2702. °¿% path construction operators
  2703. °¿/pl                % x y pl x y
  2704. °¿{
  2705. °¿
  2706. transform
  2707. °¿0.25 sub round 0.25 add exch
  2708. °¿0.25 sub round 0.25 add exch
  2709. °¿ itransform
  2710. °¿} def
  2711. °¿/setstrokeadjust where
  2712. °¿    {
  2713. °¿    pop true setstrokeadjust
  2714. °¿    /c                % x1 y1 x2 y2 x3 y3 c -
  2715. °¿    {
  2716. °¿        curveto
  2717. °¿    } def
  2718. °¿    /C
  2719. °¿
  2720.     /c load def
  2721. °¿    /v                % x2 y2 x3 y3 v -
  2722. °¿    {
  2723. °¿    currentpoint 6 2 roll curveto
  2724. °¿    } def
  2725. °¿    /V
  2726. °¿
  2727.     /v load def
  2728. °¿    /y                % x1 y1 x2 y2 y -
  2729. °¿    {
  2730. °¿    2 copy curveto
  2731. °¿    } def
  2732. °¿    /Y
  2733. °¿
  2734.     /y load def
  2735. °¿    /l                % x y l -
  2736. °¿    {
  2737. °¿    lineto
  2738. °¿    } def
  2739. °¿    /L
  2740. °¿
  2741.     /l load def
  2742. °¿    /m                % x y m -
  2743. °¿    {
  2744. °¿    moveto
  2745. °¿    } def
  2746. °¿    }
  2747. °¿    {%else
  2748. °¿    /c
  2749. °¿    {
  2750. °¿     pl curveto
  2751. °¿    } def
  2752. °¿    /C
  2753. °¿
  2754.     /c load def
  2755. °¿    /v
  2756. °¿    {
  2757. °¿"    currentpoint 6 2 roll pl curveto
  2758. °¿    } def
  2759. °¿    /V
  2760. °¿
  2761.     /v load def
  2762. °¿    /y
  2763. °¿    {
  2764. °¿    pl 2 copy curveto
  2765. °¿    } def
  2766. °¿    /Y
  2767. °¿
  2768.     /y load def
  2769. °¿    /l
  2770. °¿    {
  2771. °¿     pl lineto
  2772. °¿    } def
  2773. °¿    /L
  2774. °¿
  2775.     /l load def
  2776. °¿    /m
  2777. °¿    {
  2778. °¿     pl moveto
  2779. °¿    } def
  2780. °¿        }ifelse
  2781. °¿% graphic state operators
  2782. °¿/d                    % array phase d -
  2783. °¿{
  2784. °¿setdash
  2785. °¿} def
  2786. °¿/cf    {} def            % - cf flatness
  2787. °¿/i                    % flatness i -
  2788. °¿{
  2789. °¿    dup 0 eq
  2790. °¿    {
  2791. °¿    pop cf
  2792. °¿    } if
  2793. °¿setflat
  2794. °¿} def
  2795. °¿/j                    % linejoin j -
  2796. °¿{
  2797. °¿ setlinejoin
  2798. °¿} def
  2799. °¿/J                    % linecap J -
  2800. °¿{
  2801. °¿ setlinecap
  2802. °¿} def
  2803. °¿/M                    % miterlimit M -
  2804. °¿{
  2805. °¿setmiterlimit
  2806. °¿} def
  2807. °¿/w                    % linewidth w -
  2808. °¿{
  2809. °¿
  2810. setlinewidth
  2811. °¿} def
  2812. °¿% path painting operators
  2813. °¿/H                    % - H -
  2814. °¿{} def
  2815. °¿/h                    % - h -
  2816. °¿{
  2817. °¿
  2818. closepath
  2819. °¿} def
  2820. °¿/N                    % - N -
  2821. °¿{
  2822. °¿ _pola 0 eq 
  2823. °¿    {
  2824. °¿)    _doClip 1 eq {clip /_doClip 0 ddef} if 
  2825. °¿        newpath
  2826. °¿    } 
  2827. °¿    {
  2828. °¿    /CRender {N} ddef
  2829. °¿        }ifelse
  2830. °¿} def
  2831. °¿/n                    % - n -
  2832. °¿{N} def
  2833. °¿/F                    % - F -
  2834. °¿{
  2835. °¿ _pola 0 eq 
  2836. °¿    {
  2837. °¿    _doClip 1 eq 
  2838. °¿        {
  2839. °¿7        gsave _pf grestore clip newpath /_lp /none ddef _fc 
  2840. °¿        /_doClip 0 ddef
  2841. °¿        }
  2842. °¿        {
  2843. °¿        _pf
  2844. °¿
  2845.         }ifelse
  2846. °¿    } 
  2847. °¿    {
  2848. °¿    /CRender {F} ddef
  2849. °¿        }ifelse
  2850. °¿} def
  2851. °¿/f                    % - f -
  2852. °¿{
  2853. °¿
  2854. closepath
  2855. °¿F
  2856. °¿} def
  2857. °¿/S                    % - S -
  2858. °¿{
  2859. °¿ _pola 0 eq 
  2860. °¿    {
  2861. °¿    _doClip 1 eq 
  2862. °¿        {
  2863. °¿7        gsave _ps grestore clip newpath /_lp /none ddef _sc 
  2864. °¿        /_doClip 0 ddef
  2865. °¿        }
  2866. °¿        {
  2867. °¿        _ps
  2868. °¿
  2869.         }ifelse
  2870. °¿    } 
  2871. °¿    {
  2872. °¿    /CRender {S} ddef
  2873. °¿        }ifelse
  2874. °¿} def
  2875. °¿/s                    % - s -
  2876. °¿{
  2877. °¿
  2878. closepath
  2879. °¿S
  2880. °¿} def
  2881. °¿/B                    % - B -
  2882. °¿{
  2883. °¿ _pola 0 eq 
  2884. °¿    {
  2885. °¿"    _doClip 1 eq     % F clears _doClip
  2886. °¿    gsave F grestore 
  2887. °¿        {
  2888. °¿4        gsave S grestore clip newpath /_lp /none ddef _sc
  2889. °¿        /_doClip 0 ddef
  2890. °¿        } 
  2891. °¿        {
  2892. °¿        S
  2893. °¿
  2894.         }ifelse
  2895. °¿    }
  2896. °¿    {
  2897. °¿    /CRender {B} ddef
  2898. °¿        }ifelse
  2899. °¿} def
  2900. °¿/b                    % - b -
  2901. °¿{
  2902. °¿
  2903. closepath
  2904. °¿B
  2905. °¿} def
  2906. °¿/W                    % - W -
  2907. °¿{
  2908. °¿/_doClip 1 ddef
  2909. °¿} def
  2910. °¿/*                    % - [string] * -
  2911. °¿{
  2912. °¿ count 0 ne 
  2913. °¿    {
  2914. °¿#    dup type (stringtype) eq {pop} if
  2915. °¿    } if 
  2916. °¿_pola 0 eq {newpath} if
  2917. °¿} def
  2918. °¿% group operators
  2919. °¿/u                    % - u -
  2920. °¿{} def
  2921. °¿/U                    % - U -
  2922. °¿{} def
  2923. °¿/q                    % - q -
  2924. °¿{
  2925. °¿_pola 0 eq {gsave} if
  2926. °¿} def
  2927. °¿/Q                    % - Q -
  2928. °¿{
  2929. °¿_pola 0 eq {grestore} if
  2930. °¿} def
  2931. °¿/*u                    % - *u -
  2932. °¿{
  2933. °¿_pola 1 add /_pola exch ddef
  2934. °¿} def
  2935. °¿/*U                    % - *U -
  2936. °¿{
  2937. °¿_pola 1 sub /_pola exch ddef 
  2938. °¿_pola 0 eq {CRender} if
  2939. °¿} def
  2940. °¿/D                    % polarized D -
  2941. °¿
  2942. {pop} def
  2943. °¿/*w                    % - *w -
  2944. °¿{} def
  2945. °¿/*W                    % - *W -
  2946. °¿{} def
  2947. °¿% place operators
  2948. °¿+/`                    % matrix llx lly urx ury string ` -
  2949. °¿{
  2950. °¿/_i save ddef
  2951. °¿6 1 roll 4 npop
  2952. °¿ concat pop
  2953. °¿userdict begin
  2954. °¿/showpage {} def
  2955. °¿
  2956. 0 setgray
  2957. °¿
  2958. 0 setlinecap
  2959. °¿1 setlinewidth
  2960. °¿0 setlinejoin
  2961. °¿10 setmiterlimit
  2962. °¿
  2963. [] 0 setdash
  2964. °¿newpath
  2965. °¿
  2966. 0 setgray
  2967. °¿false setoverprint
  2968. °¿} def
  2969. °¿/~                    % - ~ -
  2970. °¿{
  2971. °¿end
  2972. °¿ _i restore
  2973. °¿} def
  2974. °¿% color operators
  2975. °¿/O                    % flag O -
  2976. °¿{
  2977. °¿0 ne
  2978. °¿/_of exch ddef
  2979. °¿/_lp /none ddef
  2980. °¿} def
  2981. °¿/R                    % flag R -
  2982. °¿{
  2983. °¿0 ne
  2984. °¿/_os exch ddef
  2985. °¿/_lp /none ddef
  2986. °¿} def
  2987. °¿/g                    % gray g -
  2988. °¿{
  2989. °¿/_gf exch ddef
  2990. °¿/_fc
  2991. °¿{ 
  2992. °¿
  2993. _lp /fill ne
  2994. °¿    {
  2995. °¿    _of setoverprint
  2996. °¿
  2997.     _gf setgray
  2998. °¿    /_lp /fill ddef
  2999. °¿    } if
  3000. °¿} ddef
  3001. °¿/_pf
  3002. °¿{
  3003. °¿_fc
  3004. °¿fill
  3005. °¿} ddef
  3006. °¿/_psf
  3007. °¿{
  3008. °¿_fc
  3009. °¿ashow
  3010. °¿} ddef
  3011. °¿/_pjsf
  3012. °¿{
  3013. °¿_fc
  3014. °¿ awidthshow
  3015. °¿} ddef
  3016. °¿/_lp /none ddef
  3017. °¿} def
  3018. °¿/G                    % gray G -
  3019. °¿{
  3020. °¿/_gs exch ddef
  3021. °¿/_sc
  3022. °¿{
  3023. °¿_lp /stroke ne
  3024. °¿    {
  3025. °¿    _os setoverprint
  3026. °¿
  3027.     _gs setgray
  3028. °¿    /_lp /stroke ddef
  3029. °¿    } if
  3030. °¿} ddef
  3031. °¿/_ps
  3032. °¿{
  3033. °¿_sc
  3034. °¿stroke
  3035. °¿} ddef
  3036. °¿/_pss
  3037. °¿{
  3038. °¿_sc
  3039. °¿ss
  3040. °¿} ddef
  3041. °¿/_pjss
  3042. °¿{
  3043. °¿_sc
  3044. °¿jss
  3045. °¿} ddef
  3046. °¿/_lp /none ddef
  3047. °¿} def
  3048. °¿'/k                    % cyan magenta yellow black k -
  3049. °¿{
  3050. °¿_cf astore pop
  3051. °¿/_fc
  3052. °¿{
  3053. °¿
  3054. _lp /fill ne
  3055. °¿    {
  3056. °¿    _of setoverprint
  3057. °¿    _cf aload pop setcmykcolor
  3058. °¿    /_lp /fill ddef
  3059. °¿    } if
  3060. °¿} ddef
  3061. °¿/_pf
  3062. °¿{
  3063. °¿_fc
  3064. °¿fill
  3065. °¿} ddef
  3066. °¿/_psf
  3067. °¿{
  3068. °¿_fc
  3069. °¿ashow
  3070. °¿} ddef
  3071. °¿/_pjsf
  3072. °¿{
  3073. °¿_fc
  3074. °¿ awidthshow
  3075. °¿} ddef
  3076. °¿/_lp /none ddef
  3077. °¿} def
  3078. °¿'/K                    % cyan magenta yellow black K -
  3079. °¿{
  3080. °¿_cs astore pop
  3081. °¿/_sc
  3082. °¿{
  3083. °¿_lp /stroke ne
  3084. °¿    {
  3085. °¿    _os setoverprint
  3086. °¿    _cs aload pop setcmykcolor
  3087. °¿    /_lp /stroke ddef
  3088. °¿    } if
  3089. °¿} ddef
  3090. °¿/_ps
  3091. °¿{
  3092. °¿_sc
  3093. °¿stroke
  3094. °¿} ddef
  3095. °¿/_pss
  3096. °¿{
  3097. °¿_sc
  3098. °¿ss
  3099. °¿} ddef
  3100. °¿/_pjss
  3101. °¿{
  3102. °¿_sc
  3103. °¿jss
  3104. °¿} ddef
  3105. °¿/_lp /none ddef
  3106. °¿} def
  3107. °¿1/x                    % cyan magenta yellow black name gray x -
  3108. °¿{
  3109. °¿/_gf exch ddef
  3110. °¿findcmykcustomcolor
  3111. °¿/_if exch ddef
  3112. °¿/_fc
  3113. °¿{ 
  3114. °¿
  3115. _lp /fill ne
  3116. °¿    {
  3117. °¿    _of setoverprint
  3118. °¿#    _if _gf 1 exch sub setcustomcolor
  3119. °¿    /_lp /fill ddef
  3120. °¿    } if
  3121. °¿} ddef
  3122. °¿/_pf
  3123. °¿{
  3124. °¿_fc
  3125. °¿fill
  3126. °¿} ddef
  3127. °¿/_psf
  3128. °¿{
  3129. °¿_fc
  3130. °¿ashow
  3131. °¿} ddef
  3132. °¿/_pjsf
  3133. °¿{
  3134. °¿_fc
  3135. °¿ awidthshow
  3136. °¿} ddef
  3137. °¿/_lp /none ddef
  3138. °¿} def
  3139. °¿1/X                    % cyan magenta yellow black name gray X -
  3140. °¿{
  3141. °¿/_gs exch ddef
  3142. °¿findcmykcustomcolor
  3143. °¿/_is exch ddef
  3144. °¿/_sc
  3145. °¿{
  3146. °¿_lp /stroke ne
  3147. °¿    {
  3148. °¿    _os setoverprint
  3149. °¿#    _is _gs 1 exch sub setcustomcolor
  3150. °¿    /_lp /stroke ddef
  3151. °¿    } if
  3152. °¿} ddef
  3153. °¿/_ps
  3154. °¿{
  3155. °¿_sc
  3156. °¿stroke
  3157. °¿} ddef
  3158. °¿/_pss
  3159. °¿{
  3160. °¿_sc
  3161. °¿ss
  3162. °¿} ddef
  3163. °¿/_pjss
  3164. °¿{
  3165. °¿_sc
  3166. °¿jss
  3167. °¿} ddef
  3168. °¿/_lp /none ddef
  3169. °¿} def
  3170. °¿% locked object operator
  3171. °¿/A                    % value A -
  3172. °¿{
  3173. °¿pop
  3174. °¿} def
  3175. °¿currentdict readonly pop end
  3176. °¿ setpacking
  3177. °¿% annotate page operator
  3178. °¿/annotatepage
  3179. °¿{
  3180. °¿} def
  3181. °¿%%EndResource
  3182. °¿%/showpage{}def
  3183. °¿/copypage{}def
  3184. °¿[134 613 449 383]
  3185. °¿[newpath clippath pathbbox]
  3186. °¿
  3187. 2 dict begin
  3188. °¿ /d exch def
  3189. °¿ /s exch def
  3190. °¿d 0 get d 1 get translate
  3191. °¿,d 2 get d 0 get sub s 2 get s 0 get sub div
  3192. °¿,d 3 get d 1 get sub s 3 get s 1 get sub div
  3193. °¿scale
  3194. °¿"s 0 get neg s 1 get neg translate
  3195. °¿end
  3196. °¿ %%EndProlog
  3197. °¿
  3198. %%BeginSetup
  3199. °¿%Adobe_cmykcolor /initialize get exec
  3200. °¿!Adobe_cshow /initialize get exec
  3201. °¿'Adobe_customcolor /initialize get exec
  3202. °¿*Adobe_typography_AI3 /initialize get exec
  3203. °¿,Adobe_IllustratorA_AI3 /initialize get exec
  3204. °¿[
  3205. °¿M39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
  3206. °¿L/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
  3207. °¿I/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
  3208. °¿F/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
  3209. °¿K/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
  3210. °¿A/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
  3211. °¿:/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
  3212. °¿D/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
  3213. °¿C/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
  3214. °¿J/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe
  3215. °¿F/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
  3216. °¿L/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
  3217. °¿H/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
  3218. °¿D/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
  3219. °¿G/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
  3220. °¿F/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
  3221. °¿/hungarumlaut/ogonek/caron
  3222. °¿TE
  3223. °¿8%AI3_BeginEncoding: _Helvetica-Narrow Helvetica-Narrow
  3224. [°¿G/_Helvetica-Narrow/Helvetica-Narrow 0 0 1 TZ
  3225. %AI3_EndEncoding TrueType
  3226. °¿B%AI3_BeginEncoding: _Helvetica-Narrow-Bold Helvetica-Narrow-Bold
  3227. [°¿Q/_Helvetica-Narrow-Bold/Helvetica-Narrow-Bold 0 0 1 TZ
  3228. %AI3_EndEncoding TrueType
  3229. °¿ %%EndSetup
  3230. °¿0 A
  3231. °¿u
  3232. °¿0 O
  3233. °¿0.4 g
  3234. °¿0 R
  3235. °¿0 G
  3236. °¿0 i°¿ °¿0 J°¿ °¿0 j°¿ °¿0.5 w°¿ °¿10 M°¿ [°¿]0 d°¿
  3237. °¿ %AI3_Note:
  3238. °¿0 D
  3239. °¿444.8712 563.0014 m
  3240. °¿444.8712 592.9706 L
  3241. °¿194.5991 592.9706 L
  3242. °¿194.5991 563.0014 L
  3243. °¿444.8712 563.0014 L
  3244. °¿b
  3245. °¿319.9851 577.486 m
  3246. °¿B
  3247. °¿U
  3248. °¿u
  3249. °¿0.8 g
  3250. °¿444.8712 449.7613 m
  3251. °¿444.8712 592.986 L
  3252. °¿378.5 592.986 L
  3253. °¿378.5 563.0014 L
  3254. °¿194.5991 563.0014 L
  3255. °¿194.5991 449.7613 L
  3256. °¿444.8712 449.7613 L
  3257. °¿b
  3258. °¿319.9851 462.4615 m
  3259. °¿B
  3260. °¿U
  3261. °¿u
  3262. °¿1 g
  3263. °¿256.5237 568.6055 m
  3264. °¿256.5237 586.3665 L
  3265. °¿202.7997 586.3665 L
  3266. °¿202.7997 568.6055 L
  3267. °¿256.5237 568.6055 L
  3268. °¿b
  3269. °¿229.6403 577.486 m
  3270. °¿B
  3271. °¿U
  3272. °¿0 To
  3273. °¿)1.1655 0 0 1.1655 229.6403 574.4334 0 Tp
  3274. °¿TP
  3275. °¿ -5.98 0 Td
  3276. °¿0 Tr
  3277. °¿0 g
  3278. °¿1 w°¿ °¿4 M°¿
  3279. °¿/_Helvetica-Narrow 7.722 Tf
  3280. °¿0 Ts
  3281. °¿100 Tz
  3282. °¿0 Tt
  3283. °¿0 TA
  3284. °¿    0 0 5 TC
  3285. °¿100 100 200 TW
  3286. °¿    0 0 0 Ti
  3287. °¿1 Ta
  3288. °¿0 Tq
  3289. °¿ 9.438 0 Tl
  3290. °¿0 Tc
  3291. °¿0 Tw
  3292. °¿(FTP)°¿ Tx°¿ 
  3293. °¿(\r) TX°¿ 
  3294. °¿TO
  3295. °¿u
  3296. °¿1 g
  3297. °¿0 R
  3298. °¿0 G
  3299. °¿0.5 w°¿ °¿10 M°¿
  3300. °¿315.0493 568.6055 m
  3301. °¿315.0493 586.3665 L
  3302. °¿261.2826 586.3665 L
  3303. °¿261.2826 568.6055 L
  3304. °¿315.0493 568.6055 L
  3305. °¿b
  3306. °¿288.166 577.486 m
  3307. °¿B
  3308. °¿U
  3309. °¿0 To
  3310. °¿(1.1655 0 0 1.1655 288.166 574.4334 0 Tp
  3311. °¿TP
  3312. °¿
  3313. -8.7956 0 Td
  3314. °¿0 Tr
  3315. °¿0 g
  3316. °¿1 w°¿ °¿4 M°¿
  3317. °¿(Telnet)°¿ Tx°¿ 
  3318. °¿(\r) TX°¿ 
  3319. °¿TO
  3320. °¿u
  3321. °¿1 g
  3322. °¿0 R
  3323. °¿0 G
  3324. °¿0.5 w°¿ °¿10 M°¿
  3325. °¿373.5321 568.6055 m
  3326. °¿373.5321 586.3665 L
  3327. °¿319.8083 586.3665 L
  3328. °¿319.8083 568.6055 L
  3329. °¿373.5321 568.6055 L
  3330. °¿b
  3331. °¿346.6917 577.486 m
  3332. °¿B
  3333. °¿U
  3334. °¿0 To
  3335. °¿)1.1655 0 0 1.1655 346.6917 574.4334 0 Tp
  3336. °¿TP
  3337. °¿
  3338. -8.7937 0 Td
  3339. °¿0 Tr
  3340. °¿0 g
  3341. °¿1 w°¿ °¿4 M°¿
  3342. °¿(SMTP)°¿ Tx°¿ 
  3343. °¿(\r) TX°¿ 
  3344. °¿TO
  3345. °¿u
  3346. °¿1 g
  3347. °¿0 R
  3348. °¿0 G
  3349. °¿0.5 w°¿ °¿10 M°¿
  3350. °¿313.3687 540.5124 m
  3351. °¿313.3687 558.2733 L
  3352. °¿202.988 558.2733 L
  3353. °¿202.988 540.5124 L
  3354. °¿313.3687 540.5124 L
  3355. °¿b
  3356. °¿258.1487 549.3928 m
  3357. °¿B
  3358. °¿U
  3359. °¿0 To
  3360. °¿)1.5665 0 0 1.1655 257.8637 546.3402 0 Tp
  3361. °¿TP
  3362. °¿
  3363. -4.7101 0 Td
  3364. °¿0 Tr
  3365. °¿0 g
  3366. °¿1 w°¿ °¿4 M°¿
  3367. °¿ 74.4019 Tz
  3368. °¿(TCP)°¿ Tx°¿ 
  3369. °¿(\r) TX°¿ 
  3370. °¿TO
  3371. °¿u
  3372. °¿1 g
  3373. °¿0 R
  3374. °¿0 G
  3375. °¿0.5 w°¿ °¿10 M°¿
  3376. °¿436.5012 540.5124 m
  3377. °¿436.5012 558.2733 L
  3378. °¿326.1206 558.2733 L
  3379. °¿326.1206 540.5124 L
  3380. °¿436.5012 540.5124 L
  3381. °¿b
  3382. °¿381.3408 549.3928 m
  3383. °¿B
  3384. °¿U
  3385. °¿0 To
  3386. °¿)1.5665 0 0 1.1655 381.6257 546.3402 0 Tp
  3387. °¿TP
  3388. °¿ -4.971 0 Td
  3389. °¿0 Tr
  3390. °¿0 g
  3391. °¿1 w°¿ °¿4 M°¿
  3392. °¿(UDP)°¿ Tx°¿ 
  3393. °¿(\r) TX°¿ 
  3394. °¿TO
  3395. °¿u
  3396. °¿1 g
  3397. °¿0 R
  3398. °¿0 G
  3399. °¿0.5 w°¿ °¿10 M°¿
  3400. °¿436.5012 515.6154 m
  3401. °¿436.5012 533.3762 L
  3402. °¿202.988 533.3762 L
  3403. °¿202.988 515.6154 L
  3404. °¿436.5012 515.6154 L
  3405. °¿b
  3406. °¿319.7447 524.4958 m
  3407. °¿B
  3408. °¿U
  3409. °¿0 To
  3410. °¿)1.5665 0 0 1.1655 319.7447 521.4431 0 Tp
  3411. °¿TP
  3412. °¿
  3413. -2.2253 0 Td
  3414. °¿0 Tr
  3415. °¿0 g
  3416. °¿1 w°¿ °¿4 M°¿
  3417. °¿(IP)°¿ Tx°¿ 
  3418. °¿(\r) TX°¿ 
  3419. °¿TO
  3420. °¿u
  3421. °¿1 g
  3422. °¿0 R
  3423. °¿0 G
  3424. °¿0.5 w°¿ °¿10 M°¿
  3425. °¿275.1983 482.4852 m
  3426. °¿275.1983 494.1929 L
  3427. °¿202.988 494.1929 L
  3428. °¿202.988 482.4852 L
  3429. °¿275.1983 482.4852 L
  3430. °¿b
  3431. °¿239.0644 488.3391 m
  3432. °¿B
  3433. °¿U
  3434. °¿0 To
  3435. °¿)1.5665 0 0 1.1655 239.0644 485.3111 0 Tp
  3436. °¿TP
  3437. °¿
  3438. -6.0223 0 Td
  3439. °¿0 Tr
  3440. °¿0 g
  3441. °¿1 w°¿ °¿4 M°¿
  3442. °¿(ALAP)°¿ Tx°¿ 
  3443. °¿(\r) TX°¿ 
  3444. °¿TO
  3445. °¿u
  3446. °¿1 g
  3447. °¿0 R
  3448. °¿0 G
  3449. °¿0.5 w°¿ °¿10 M°¿
  3450. °¿355.8785 482.4852 m
  3451. °¿355.8785 494.1929 L
  3452. °¿283.6108 494.1929 L
  3453. °¿283.6108 482.4852 L
  3454. °¿355.8785 482.4852 L
  3455. °¿b
  3456. °¿319.7447 488.3391 m
  3457. °¿B
  3458. °¿U
  3459. °¿0 To
  3460. °¿)1.5665 0 0 1.1655 319.7447 485.3111 0 Tp
  3461. °¿TP
  3462. °¿
  3463. -6.0223 0 Td
  3464. °¿0 Tr
  3465. °¿0 g
  3466. °¿1 w°¿ °¿4 M°¿
  3467. °¿(ELAP)°¿ Tx°¿ 
  3468. °¿(\r) TX°¿ 
  3469. °¿TO
  3470. °¿u
  3471. °¿1 g
  3472. °¿0 R
  3473. °¿0 G
  3474. °¿0.5 w°¿ °¿10 M°¿
  3475. °¿436.5012 482.4852 m
  3476. °¿436.5012 494.1929 L
  3477. °¿364.2912 494.1929 L
  3478. °¿364.2912 482.4852 L
  3479. °¿436.5012 482.4852 L
  3480. °¿b
  3481. °¿400.4251 488.3391 m
  3482. °¿B
  3483. °¿U
  3484. °¿0 To
  3485. °¿)1.5665 0 0 1.1655 400.4251 485.3111 0 Tp
  3486. °¿TP
  3487. °¿
  3488. -5.8905 0 Td
  3489. °¿0 Tr
  3490. °¿0 g
  3491. °¿1 w°¿ °¿4 M°¿
  3492. °¿(TLAP)°¿ Tx°¿ 
  3493. °¿(\r) TX°¿ 
  3494. °¿TO
  3495. °¿u
  3496. °¿1 g
  3497. °¿0 R
  3498. °¿0 G
  3499. °¿0.5 w°¿ °¿10 M°¿
  3500. °¿275.1983 456.5002 m
  3501. °¿275.1983 474.261 L
  3502. °¿202.988 474.261 L
  3503. °¿202.988 456.5002 L
  3504. °¿275.1983 456.5002 L
  3505. °¿b
  3506. °¿239.0644 465.3806 m
  3507. °¿B
  3508. °¿U
  3509. °¿0 To
  3510. °¿)1.5665 0 0 1.1655 239.0644 462.3279 0 Tp
  3511. °¿TP
  3512. °¿ -9.847 0 Td
  3513. °¿0 Tr
  3514. °¿0 g
  3515. °¿1 w°¿ °¿4 M°¿
  3516. °¿(LocalT)°¿ Tx°¿ 0 80°¿ Tk°¿ 
  3517. °¿(alk)°¿ Tx°¿ 
  3518. °¿(\r) TX°¿ 
  3519. °¿TO
  3520. °¿u
  3521. °¿1 g
  3522. °¿0 R
  3523. °¿0 G
  3524. °¿0.5 w°¿ °¿10 M°¿
  3525. °¿355.8785 456.5002 m
  3526. °¿355.8785 474.261 L
  3527. °¿283.6108 474.261 L
  3528. °¿283.6108 456.5002 L
  3529. °¿355.8785 456.5002 L
  3530. °¿b
  3531. °¿319.7447 465.3806 m
  3532. °¿B
  3533. °¿U
  3534. °¿0 To
  3535. °¿)1.5665 0 0 1.1655 319.7447 462.3279 0 Tp
  3536. °¿TP
  3537. °¿
  3538. -8.9013 0 Td
  3539. °¿0 Tr
  3540. °¿0 g
  3541. °¿1 w°¿ °¿4 M°¿
  3542. °¿
  3543. (Ethernet)°¿ Tx°¿ 
  3544. °¿(\r) TX°¿ 
  3545. °¿TO
  3546. °¿u
  3547. °¿1 g
  3548. °¿0 R
  3549. °¿0 G
  3550. °¿0.5 w°¿ °¿10 M°¿
  3551. °¿436.5012 456.5002 m
  3552. °¿436.5012 474.261 L
  3553. °¿364.2912 474.261 L
  3554. °¿364.2912 456.5002 L
  3555. °¿436.5012 456.5002 L
  3556. °¿b
  3557. °¿400.4251 465.3806 m
  3558. °¿B
  3559. °¿U
  3560. °¿0 To
  3561. °¿)1.5665 0 0 1.1655 400.4251 462.3279 0 Tp
  3562. °¿TP
  3563. °¿-12.0405 0 Td
  3564. °¿0 Tr
  3565. °¿0 g
  3566. °¿1 w°¿ °¿4 M°¿
  3567. °¿ (Token Ring)°¿ Tx°¿ 
  3568. °¿(\r) TX°¿ 
  3569. °¿TO
  3570. °¿u
  3571. °¿1 g
  3572. °¿0 R
  3573. °¿0 G
  3574. °¿0.5 w°¿ °¿10 M°¿
  3575. °¿436.5012 496.5269 m
  3576. °¿436.5012 508.3534 L
  3577. °¿202.988 508.3534 L
  3578. °¿202.988 496.5269 L
  3579. °¿436.5012 496.5269 L
  3580. °¿b
  3581. °¿319.7447 502.4402 m
  3582. °¿B
  3583. °¿U
  3584. °¿0 To
  3585. °¿)1.5665 0 0 1.1655 319.7447 498.8771 0 Tp
  3586. °¿TP
  3587. °¿-21.8556 0 Td
  3588. °¿0 Tr
  3589. °¿0 g
  3590. °¿1 w°¿ °¿4 M°¿
  3591. °¿(Link Access Protocol)°¿ Tx°¿ 
  3592. °¿(\r) TX°¿ 
  3593. °¿TO
  3594. °¿0 R
  3595. °¿0 G
  3596. °¿10 M°¿
  3597. °¿240.6311 456.5822 m
  3598. °¿240.6311 438.3615 l
  3599. °¿S
  3600. °¿319.7447 456.5822 m
  3601. °¿319.7447 438.3615 l
  3602. °¿S
  3603. °¿400.4251 456.5822 m
  3604. °¿400.4251 438.3615 l
  3605. °¿S
  3606. °¿u
  3607. °¿0 O
  3608. °¿1 g
  3609. °¿0.5 w°¿
  3610. °¿275.1983 433.2045 m
  3611. °¿275.1983 444.9122 L
  3612. °¿202.988 444.9122 L
  3613. °¿202.988 433.2045 L
  3614. °¿275.1983 433.2045 L
  3615. °¿b
  3616. °¿239.0644 439.0584 m
  3617. °¿B
  3618. °¿U
  3619. °¿0 To
  3620. °¿)1.5665 0 0 1.1655 239.0644 435.9476 0 Tp
  3621. °¿TP
  3622. °¿
  3623. -5.7579 0 Td
  3624. °¿0 Tr
  3625. °¿0 g
  3626. °¿1 w°¿ °¿4 M°¿
  3627. °¿(.MPP)°¿ Tx°¿ 
  3628. °¿(\r) TX°¿ 
  3629. °¿TO
  3630. °¿u
  3631. °¿1 g
  3632. °¿0 R
  3633. °¿0 G
  3634. °¿0.5 w°¿ °¿10 M°¿
  3635. °¿355.8785 433.2045 m
  3636. °¿355.8785 444.9122 L
  3637. °¿283.6108 444.9122 L
  3638. °¿283.6108 433.2045 L
  3639. °¿355.8785 433.2045 L
  3640. °¿b
  3641. °¿319.7447 439.0584 m
  3642. °¿B
  3643. °¿U
  3644. °¿0 To
  3645. °¿)1.5665 0 0 1.1655 319.7447 435.9476 0 Tp
  3646. °¿TP
  3647. °¿
  3648. -6.9355 0 Td
  3649. °¿0 Tr
  3650. °¿0 g
  3651. °¿1 w°¿ °¿4 M°¿
  3652. °¿(.ENET)°¿ Tx°¿ 
  3653. °¿(\r) TX°¿ 
  3654. °¿TO
  3655. °¿u
  3656. °¿1 g
  3657. °¿0 R
  3658. °¿0 G
  3659. °¿0.5 w°¿ °¿10 M°¿
  3660. °¿436.5012 433.2045 m
  3661. °¿436.5012 444.9122 L
  3662. °¿364.2912 444.9122 L
  3663. °¿364.2912 433.2045 L
  3664. °¿436.5012 433.2045 L
  3665. °¿b
  3666. °¿400.4251 439.0584 m
  3667. °¿B
  3668. °¿U
  3669. °¿0 To
  3670. °¿)1.5665 0 0 1.1655 400.4251 435.9476 0 Tp
  3671. °¿TP
  3672. °¿-14.3927 0 Td
  3673. °¿0 Tr
  3674. °¿0 g
  3675. °¿1 w°¿ °¿4 M°¿
  3676. °¿(.TOKN driver )°¿ Tx°¿ 
  3677. °¿(\r) TX°¿ 
  3678. °¿TO
  3679. °¿u
  3680. °¿1 g
  3681. °¿0 R
  3682. °¿0 G
  3683. °¿0.5 w°¿ °¿10 M°¿
  3684. °¿275.1983 406.5962 m
  3685. °¿275.1983 430.4769 L
  3686. °¿202.988 430.4769 L
  3687. °¿202.988 406.5962 L
  3688. °¿275.1983 406.5962 L
  3689. °¿b
  3690. °¿239.0644 418.5366 m
  3691. °¿B
  3692. °¿U
  3693. °¿0 To
  3694. °¿)1.5665 0 0 1.1655 239.0644 416.7989 0 Tp
  3695. °¿TP
  3696. °¿ -4.971 0 Td
  3697. °¿0 Tr
  3698. °¿0 g
  3699. °¿1 w°¿ °¿4 M°¿
  3700. °¿(SCC)°¿ Tx°¿ 
  3701. °¿(\r) TX°¿ 
  3702. °¿TO
  3703. °¿u
  3704. °¿1 g
  3705. °¿0 R
  3706. °¿0 G
  3707. °¿0.5 w°¿ °¿10 M°¿
  3708. °¿355.8785 406.5962 m
  3709. °¿355.8785 430.4769 L
  3710. °¿283.6108 430.4769 L
  3711. °¿283.6108 406.5962 L
  3712. °¿355.8785 406.5962 L
  3713. °¿b
  3714. °¿319.7447 418.5366 m
  3715. °¿B
  3716. °¿U
  3717. °¿0 To
  3718. °¿)1.5665 0 0 1.1655 319.7447 421.1697 0 Tp
  3719. °¿TP
  3720. °¿
  3721. -8.9013 0 Td
  3722. °¿0 Tr
  3723. °¿0 g
  3724. °¿1 w°¿ °¿4 M°¿
  3725. °¿
  3726. (Ethernet)°¿ Tx°¿
  3727. °¿(\r) TX°¿ 
  3728. °¿4.3209 -9.438 Td
  3729. °¿(card)°¿ Tx°¿ 
  3730. °¿(\r) TX°¿ 
  3731. °¿TO
  3732. °¿u
  3733. °¿1 g
  3734. °¿0 R
  3735. °¿0 G
  3736. °¿0.5 w°¿ °¿10 M°¿
  3737. °¿436.5012 406.5962 m
  3738. °¿436.5012 430.4769 L
  3739. °¿364.2912 430.4769 L
  3740. °¿364.2912 406.5962 L
  3741. °¿436.5012 406.5962 L
  3742. °¿b
  3743. °¿400.4251 418.5366 m
  3744. °¿B
  3745. °¿U
  3746. °¿0 To
  3747. °¿)1.5665 0 0 1.1655 400.4251 421.1697 0 Tp
  3748. °¿TP
  3749. °¿-12.0405 0 Td
  3750. °¿0 Tr
  3751. °¿0 g
  3752. °¿1 w°¿ °¿4 M°¿
  3753. °¿ (Token Ring)°¿ Tx°¿
  3754. °¿(\r) TX°¿ 
  3755. °¿7.4601 -9.438 Td
  3756. °¿(card)°¿ Tx°¿ 
  3757. °¿(\r) TX°¿ 
  3758. °¿TO
  3759. °¿0 To
  3760. °¿)1.1655 0 0 1.1655 263.9793 387.9291 0 Tp
  3761. °¿TP
  3762. °¿0 Tr
  3763. °¿100 Tz
  3764. °¿0 Ta
  3765. °¿(Developer  products)°¿ Tx°¿ 
  3766. °¿(\r) TX°¿ 
  3767. °¿TO
  3768. °¿u
  3769. °¿1 g
  3770. °¿0 R
  3771. °¿0 G
  3772. °¿0.5 w°¿ °¿10 M°¿
  3773. °¿436.6007 568.6055 m
  3774. °¿436.6007 586.3665 L
  3775. °¿382.834 586.3665 L
  3776. °¿382.834 568.6055 L
  3777. °¿436.6007 568.6055 L
  3778. °¿b
  3779. °¿409.7174 577.486 m
  3780. °¿B
  3781. °¿U
  3782. °¿0 To
  3783. °¿)1.1655 0 0 1.1655 409.7174 574.4334 0 Tp
  3784. °¿TP
  3785. °¿
  3786. -9.1444 0 Td
  3787. °¿0 Tr
  3788. °¿0 g
  3789. °¿1 w°¿ °¿4 M°¿
  3790. °¿1 Ta
  3791. °¿(SNMP)°¿ Tx°¿ 
  3792. °¿(\r) TX°¿ 
  3793. °¿TO
  3794. °¿0 R
  3795. °¿0 G
  3796. °¿0.5 w°¿ [°¿6 °¿2 °¿]0 d°¿
  3797. °¿194.5991 537.0014 m
  3798. °¿444.8712 537.0014 l
  3799. °¿S
  3800. °¿378.5 563.0014 m
  3801. °¿444.8712 563.0014 l
  3802. °¿S
  3803. °¿194.5991 512.0014 m
  3804. °¿444.8712 512.0014 l
  3805. °¿S
  3806. °¿194.5991 477.5014 m
  3807. °¿444.8712 477.5014 l
  3808. °¿S
  3809. °¿0 To
  3810. °¿1 0 0 1 142 586.5 0 Tp
  3811. °¿TP
  3812. °¿0 Tr
  3813. °¿0 O
  3814. °¿0 g
  3815. °¿1 w°¿ [°¿]0 d°¿
  3816. °¿/_Helvetica-Narrow 9 Tf
  3817. °¿0 Ta
  3818. °¿11 0 Tl
  3819. °¿
  3820. (Application)°¿ Tx°¿
  3821. °¿(\r) TX°¿ 
  3822. °¿T*
  3823. °¿(Presentation)°¿ Tx°¿
  3824. °¿(\r) TX°¿ 
  3825. °¿T*
  3826. °¿    (Session)°¿ Tx°¿ 
  3827. °¿(\r) TX°¿ 
  3828. °¿TO
  3829. °¿0 To
  3830. °¿1 0 0 1 142 547.5 0 Tp
  3831. °¿TP
  3832. °¿0 Tr
  3833. °¿ (Transport)°¿ Tx°¿ 
  3834. °¿(\r) TX°¿ 
  3835. °¿TO
  3836. °¿0 To
  3837. °¿1 0 0 1 142 522 0 Tp
  3838. °¿TP
  3839. °¿0 Tr
  3840. °¿    (Network)°¿ Tx°¿ 
  3841. °¿(\r) TX°¿ 
  3842. °¿TO
  3843. °¿0 To
  3844. °¿1 0 0 1 142 492 0 Tp
  3845. °¿TP
  3846. °¿0 Tr
  3847. °¿ (Data Link)°¿ Tx°¿ 
  3848. °¿(\r) TX°¿ 
  3849. °¿TO
  3850. °¿0 To
  3851. °¿1 0 0 1 142 440.5 0 Tp
  3852. °¿TP
  3853. °¿0 Tr
  3854. °¿
  3855. (Physical)°¿ Tx°¿ 
  3856. °¿(\r) TX°¿ 
  3857. °¿TO
  3858. °¿u
  3859. °¿0 R
  3860. °¿0 G
  3861. °¿0.5 w°¿ °¿10 M°¿
  3862. °¿194.5991 563.0014 m
  3863. °¿8192.6681 563.0014 191.1026 564.5669 191.1026 566.4981 C
  3864. °¿191.1026 589.4738 L
  3865. °¿7191.1026 591.405 192.6681 592.9706 194.5991 592.9706 C
  3866. °¿S
  3867. °¿U
  3868. °¿191.1026 578.7142 m
  3869. °¿184.9075 578.7142 l
  3870. °¿S
  3871. °¿u
  3872. °¿194.5991 537.0014 m
  3873. °¿8192.6681 537.0014 191.1026 538.5669 191.1026 540.4981 C
  3874. °¿191.1026 559.5046 L
  3875. °¿8191.1026 561.4358 192.6681 563.0014 194.5991 563.0014 C
  3876. °¿S
  3877. °¿U
  3878. °¿191.1026 549.745 m
  3879. °¿175.505 549.745 l
  3880. °¿S
  3881. °¿u
  3882. °¿194.5991 512.0014 m
  3883. °¿8192.6681 512.0014 191.1026 513.5669 191.1026 515.4981 C
  3884. °¿191.1026 533.5046 L
  3885. °¿8191.1026 535.4358 192.6681 537.0014 194.5991 537.0014 C
  3886. °¿S
  3887. °¿U
  3888. °¿191.1026 524.245 m
  3889. °¿172.505 524.245 l
  3890. °¿S
  3891. °¿u
  3892. °¿194.5991 477.5014 m
  3893. °¿8192.6681 477.5014 191.1026 479.0669 191.1026 480.9981 C
  3894. °¿191.1026 508.5046 L
  3895. °¿8191.1026 510.4358 192.6681 512.0014 194.5991 512.0014 C
  3896. °¿S
  3897. °¿U
  3898. °¿191.1026 494.495 m
  3899. °¿174.505 494.495 l
  3900. °¿S
  3901. °¿u
  3902. °¿194.5991 406.5014 m
  3903. °¿8192.6681 406.5014 191.1026 408.0669 191.1026 409.9981 C
  3904. °¿191.1026 474.0046 L
  3905. °¿8191.1026 475.9358 192.6681 477.5014 194.5991 477.5014 C
  3906. °¿S
  3907. °¿U
  3908. °¿191.1026 442.995 m
  3909. °¿171.505 442.995 l
  3910. °¿S
  3911. °¿u
  3912. °¿0 O
  3913. °¿0.4 g
  3914. °¿ 260 386.5 m
  3915. °¿
  3916. 260 396 L
  3917. °¿
  3918. 246 396 L
  3919. °¿ 246 386.5 L
  3920. °¿ 260 386.5 L
  3921. °¿b
  3922. °¿
  3923. 253 391.25 m
  3924. °¿B
  3925. °¿U
  3926. °¿0 To
  3927. °¿)1.1655 0 0 1.1655 360.9793 387.9291 0 Tp
  3928. °¿TP
  3929. °¿0 Tr
  3930. °¿0 g
  3931. °¿1 w°¿ °¿4 M°¿
  3932. °¿/_Helvetica-Narrow 7.722 Tf
  3933. °¿ 9.438 0 Tl
  3934. °¿(MacTCP)°¿ Tx°¿ 
  3935. °¿(\r) TX°¿ 
  3936. °¿TO
  3937. °¿u
  3938. °¿0.8 g
  3939. °¿0 R
  3940. °¿0 G
  3941. °¿0.5 w°¿ °¿10 M°¿
  3942. °¿ 357 386.5 m
  3943. °¿
  3944. 357 396 L
  3945. °¿
  3946. 343 396 L
  3947. °¿ 343 386.5 L
  3948. °¿ 357 386.5 L
  3949. °¿b
  3950. °¿
  3951. 350 391.25 m
  3952. °¿B
  3953. °¿U
  3954. °¿0 To
  3955. °¿1 0 0 1 142 603.993 0 Tp
  3956. °¿TP
  3957. °¿0 Tr
  3958. °¿0 g
  3959. °¿1 w°¿ °¿4 M°¿
  3960. °¿/_Helvetica-Narrow-Bold 9 Tf
  3961. °¿11 0 Tl
  3962. °¿ (OSI model)°¿ Tx°¿ 
  3963. °¿(\r) TX°¿ 
  3964. °¿TO
  3965. °¿0 To
  3966. °¿1 0 0 1 319.9851 603.993 0 Tp
  3967. °¿TP
  3968. °¿-11.8894 0 Td
  3969. °¿0 Tr
  3970. °¿1 Ta
  3971. °¿(TCP/IP)°¿ Tx°¿ 
  3972. °¿(\r) TX°¿ 
  3973. °¿TO
  3974. °¿%%PageTrailer
  3975. °¿
  3976. %%Trailer
  3977. °¿+Adobe_IllustratorA_AI3 /terminate get exec
  3978. °¿)Adobe_typography_AI3 /terminate get exec
  3979. °¿&Adobe_customcolor /terminate get exec
  3980. °¿ Adobe_cshow /terminate get exec
  3981. °¿$Adobe_cmykcolor /terminate get exec
  3982. °¿&Adobe_packedarray /terminate get exec
  3983. °¿%%EndDocument
  3984. †ø ¨◊#ˇ ˇˇˇˇ#◊ 
  3985. d,N Helvetica Narrow
  3986. .°dONLNdÆ,˚+ÃHTransport layer,Times
  3987. °dONLNd7ÆB*IThe TCP and UDP provide services at the transport layer of the OSI model.
  3988. °dONLNdZQÆ^X*#Transmission Control Protocol (TCP)
  3989. °dONLNd~hÆs˛*HThe Transmission Control Protocol provides reliable transmission of data°dONLNd«vÆÅ˛*Mbetween processes. It ensures that data is delivered error free, without loss°dONLNdÑÆèA* or duplication, and in sequence.°dONLNd6ôƧ*JUpper-layer protocols such as Telnet pass data to TCP for delivery to peer°dONLNdÅ߯≤    *Jprocesses. TCP encapsulates the data into segments and passes the segments°dONLNdõƿ¸*Hto IP, which puts the segments into datagrams and passes them across the°dONLNd√ÆŒ¯*Hinternet. TCP at the receiving end checks for errors, acknowledges error°dONLNd]√¯Œ¸(Í-°dONLNd^—Æ‹¯(¯ÃGfree segments, and reassembles the segments for delivery to upper-layer°dONLNd¶flÆÍ*Lprotocols. If a segment is lost or damaged, it will not be acknowledged, and°dONLNdÛÌÆ¯O*$the sending process will retransmit.°dONLNdÆ
  3990. ˚*FTCP has a flow control mechanism so that computers of different speeds°dONLNd_ÆÈ*Aand sizes can communicate. When TCP at the receiving end sends an°dONLNd°Æ)ˇ*Iacknowledgment, it also advertises how much data it is prepared to accept°dONLNdÎ,Æ7!*on the next transmission.
  3991. °dONLNdFÆS<*User Datagram Protocol (UDP)
  3992. °dONLNd"]ÆhÔ*BThe User Datagram Protocol specifies how application programs send°dONLNdekÆv*Hdatagrams to other application programs and defines the use of UDP ports°dONLNdÆyÆÑfi*@to distinguish among multiple processes in a single machine. UDP°dONLNdÔáÆíÆ*7messages are encapsulated in IP datagrams for delivery.°dONLNd(úÆßÚ*GUDP data transmission does not provide reliability. It does not provide°dONLNdp™Æµı*Gerror checking, it does not acknowledge that data has been successfully°dONLNd∏∏Æ√ˇ*Freceived, and it does not order incoming messages. UDP messages can be°dONLNdˇΔÆ—y*.lost or duplicated or can arrive out of order.°dONLNd.€ÆÊ*JThe advantage of UDP is that the overhead associated with establishing and°dONLNdyÈÆÙ˙*Gmaintaining an error-free TCP session is avoided. Upper-layer protocols°dONLNd¡˜Æı*Jthat don’t require reliability use UDP to transmit data. For instance, the°dONLNd Æ*Ldomain name system uses UDP because reliability is not critical; if there is°dONLNdYÆÌ*Dno response to a domain name query, the resolver simply retransmits.+ÁüArchitectural overview
  3993. )o3 ÃpÃ)ˇ&◊#ˇ ˇˇˇˇ#◊ 
  3994. d,N Helvetica Narrow
  3995. .°dONLNdx,Ω+ñH
  3996. Network layer,Times
  3997. °dONLNd7xB—*LThe Internet Protocol (IP) provides services at the network layer of the OSI°dONLNd[ExP∏*Fmodel. IP is responsible for sending data across multiple networks. IP°dONLNd¢Sx^π*Daccepts segments of data from TCP or UDP, places the data in packets°dONLNdÁaxl‘*Lcalled datagrams, and determines the correct path for the datagrams to take.°dONLNd4oxz∞*CDatagrams are sent across the internet, through as many gateways as°dONLNdx}xàE*.needed, until they reach the destination host.°dONLNdßíxù‘*IIP provides an addressing mechanism that allows routing between networks.°dONLNdÒ†x´ª*EThe header of an IP datagram contains source and destination internet°dONLNd7ÆxπÃ*Laddresses so that any host in a network can route a packet to a destination,°dONLNdѺx« *%either directly or through a gateway.°dONLNd™—x‹∞*GIP has the ability to fragment a datagram as it is transmitted across a°dONLNdÚflxͱ*Bnetwork. Since IP can be used with many different physical network°dONLNd5Ìx¯≥*Fimplementations that specify different sizes for physical data frames,°dONLNd|˚xÃ*Idatagrams can be fragmented to fit into a small data frame. Fragments are°dONLNdΔ    xD*.reassembled as they arrive at the destination.°dONLNdˆx)»*KIP is often referred to as an unreliable delivery system because it makes a°dONLNdB,x7…*Lbest-effort attempt to deliver all datagrams, but delivery is not guaranteed°dONLNdè:xE“*M(TCP guarantees delivery). It is also called a connectionless delivery system°dONLNd›HxS—*Jbecause it routes each datagram separately. When IP receives a sequence of°dONLNd(Vxa∏*Bdatagrams from TCP or UDP, it routes each datagram in the sequence°dONLNdkdxoº*Gindividually, and each datagram may travel over a different path to the°dONLNd≥rx}≠* destination.
  3998. °dONLNd¿çxö¡*Data link layer
  3999. °dONLNd–•x∞æ*
  4000. The AppleTalk°dONLNd›•æ∞¡)F °dONLNdfi•¡∞ƒ)4Link Access Protocol (ALAP) and Ethernet Link Access°dONLNd≥xæ…(⁄ñIProtocol (ELAP) provide services at the data link layer of the OSI model.°dONLNd]¡xÃ∏*AALAP and ELAP provide best-effort delivery of information between°dONLNdüœx⁄º*Fdevices. They provide the basic service of packet transmission between°dONLNdÊ›xËQ*/devices connected to a single physical network.°dONLNdÚx˝Æ*CThe MacTCP driver allows for the addition of other data link layers°dONLNdZx  *Kthrough the use of a link layer interface between the IP layer and the data°dONLNd¶xs*8link layer. This interface is described in the document °dONLNdfis»)˚Building Alternate°dONLNdÒx'=(Cñ'Link Access Protocol Modules for MacTCP°dONLNd='“)≈  available in the Developer’s CD°dONLNd9*x5<(Qñ(Series from the Apple Developer’s Group.
  4001. °dONLNdbExRø*Physical layer
  4002. °dONLNdq]xhÕ*HThe MacTCP driver operates networks in which the physical layer uses the°dONLNd∫kxvê*;LocalTalk cable system or the Ethernet networking standard.
  4003. (Ÿ<4
  4004. )    Chapter 1)) )/ Introduction Ã:ÃÛˇÓ◊#ˇ ˇˇˇˇ#◊ 
  4005. d,N Helvetica Narrow
  4006. 0.°dONLNd*TZj+rn2
  4007. °dONLNdAÆTM)ZThe MacTCP Driver,Times
  4008. °dONLNd™Æµ’*c=The MacTCP driver is a Macintosh Operating System driver that°dONLNdR∏Æ√*Himplements the Internet Protocol (IP), User Datagram Protocol (UDP), and°dONLNdõΔÆ—ˇ*FTransmission Control Protocol (TCP). A part of the Macintosh Operating°dONLNd‚‘Æfl˜*BSystem called the Device Manager coordinates communication between°dONLNd%‚ÆÌV*#applications and the MacTCP driver.°dONLNdI˜ÆÛ*DThe MacTCP driver resides in the Macintosh System Folder. At startup°dONLNd鯉*Dtime, the MacTCP driver registers itself with the Device Manager as ,
  4009. Courier
  4010.     °dONLNd“‰˝(,.IPP.
  4011. °dONLNdÿ!Æ,(HÃHThe MacTCP driver supports the following low-level Device Manager calls:, p    AppleIconp
  4012. °dONLNd!5Æ=≥*n
  4013. °dONLNd#3ª>·)
  4014. PBOpenp
  4015. °dONLNd*GÆO≥(lÃn
  4016. °dONLNd,EªPÎ)
  4017.     PBControlp
  4018. °dONLNd6YÆa≥(~Ãn
  4019. °dONLNd8Wªb·)
  4020. PBClose ÃpÃ)ˇ
  4021. Ç◊#ˇ ˇˇˇˇ#◊ 
  4022. d,N Helvetica Narrow
  4023. .°dONLNd-t+<IThe PBOpen call,Times
  4024. °dONLNd8xCÃ+ZGBefore the application can exchange information with the MacTCP driver,°dONLNdXFxQ«*Ethe driver must be opened using the Device Manager PBOpen call, which°dONLNdûTx_»*Jopens the driver and returns its reference number. All subsequent calls to°dONLNdÈbxm!*%the driver use this reference number.°dONLNdwxÇΔ*EThe MacTCP driver uses the INIT-31 mechanism to automatically install°dONLNdUÖxê…*Mitself in the device table and load itself into the system heap each time the°dONLNd£ìxû∞*Fmachine is restarted. At load time, all internal buffers needed by the°dONLNdͰx¨¡*FMacTCP driver are also allocated on the system heap. These buffers are°dONLNd1Øx∫ü*=used (among other things) to hold incoming fragments awaiting°dONLNdoΩx»Œ*Ereassembly and outgoing fragments following fragmentation. The amount°dONLNdµÀx÷´*Aof buffer space allocated is based on the amount of memory in the°dONLNd˜Ÿx‰¢*machine.°dONLNdÓx˘ƒ*FThe MacTCP driver performs its initialization sequence at PBOpen time.°dONLNdG¸x *LThe initialization sequence includes initializing the local network handler,°dONLNdî
  4025. x∂*Isetting its local address and subnet mask, verifying that this address is°dONLNdfix#«*Greasonable and unused, and starting up the internal TCP/IP/UDP protocol°dONLNd&&x1Δ*Hmachinery. PBOpen returns with an error code if any step in this process°dONLNdo4x?Δ*Lfails. In almost all cases, if PBOpen fails, the driver must be reconfigured°dONLNdºBxM–*Jand the system then restarted to clear the problem. Very few circumstances°dONLNdPx[n*5exist where transitory problems cause PBOpen to fail.°dONLNd=exp–*HUse the reference number returned from the PBOpen call in all subsequent°dONLNdÜsx~Ä*=PBControl calls to this drive. Also assign this value to the ,
  4026. Courier
  4027. °dONLNd√rÄ~∂(öû    ioCRefNum
  4028. °dONLNdÃs∂~—)6 field.°dONLNd‘àxìÀ(ØñGBecause of the complexity of initializing the MacTCP driver, PBOpen can°dONLNdñx°±*Creturn errors from many parts of the system, including the Resource°dONLNd`§xØ¿*BManager, Device Manager, File Manager, Slot Manager, and AppleTalk°dONLNd£≤xΩñ*driver.
  4029. (Ÿ<6
  4030. )Chapter 2 / The MacTCP Driver Ã:ÃÛˇ
  4031. Ë◊#ˇ ˇˇˇˇ#◊ 
  4032. d,N Helvetica Narrow
  4033. .°dONLNdT-¥+rIThe PBControl call,Times
  4034. °dONLNd8ÆCÎ+ZBThe Device Manager PBControl call sends control information in the°dONLNdVFÆQf*(following parameter block to the driver:,
  4035. Courier
  4036. °dONLNdWÆc *struct CntrlParam {°dONLNdîeÃqD+struct QElem *qLink;°dONLNd™sÃ* short qType;°dONLNd∏ÅÃç*
  4037. short ioTrap;°dONLNd«èÃõ *Ptr ioCmdAddr;°dONLNd◊ùéJ*ProcPtr ioCompletion;°dONLNdÓ´Ã∑&*OSErr ioResult;°dONLNdˇπÃ≈,*char *ioNamePtr;°dONLNd«Ã”,*short ioVRefNum;°dONLNd#’÷,*short ioCRefNum;°dONLNd5„ÃÔ*
  4038. short csCode;°dONLNdDÒÃ˝8*short csParam[11];°dONLNdWˇÆ ¥('Ã}
  4039. °dONLNdYÆ *In this parameter block 
  4040. °dONLNdq @)ncsCode
  4041. °dONLNdw@ )$, specifies the type of information sent. The°dONLNd§#Æ.‚(JÃ>MacTCP driver decides what to do based on the procedure number°dONLNd„1Æ<È*
  4042. specified by 
  4043. °dONLNd0È<
  4044. );csCode
  4045. °dONLNdˆ1
  4046. <À)$( (the Appendix lists procedure numbers).°dONLNdFÆQ¸(mÃDAll UDP and TCP routines documented in this guide are implemented as°dONLNddTÆ_€*>Device Manager Control calls. All MacTCP routines support both°dONLNd£bÆmd*#synchronous and asynchronous modes.°dONLNd«wÆÇ
  4047. *OIf a synchronous call is made, the application can’t continue until the call is°dONLNdÖÆê˝*Jcompleted. When control is returned to the application, the result code in°dONLNdbìÆûÎ*Ithe parameter block is set indicating the success or failure of the call.°dONLNd≠®Æ≥
  4048. *OIf the call is asynchronous, the I/O request is placed on the driver I/O queue,°dONLNd˝∂Æ¡˛*Hand control is returned to the calling program almost immediately. While°dONLNdFƒÆœ˝*Irequests are taken from the driver I/O queue one at a time and processed,°dONLNdê“Æ›*Lthe application is free to perform other tasks. The application has two ways°dONLNd›‡ÆÎÉ*,of knowing when the call has been completed:, p    AppleIconp
  4049. °dONLNd
  4050. ÙÆ¸≥*n
  4051. °dONLNd Úª˝)
  4052. By polling the 
  4053. °dONLNdÒ˝0)EioResult
  4054. °dONLNd#Ú0˝)0. field in the parameter block. When this value°dONLNdRª ˝('Ÿ
  4055. changes from 
  4056. °dONLNd_ˇ˝ 9)B
  4057. InProgress
  4058. °dONLNdi9 Á)<' to some other value, the call has been°dONLNdëªÓ(5Ÿ
  4059. completed.p
  4060. °dONLNdú"Æ*≥(GÃn
  4061. °dONLNdû ª+)
  4062. GBy specifying an I/O completion routine to be called when the requested°dONLNdÊ.ª9!*operation is complete.°dONLNd˝CÆN√(jÃThe 
  4063. °dONLNdB√N ) ioCompletion
  4064. °dONLNd
  4065. C N˜)H5 field in the parameter block contains a pointer to a°dONLNdCQÆ\(xÃIcompletion routine to be executed at the end of an asynchronous call. The
  4066. °dONLNdç^Æjˆ* ioCompletion
  4067. °dONLNdô_ˆj‰)H3 field should be NIL for asynchronous calls with no°dONLNdÕmÆxÛ(îÃFcompletion routine and is automatically set to NIL for all synchronous°dONLNd{ÆÜ≈*calls.
  4068. +˝7The PBControl call
  4069. )Y7 ÃpÃ)ˇ Œ◊#ˇ ˇˇˇˇ#◊ 
  4070. d,Times
  4071. .°dONLNd!x,“+ñHThe driver uses the ,
  4072. Courier
  4073. °dONLNd “,)Z    ioNamePtr
  4074. °dONLNd!,)6 and 
  4075. °dONLNd" ,U)    ioVRefNum
  4076. °dONLNd+!U,£)6 fields internally.°dONLNd?6xA…(]ñFEach routine description includes a parameter block format. The number°dONLNdÜDxOÀ*Mnext to each field name indicates the byte offset of the field from the start°dONLNd‘Rx]–*Hof the parameter block pointed to by A0. An arrow next to each parameter°dONLNd`xkø*Hname indicates whether it’s an input, output, or input/output parameter:°dONLNdfxxÉî*Arrow°dONLNdlx“ɸ)ZMeaning,    Symbol°dONLNdtåxòÉ(¥ñưdONLNdvç“òo)Z#Parameter is passed to the routine.°dONLNdö°x≠É(…ñ¨°dONLNdú¢“≠{)Z%Parameter is returned by the routine.°dONLNd¬∂x¬É(fiñ´°dONLNdƒ∑“¬º)Z3Parameter is passed to and returned by the routine.°dONLNd¯”xfi∫(˙ñFAll Device Manager Control calls return an integer result code of type
  4077. °dONLNd?‡xÏñ*OSErr
  4078. °dONLNdD·ñÏ∂) in the 
  4079. °dONLNdL‡∂ÏÊ) ioResult
  4080. °dONLNdT·ÊϺ)0/ field of the I/O parameter block. Each routine°dONLNdÑÔx˙—(ñLdescription lists all of the applicable result codes generated by the MacTCP°dONLNd—˝xÆ*Edriver, along with a short description of what the result code means.,N Helvetica Narrow
  4081. °dONLNd#1u(M<The PBClose call
  4082. °dONLNd(<xG∫+ZEThe application should not issue a PBClose call to the MacTCP driver.°dONLNdnJxU©*CBecause the driver can be shared by a variety of applications, once°dONLNd≤Xxc»*Minitialized, it never stops operation until the machine is restarted. PBClose°dONLNdfxq£*
  4083. returns a 
  4084. °dONLNd
  4085. e£q”)+closeErr
  4086. °dONLNdf”q    )0  error code.
  4087. °dONLNdåöp(∂<The Gestalt call
  4088. °dONLNd1•x∞…+ZIThe Gestalt call is used to obtain MacTCP driver version information (see°dONLNd{≥xæ@**the chapter “Compatibility Guidelines” in °dONLNd•≥@æè)»Inside Macintosh°dONLNdµ≥èæœ)O
  4089. , Volume VI).°dONLNd√¡xë(ËñHTo make the Gestalt call, use the mtcp selector. If you are using MacTCP°dONLNd œx⁄∂*Idriver version 1.1, a value of 1 is returned in the response field of the°dONLNdV›xË≈*MGestalt call. If yu are using version 1.1.1, a value of 2 is returned. If you°dONLNd§Îxˆƒ*Lare using version 2.0, a value of 3 is returned. A value of 0 is returned if°dONLNdÒ˘xË*the driver is not opened.
  4090. (Ÿ<8
  4091. )Chapter 2 / The MacTCP Driver Ã:ÃÛˇ
  4092. l◊#ˇ ˇˇˇˇ#◊ 
  4093. d,N Helvetica Narrow
  4094. .°dONLNdT-ƒ+rIImplementation notes,Times
  4095. °dONLNd8ÆCÈ+ZDThis section describes internal algorithms and decisions made by the°dONLNdZFÆQ˜*MacTCP driver.
  4096. °dONLNdiaÆnN*Fragmentation and reassembly
  4097. °dONLNdÜyÆÑ*NThe Internet Protocol (IP) has the ability to fragment a packet so that it can°dONLNd’áÆíˇ*Fbe sent across a network with a small maximum transfer unit (MTU). The°dONLNdïÆ†È*Ffragments are reassembled as they arrive at the destination. Since the°dONLNdc£ÆÆ*Happlication developer must select the size of UDP datagrams (unlike TCP,°dONLNd¨±ÆºÔ*Dwhich negotiates packet size), you should be aware of implementation°dONLNdÒøÆ ò*3limitations imposed on the size of these datagrams.°dONLNd%‘ÆflÛ*DThe MacTCP driver internally allocates a memory buffer in the system°dONLNdj‚ÆÌ*Iheap to temporarily hold all incoming fragments waiting to be reassembled°dONLNd¥Æ˚Â*Band all outgoing fragments waiting to be sent. The amount of space°dONLNd˜˛Æ    Á*Ballocated varies depending on whether 1, 2, or 4 megabytes (MB) of°dONLNd: Æ*Ememory are installed. The maximum size of the packet being fragmented°dONLNdÄÆ%¯*Ior reassembled depends solely on the available free space in this buffer.°dONLNd (Æ3*HBecause the memory pool is shared by all MacTCP users, the allowance for°dONLNd6ÆAÿ*=the maximum size of a UDPWrite packet will vary, depending on°dONLNdQDÆO˜*Bcompeting demands on the memory pool. A given destination can only°dONLNdîRÆ]˙*Hguarantee the reassembly of a packet that is 576 bytes (including IP and°dONLNd›`Æk˛*HUDP headers); therefore, it is possible to send a packet from the MacTCP°dONLNd&nÆy∂*:driver that cannot be reassembled by the destination host.
  4098. °dONLNdaâÆñÿ*Routing
  4099. °dONLNdi°Æ¨Ù*BThe MacTCP driver supports routing through the Routing Information°dONLNd¨ØÆ∫‚*DProtocol (RIP) and internally listens to RIP broadcasts. Because the°dONLNdÒΩÆ»¸*JMacTCP driver internally listens to RIP broadcasts, an attempt to create a°dONLNd<ÀÆ÷Ã*=UDP stream on local port 520 returns a duplicateSocket error.°dONLNdz‡ÆÎ *<A default gateway can be configured using the Control Panel.
  4100. +ˆ“Implementation notes
  4101. )`9 ÃpÃ)ˇ◊#ˇ ˇˇˇˇ#◊ 
  4102. d,N Helvetica Narrow
  4103. 0.°dONLNd*TZj+rn3
  4104. °dONLNdAÆTm)ZUser Datagram Protocol,Times
  4105. °dONLNd™Æµ˚*cDThe User Datagram Protocol (UDP) provides a low-overhead transaction°dONLNd^∏Æ√Ì*Dservice to allow upper-layer protocols to send datagrams between one°dONLNd£ΔÆ—*Lanother. UDP is datagram oriented with best-effort delivery, but it does not°dONLNd‘Æflÿ*>use acknowledgments to make sure messages are delivered to the°dONLNd/‚ÆÌÍ*Cdestination, does not order incoming messages, and does not provide°dONLNdsÆ˚*Ifeedback to control the rate at which information flows between machines.°dONLNdΩÆÚ*ELike the Transmission Control Protocol (TCP), UDP uses port fields to°dONLNdÆÊ*Dspecify the source and destination processes of each transaction. An°dONLNdH!Æ,?*optional checksum is also used. ÃpÃ)ˇ2◊#ˇ ˇˇˇˇ#◊ 
  4106. d,N Helvetica Narrow
  4107. .°dONLNd-s+<IData structures,Times
  4108. °dONLNd8xCµ+ZAThe UDP packet is composed of an 8-byte header, followed by up to°dONLNdRFxQ©*A65,507 bytes of data. The UDP header has the following structure:°dONLNdî[xf~*0°dONLNdñ[“fÈ)Zword°dONLNdõ[,f`)Z source port°dONLNdßpx{~(óñ2°dONLNd©p“{È)Zword°dONLNdÆp,{t)Zdestination port°dONLNdøÖxê~(¨ñ4°dONLNd¡Ö“êÈ)Zword°dONLNdΔÖ,êI)Zlength°dONLNdÕöx•~(¡ñ6°dONLNdœö“•È)Zword°dONLNd‘ö,•Z)Zchecksum°dONLNd›Øx∫~(÷ñ8°dONLNdflØ“∫ˆ)Zvariable°dONLNdËØ,∫?)Zdata
  4109. °dONLNdÌ x◊Ê(ÛñWrite Data Structures
  4110. °dONLNd‚xÌ *ETo send a UDP datagram, you must format a Write Data Structure (WDS),°dONLNdIx˚”*Kwhich has the format shown in Figure 3-1. A WDS specifies a list of buffers°dONLNdï˛x    ˛*to write in a single operation.°dONLNdµx“*KThe simplest WDS describes a single buffer and is 8 bytes in length: a word°dONLNd!x,∏*Elength, a long pointer, followed by a terminating word of 0. The most°dONLNdG/x:‘*Gcomplex WDS that can be used to send a UDP datagram describes 6 buffers°dONLNdè=xHÏ*and is 38 bytes in length.
  4111. 4wêxë°d
  4112. ONLNf‰
  4113. xë<ò@p@pxë∏ÛÛÛ˚b ˚˚í˚˚ì-ĸ˚b™˚˚í©˚˚í®Ä¸˚c'˚ÛÛÛıˇıˇıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ò@Äp@Äp∏ë¯ıˇ¿ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿òĆpĆp¯ëıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ˆˇ¿ˆˇ¿ÛÛÛÛòÄp@pHH∫4ÿ)©Ä˛ˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  4114. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  4115. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  4116.  
  4117.  
  4118.  ˛êêê@pxë∏'ëëë–ˇˇ˛ˇ˛ˇÃ—ˇˇˇ¸ˇŒ—ˇ˛ˇ˛ˇˇˇ˛ˇ“–ˇˇ˛ˇˇˇˇˇ–—ˇˇˇˇˇˇˇ—— ˇˇˇˇˇˇ˛ˇ“–ˇˇ˛ˇˇˇ˛ˇ—ëëë˙†ˇ˘
  4119. ˙ˇ¢ˇ˘
  4120. ˙ˇ¢˛ˇ˚
  4121. ˙ˇ¢˛ˇ˚
  4122. ˙ˇ¢˛ˇ˚%˙ˇˇÚˇˆˇ˛ˇˇˆˇ˘ˇˇÏ˛ˇ˚*˙ˇˇÙˇˇ˜ˇ˛ˇ¯ˇ˛ˇ˙ˇˇÎ˛ˇ˚I˙ˇ˛ˇˇˇ˛ˇ˛ˇˇ˛ˇ˚˛ˇ˛ˇ˛˛ˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇÚ˛ˇ˚J˙˚ˇıˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇˆ˘ˇ˚J˙ˇˇ˛ˇ
  4123. ˇˇˇˇˇˇˇ˝ˇˇˇ˛ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇ˛ˇˇÒ˛ˇ˚I˙ˇˇ˛˛ ˛ˇ˛ˇ˛ˇ˛˝ˇˇˇ˛ˇˇ˛˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇÒ˛ˇ˚I˙ˇˇˇˇˇˇˇˇˇˇˇ¸ˇˇ˛ˇˇˇˇˇ˛ˇˇˇ˛ ˇˇˇˇˇˇˇÒ˛ˇ˚˙ˇÊˇˇ¿˛ˇ˚˙ˇÂˇø˛ˇ˚
  4124. ˙ˇ¢˛ˇ˚˙ûˇ˚
  4125. ˙ˇ¢˛ˇ˚
  4126. ˙ˇ¢˛ˇ˚
  4127. ˙ˇ¢˛ˇ˚
  4128. ˙ˇ¢˛ˇ˚
  4129. ˙ˇ¢˛ˇ˚
  4130. ˙ˇ¢˛ˇ˚
  4131. ˙˚ˇ¨˘ˇ˚
  4132. ˙ˇ¢˛ˇ˚
  4133. ˙ˇ¢˛ˇ˚
  4134. ˙ˇ¢˛ˇ˚˙ˇÈˇËˇˇˆˇ˘ˇˇÌ˛ˇ˚$˙ˇ„ˇ˜ˇ˙ˇ¯ˇ˛ˇ˙ˇˇÏ˛ˇ˚M˙ˇÒˇˇ˛ˇˇˇ˛ˇ˛ˇˇˇ˛ˇˇˇ˝ˇˇ˛ˇˇˇˇ˛ˇ˛ˇ˛ˇ˛˛ˇˇ˛ˇÛ˛ˇ˚L˙ˇÒˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇÚ˛ˇ˚L˙˚ˇˆˇˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇˇ˛
  4135. ˇˇˇˇˇ˛ ˇˇˇˇˇˇ˛ˇˇ˜˘ˇ˚L˙ˇÒˇˇˇˇˇˇˇˇˇ˛ˇ˝˛ˇ˛˛˛ˇ˛˛˛ˇ˛ ˇ˛ˇ˛ˇ˛ˇ˛ˇÚ˛ˇ˚J˙ˇÒˇˇ˛ˇˇˇˇˇˇˇˇ¸ˇˇ˝ˇˇˇˇˇ˛ˇˇˇ˛ ˇˇˇˇˇˇˇÚ˛ˇ˚˙ˇÒˇ≥˛ˇ˚˙ˇÒˇ≥˛ˇ˚
  4136. ˙ˇ¢˛ˇ˚
  4137. ˙ˇ¢˛ˇ˚
  4138. ˙˚ˇ¨˘ˇ˚
  4139. ˙ˇ¢˛ˇ˚
  4140. ˙ˇ¢˛ˇ˚
  4141. ˙ˇ¢˛ˇ˚
  4142. ˙ˇ¢˛ˇ˚
  4143. ˙ˇ¢˛ˇ˚
  4144. ˙ˇ¢˛ˇ˚
  4145. ˙ˇ¢˛ˇ˚˙ûˇ˚
  4146. ˙ˇ¢˛ˇ˚
  4147. ˙ˇ¢˛ˇ˚
  4148. ˙ˇ¢˛ˇ˚
  4149. ˙ˇ¢˛ˇ˚
  4150. ˙ˇ¢˛ˇ˚òÄp@ÄpHH∫4‘)™Ä˛ˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  4151. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  4152. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  4153.  
  4154.  
  4155.  ˛êêê@Äp∏ë¯'
  4156. ˙ˇ¢˛ˇ˚ëëë
  4157. ˙ˇ°ˇ˙
  4158. ˚˛ˇ£˛ˇ˚
  4159. ¸˝ˇ§˝ˇ˚
  4160. ˚˛ˇ£˛ˇ˚
  4161. ˙ˇ°ˇ˙ë
  4162. ˙ˇ°ˇ˙
  4163. ˚˛ˇ£˛ˇ˚
  4164. ¸˝ˇ§˝ˇ˚
  4165. ˚˛ˇ£˛ˇ˚
  4166. ˙ˇ°ˇ˙ë
  4167. ˙ˇ°ˇ˙
  4168. ˚˛ˇ£˛ˇ˚
  4169. ¸˝ˇ§˝ˇ˚
  4170. ˚˛ˇ£˛ˇ˚
  4171. ˙ˇ°ˇ˙ëëë
  4172. ˙ˇ¢˛ˇ˚
  4173. ˙ˇ¢˛ˇ˚
  4174. ˙ˇ¢˛ˇ˚
  4175. ˙ˇ¢˛ˇ˚
  4176. ˙ˇ¢˛ˇ˚
  4177. ˙ˇ¢˛ˇ˚˙ûˇ˚
  4178. ˙ˇ¢˛ˇ˚
  4179. ˙ˇ¢˛ˇ˚
  4180. ˙ˇ¢˛ˇ˚
  4181. ˙ˇ¢˛ˇ˚#˙ˇÔˇÚˇ˜ˇˇÙˇ˘ˇˇÏ˛ˇ˚*˙ˇÔˇÙˇˇ¯ˇ˛ˇ˘ˇ˝ˇ˙ˇˇÎ˛ˇ˚H˙ˇÔˇˇ˛ˇ˛ˇˇ˛ˇ˛¸
  4182. ˇˇˇˇ˛˛˛˛ˇ˛ˇ˛ˇˇˇ˛ˇˇ˛ˇ˛Ú˛ˇ˚I˙˚ˇÙˇˇˇˇˇˇˇˇˇˇ˛ˇˇˇ˛    ˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˆ˘ˇ˚G˙ˇÔ˝ˇˇˇˇˇˇˇˇ˛ˇˇˇ˛    ˇˇˇˇˇ˝ ˇˇˇˇˇˇ˛ˇˇÒ˛ˇ˚I˙ˇÔˇˇ˛
  4183. ˇ˛ˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇ˛˝ ˇˇˇˇˇˇˇ˛ˇÒ˛ˇ˚I˙ˇÔ ˇˇˇˇˇˇˇ˛ˇˇˇ˝ˇˇ˛
  4184. ˇˇˇˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇÒ˛ˇ˚˙ˇÊˇˇ¿˛ˇ˚˙ˇÂˇø˛ˇ˚
  4185. ˙ˇ¢˛ˇ˚˙ûˇ˚
  4186. ˙ˇ¢˛ˇ˚
  4187. ˙ˇ¢˛ˇ˚
  4188. ˙ˇ¢˛ˇ˚
  4189. ˙ˇ¢˛ˇ˚
  4190. ˙ˇ¢˛ˇ˚
  4191. ˙ˇ¢˛ˇ˚
  4192. ˙˚ˇ¨˘ˇ˚
  4193. ˙ˇ¢˛ˇ˚
  4194. ˙ˇ¢˛ˇ˚˙ˇËˇÍˇÙ˛˘ˇˇÌ˛ˇ˚$˙ˇ„ˇ˜ˇ˙ˇ¯ˇ˛ˇ˙ˇˇÏ˛ˇ˚K˙ˇÒˇˇ˝ˇ˛ˇ    ˇˇˇˇˇ˛ˇˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇ˝ˇˇˇˇÛ˛ˇ˚L˙ˇÒˇˇ˛ˇ˛ˇˇˇˇˇˇ˝˛ˇ˛˛˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇÚ˛ˇ˚L˙ˇÒˇˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇˇ˛
  4195. ˇˇˇˇˇ˛ ˇˇˇˇˇˇ˛ˇˇÚ˛ˇ˚L˙˚ˇˆˇˇˇˇˇˇˇˇˇ˛ˇ˝ˇˇˇ˛ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇ˜˘ˇ˚I˙ˇÒˇˇ˝ˇˇˇˇ˛ˇˇˇ¸ˇˇ˝ˇˇˇ˛ˇ˛ˇ˛ˇ˛ ˇˇ˛ˇˇˇ˛Ú˛ˇ˚˙ˇÒˇ≥˛ˇ˚˙ˇÒˇ≥˛ˇ˚òÄpĆpHH∫4ÿ)´Ä˛ˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  4196. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  4197. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  4198.  
  4199.  
  4200.  ˛êêêĆp¯ë'
  4201. ˙ˇ¢˛ˇ˚
  4202. ˙ˇ¢˛ˇ˚
  4203. ˙ˇ¢˛ˇ˚
  4204. ˙˚ˇ¨˘ˇ˚
  4205. ˙ˇ¢˛ˇ˚
  4206. ˙ˇ¢˛ˇ˚
  4207. ˙ˇ¢˛ˇ˚
  4208. ˙ˇ¢˛ˇ˚
  4209. ˙ˇ¢˛ˇ˚
  4210. ˙ˇ¢˛ˇ˚
  4211. ˙ˇ¢˛ˇ˚˙ûˇ˚
  4212. ˙ˇ¢˛ˇ˚
  4213. ˙ˇ¢˛ˇ˚˙ˇ—ˇÛˇˇ„˛ˇ˚˙ˇ“˛Ú˛ˇ‰˛ˇ˚/˙ˇ„˛ˇ    ˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ‰˛ˇ˚/˙ˇ· ˇˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇ‰˛ˇ˚0˙˚ˇÁˇ˛ˇˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛È˘ˇ˚1˙ˇ„ˇ˛ˇ˛ˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇ‰˛ˇ˚/˙ˇ„˛ˇˇˇˇ˛ˇ˝ˇˇˇ˛    ˇˇˇˇˇ‰˛ˇ˚˙ˇ“˛ˇ‰˛ˇ˚˙ˇ—ˇÚˇ„˛ˇ˚
  4214. ˙ˇ¢˛ˇ˚
  4215. ˙ˇ¢˛ˇ˚˙ûˇ˚¯†ˇ˚¯†ˇ˚ëëëë
  4216. <°d
  4217. ONLNf§
  4218. xë<°d
  4219. ONLNf:
  4220. .†p†p(xë °d
  4221. ONLNfíö
  4222. d
  4223. .°dONLNd´˛x    ü+≠
  4224. Figure 3-1°dONLNdµ˛ü        )'  UDP Write Data Structure(Ÿ<12
  4225. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ†æ†¬°¿/, 128 string def
  4226. °¿5{currentfile , readstring {(,,,,,,,,,,,,,,,,) search
  4227. °¿K{pop pop pop {currentfile read {46 eq {exit} if} {exit} ifelse} loop exit}
  4228. °¿+{pop} ifelse} {pop exit} ifelse} bind loop
  4229. †ø†æ†¬°¿í,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.
  4230. †ø†æ†¬°¿-%%BeginDocument: Adobe Illustrator(TM) 3.2.2
  4231. °¿%!PS-Adobe-3.0 °¿    EPSF-3.0
  4232. °¿'%%Creator: Adobe Illustrator(TM) 3.2.2
  4233. °¿*%%For: (Debbie McDaniel) (Apple Computer)
  4234. °¿$%%CreationDate: (4/13/93) (2:03 PM)
  4235. °¿%%BoundingBox: -106 33 6 193
  4236. °¿%%DocumentProcessColors: Black
  4237. °¿"%%DocumentFonts: Helvetica-Narrow
  4238. °¿=%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0
  4239. °¿"%%+ procset Adobe_cmykcolor 1.1 0
  4240. °¿%%+ procset Adobe_cshow 1.1 0
  4241. °¿$%%+ procset Adobe_customcolor 1.0 0
  4242. °¿'%%+ procset Adobe_typography_AI3 1.0 1
  4243. °¿)%%+ procset Adobe_IllustratorA_AI3 1.0 1
  4244. °¿%AI3_ColorUsage: Black&White
  4245. °¿ %AI3_TemplateBox: -42 80 -42 80
  4246. °¿ %AI3_TileBox: -330 -280 222 450
  4247. °¿$%AI3_DocumentPreview: Macintosh_Pic
  4248. °¿%%EndComments
  4249. °¿%%BeginProlog
  4250. †ø†æ†¬°¿1%%BeginResource: procset Adobe_packedarray 2.0 0
  4251. °¿"%%Title: (Packed Array Operators)
  4252. °¿%%Version: 2.0 
  4253. °¿%%CreationDate: (8/2/90) ()
  4254. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4255. °¿1userdict /Adobe_packedarray 5 dict dup begin put
  4256. °¿/initialize            % - initialize -
  4257. °¿{
  4258. °¿/packedarray where
  4259. °¿    {
  4260. °¿    pop
  4261. °¿    }
  4262. °¿    {
  4263. °¿    Adobe_packedarray begin
  4264. °¿    Adobe_packedarray
  4265. °¿        {
  4266. °¿
  4267.         dup xcheck
  4268. °¿            {
  4269. °¿            bind
  4270. °¿            } if
  4271. °¿        userdict 3 1 roll put
  4272. °¿         } forall
  4273. °¿    end
  4274. °¿
  4275.     } ifelse
  4276. °¿} def
  4277. °¿/terminate            % - terminate -
  4278. °¿{
  4279. °¿} def
  4280. °¿2/packedarray        % arguments count packedarray array
  4281. °¿{
  4282. °¿array astore readonly
  4283. °¿} def
  4284. °¿%/setpacking            % boolean setpacking -
  4285. °¿{
  4286. °¿pop
  4287. °¿} def
  4288. °¿(/currentpacking        % - setpacking boolean
  4289. °¿{
  4290. °¿false
  4291. °¿} def
  4292. °¿currentdict readonly pop end
  4293. °¿%%EndResource
  4294. °¿'Adobe_packedarray /initialize get exec
  4295. °¿/%%BeginResource: procset Adobe_cmykcolor 1.1 0
  4296. °¿ %%Title: (CMYK Color Operators)
  4297. °¿%%Version: 1.1 
  4298. °¿%%CreationDate: (1/23/89) ()
  4299. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4300. °¿currentpacking true setpacking
  4301. °¿/userdict /Adobe_cmykcolor 4 dict dup begin put
  4302. °¿/initialize            % - initialize -
  4303. °¿{
  4304. °¿/setcmykcolor where
  4305. °¿    {
  4306. °¿    pop
  4307. °¿    }
  4308. °¿    {
  4309. °¿5    userdict /Adobe_cmykcolor_vars 2 dict dup begin put
  4310. °¿    /_setrgbcolor
  4311. °¿        /setrgbcolor load def
  4312. °¿    /_currentrgbcolor
  4313. °¿        /currentrgbcolor load def
  4314. °¿    Adobe_cmykcolor begin
  4315. °¿    Adobe_cmykcolor
  4316. °¿        {
  4317. °¿
  4318.         dup xcheck
  4319. °¿            {
  4320. °¿            bind
  4321. °¿            } if
  4322. °¿
  4323.         pop pop
  4324. °¿         } forall
  4325. °¿    end
  4326. °¿    end
  4327. °¿    Adobe_cmykcolor begin
  4328. °¿
  4329.     } ifelse
  4330. °¿} def
  4331. °¿/terminate            % - terminate -
  4332. °¿{
  4333. °¿currentdict Adobe_cmykcolor eq
  4334. °¿    {
  4335. °¿    end
  4336. °¿    } if
  4337. °¿} def
  4338. °¿:/setcmykcolor        % cyan magenta yellow black setcmykcolor -
  4339. °¿{
  4340. °¿1 sub 4 1 roll
  4341. °¿3
  4342. °¿    {
  4343. °¿    3 index add neg dup 0 lt
  4344. °¿        {
  4345. °¿        pop 0
  4346. °¿        } if
  4347. °¿
  4348.     3 1 roll
  4349. °¿
  4350.     } repeat
  4351. °¿,Adobe_cmykcolor_vars /_setrgbcolor get exec
  4352. °¿pop
  4353. °¿} def 
  4354. °¿A/currentcmykcolor    % - currentcmykcolor cyan magenta yellow black
  4355. °¿{
  4356. °¿0Adobe_cmykcolor_vars /_currentrgbcolor get exec
  4357. °¿3
  4358. °¿    {
  4359. °¿    1 sub neg 3 1 roll
  4360. °¿
  4361.     } repeat
  4362. °¿0
  4363. °¿} def
  4364. °¿currentdict readonly pop end
  4365. °¿ setpacking
  4366. °¿%%EndResource
  4367. °¿+%%BeginResource: procset Adobe_cshow 1.1 0
  4368. °¿%%Title: (cshow Operator)
  4369. °¿%%Version: 1.1 
  4370. °¿%%CreationDate: (1/23/89) ()
  4371. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4372. °¿currentpacking true setpacking
  4373. °¿+userdict /Adobe_cshow 3 dict dup begin put
  4374. °¿/initialize            % - initialize -
  4375. °¿{
  4376. °¿
  4377. /cshow where
  4378. °¿    {
  4379. °¿    pop
  4380. °¿    }
  4381. °¿    {
  4382. °¿1    userdict /Adobe_cshow_vars 1 dict dup begin put
  4383. °¿    /_cshow        % - _cshow proc
  4384. °¿            {} def
  4385. °¿    Adobe_cshow begin
  4386. °¿
  4387.     Adobe_cshow
  4388. °¿        {
  4389. °¿
  4390.         dup xcheck
  4391. °¿            {
  4392. °¿            bind
  4393. °¿            } if
  4394. °¿        userdict 3 1 roll put
  4395. °¿         } forall
  4396. °¿    end
  4397. °¿    end
  4398. °¿
  4399.     } ifelse
  4400. °¿} def
  4401. °¿/terminate            % - terminate -
  4402. °¿{
  4403. °¿} def
  4404. °¿ /cshow                % proc string cshow -
  4405. °¿{
  4406. °¿exch
  4407. °¿Adobe_cshow_vars
  4408. °¿    exch /_cshow
  4409. °¿
  4410.     exch put
  4411. °¿    {
  4412. °¿'    0 0 Adobe_cshow_vars /_cshow get exec
  4413. °¿
  4414.     } forall
  4415. °¿} def
  4416. °¿currentdict readonly pop end
  4417. °¿ setpacking
  4418. °¿%%EndResource
  4419. °¿1%%BeginResource: procset Adobe_customcolor 1.0 0
  4420. °¿"%%Title: (Custom Color Operators)
  4421. °¿%%Version: 1.0 
  4422. °¿%%CreationDate: (5/9/88) ()
  4423. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4424. °¿currentpacking true setpacking
  4425. °¿1userdict /Adobe_customcolor 5 dict dup begin put
  4426. °¿/initialize            % - initialize -
  4427. °¿{
  4428. °¿/setcustomcolor where
  4429. °¿    {
  4430. °¿    pop
  4431. °¿    }
  4432. °¿    {
  4433. °¿    Adobe_customcolor begin
  4434. °¿    Adobe_customcolor
  4435. °¿        {
  4436. °¿
  4437.         dup xcheck
  4438. °¿            {
  4439. °¿            bind
  4440. °¿            } if
  4441. °¿
  4442.         pop pop
  4443. °¿         } forall
  4444. °¿    end
  4445. °¿    Adobe_customcolor begin
  4446. °¿
  4447.     } ifelse
  4448. °¿} def
  4449. °¿/terminate            % - terminate -
  4450. °¿{
  4451. °¿!currentdict Adobe_customcolor eq
  4452. °¿    {
  4453. °¿    end
  4454. °¿    } if
  4455. °¿} def
  4456. °¿Q/findcmykcustomcolor    % cyan magenta yellow black name findcmykcustomcolor object
  4457. °¿{
  4458. °¿5 packedarray
  4459. °¿}  def
  4460. °¿0/setcustomcolor        % object tint setcustomcolor -
  4461. °¿{
  4462. °¿exch
  4463. °¿aload pop pop
  4464. °¿4
  4465. °¿    {
  4466. °¿    4 index mul 4 1 roll
  4467. °¿
  4468.     } repeat
  4469. °¿5 -1 roll pop
  4470. °¿
  4471. setcmykcolor
  4472. °¿} def
  4473. °¿(/setoverprint        % boolean setoverprint -
  4474. °¿{
  4475. °¿pop
  4476. °¿} def
  4477. °¿currentdict readonly pop end
  4478. °¿ setpacking
  4479. °¿%%EndResource
  4480. °¿4%%BeginResource: procset Adobe_typography_AI3 1.1 0
  4481. °¿ %%Title: (Typography Operators)
  4482. °¿%%Version: 1.0 
  4483. °¿%%CreationDate:(5/31/90) ()
  4484. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4485. °¿currentpacking true setpacking
  4486. °¿5userdict /Adobe_typography_AI3 47 dict dup begin put
  4487. °¿/initialize            % - initialize -
  4488. °¿{
  4489. °¿/TZ
  4490. °¿ where
  4491. °¿    {
  4492. °¿    pop
  4493. °¿    }
  4494. °¿    {
  4495. °¿    Adobe_typography_AI3 begin
  4496. °¿    Adobe_typography_AI3
  4497. °¿        {
  4498. °¿
  4499.         dup xcheck
  4500. °¿            {
  4501. °¿            bind
  4502. °¿            } if
  4503. °¿
  4504.         pop pop
  4505. °¿         } forall
  4506. °¿    end
  4507. °¿    Adobe_typography_AI3 begin
  4508. °¿
  4509.     } ifelse
  4510. °¿} def
  4511. °¿/terminate            % - terminate -
  4512. °¿{
  4513. °¿$currentdict Adobe_typography_AI3 eq
  4514. °¿    {
  4515. °¿    end
  4516. °¿    } if
  4517. °¿} def
  4518. °¿b% [ number value stream [ array for encoding modification ] modifyEncoding ==> [ modified array ]
  4519. °¿/modifyEncoding
  4520. °¿{
  4521. °¿    /_tempEncode exch ddef
  4522. °¿    
  4523. °¿$    % pointer for sequential encodings
  4524. °¿    /_pntr 0 ddef
  4525. °¿    
  4526. °¿    {
  4527. °¿        % get bottom object
  4528. °¿        counttomark -1 roll
  4529. °¿        % is it a mark ?
  4530. °¿        dup type dup /marktype eq         
  4531. °¿        {
  4532. °¿
  4533.             % exit
  4534. °¿            pop pop exit
  4535. °¿        }
  4536. °¿        {
  4537. °¿            % ... object ... type ....
  4538. °¿            % insert if a nametype
  4539. °¿            /nametype eq
  4540. °¿            {
  4541. °¿5                % insert the name at _pntr and increment pointer
  4542. °¿B                _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
  4543. °¿                put
  4544. °¿            }
  4545. °¿            {
  4546. °¿#                % reset _pntr if it's a number
  4547. °¿                /_pntr exch ddef                    
  4548. °¿            }
  4549. °¿
  4550.             ifelse
  4551. °¿        }
  4552. °¿            ifelse
  4553. °¿    }
  4554. °¿    loop    
  4555. °¿    
  4556. °¿     % return the modified encoding
  4557. °¿
  4558.     _tempEncode
  4559. °¿}
  4560. °¿def
  4561. °¿9/TE    % Set std platform encoding     % (encoding pairs) TE -
  4562. °¿{
  4563. °¿1    StandardEncoding 256 array copy modifyEncoding 
  4564. °¿    /_nativeEncoding exch def
  4565. °¿} def
  4566. °¿% re-define font
  4567. °¿% expected arguments
  4568. °¿% for 'normal fonts : 
  4569. °¿L% [ /_Helvetica-Bold/Helvetica-Bold direction fontScript defaultEncoding TZ
  4570. °¿%
  4571. °¿5% for cartographic, pictographic, and expert fonts :
  4572. °¿1% [ ... number value stream ... /_Symbol/Symbol 
  4573. °¿*%    direction fontScript defaultEncoding TZ
  4574. °¿*% for blended fonts w/ default encoding :
  4575. °¿-% [ /_AdobeSans_20ULig1XCond-Bold/AdobeSans 
  4576. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  4577. °¿*% for blended fonts w/ special encoding :
  4578. °¿D% [ ... number value stream ... /_AdobeSans_20ULig1XCond/AdobeSans 
  4579. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  4580. °¿/TZ        
  4581. °¿{
  4582. °¿"    % set weight vector (if present)
  4583. °¿=    dup type /arraytype eq {/_wv exch def} {/_wv 0 def} ifelse 
  4584. °¿"    % platform dependent coding flag
  4585. °¿    /_useNativeEncoding exch def
  4586. °¿    % pop fontScript & direction
  4587. °¿        pop pop
  4588. °¿    
  4589. °¿'    % create a new dictionary with length
  4590. °¿+    % equal to original dictionary length + 2
  4591. °¿+    % copy all the key/value pairs except FID
  4592. °¿C    % call makeblended font with the weight values if _wv is an array
  4593. °¿P    findfont _wv type /arraytype eq {_wv makeblendedfont} if dup length 2 add dict
  4594. °¿    
  4595. °¿    begin
  4596. °¿    
  4597. °¿$        % copy all the values but the FID
  4598. °¿        % into the new dictionary
  4599. °¿         mark exch
  4600. °¿        {
  4601. °¿/            1 index /FID ne { def } if cleartomark mark
  4602. °¿        }
  4603. °¿            forall
  4604. °¿        % discard last mark
  4605. °¿        pop
  4606. °¿        
  4607. °¿        % define FontName
  4608. °¿        /FontName exch def
  4609. °¿        
  4610. °¿(        % if no re-encoding stream is present
  4611. °¿1        % then if the base encoding vector of the font
  4612. °¿$        % is the same as StandardEncoding
  4613. °¿/        % and the use platform encoding flag is true
  4614. °¿&        % then install AI platform encoding
  4615. °¿+        % else leave the base encoding in effect
  4616. °¿        counttomark 0 eq
  4617. °¿        {
  4618. °¿            1 _useNativeEncoding eq
  4619. °¿            {
  4620. °¿"                /Encoding _nativeEncoding def
  4621. °¿            }
  4622. °¿            if
  4623. °¿            % clean up
  4624. °¿            cleartomark
  4625. °¿        }
  4626. °¿        {    
  4627. °¿             % custom encoding to be done
  4628. °¿;            % start off with a copy of the font's standard encoding
  4629. °¿"            /Encoding load 256 array copy 
  4630. °¿%            modifyEncoding /Encoding exch def
  4631. °¿        }
  4632. °¿         ifelse        
  4633. °¿        FontName currentdict
  4634. °¿    end
  4635. °¿    
  4636. °¿    % register the new font
  4637. °¿    definefont pop
  4638. °¿}
  4639. °¿def
  4640. °¿% text painting operators
  4641. °¿"/tr                    % string tr ax ay string 
  4642. °¿{
  4643. °¿_ax _ay 3 2 roll
  4644. °¿} def
  4645. °¿2/trj                % string trj cx cy fillchar ax ay string 
  4646. °¿{
  4647. °¿_cx _cy _sp _ax _ay 6 5 roll
  4648. °¿} def
  4649. °¿/a0
  4650. °¿{
  4651. °¿#/Tx    % text                            % textString Tx -
  4652. °¿    {
  4653. °¿    dup 
  4654. °¿    currentpoint 3 2 roll
  4655. °¿        tr _psf
  4656. °¿    newpath moveto
  4657. °¿    tr _ctm _pss
  4658. °¿    } ddef
  4659. °¿*/Tj    % justified text                % textString Tj -
  4660. °¿    {
  4661. °¿    dup
  4662. °¿    currentpoint 3 2 roll
  4663. °¿     trj _pjsf
  4664. °¿    newpath moveto
  4665. °¿    trj _ctm _pjss
  4666. °¿    } ddef
  4667. °¿    
  4668. °¿} def
  4669. °¿/a1
  4670. °¿{
  4671. °¿#/Tx    % text                            % textString Tx -
  4672. °¿    {
  4673. °¿!    dup currentpoint 4 2 roll gsave
  4674. °¿    dup currentpoint 3 2 roll
  4675. °¿        tr _psf
  4676. °¿    newpath moveto
  4677. °¿    tr _ctm _pss
  4678. °¿     grestore 3 1 roll moveto tr sp
  4679. °¿    } ddef
  4680. °¿*/Tj    % justified text                % textString Tj -
  4681. °¿    {
  4682. °¿!    dup currentpoint 4 2 roll gsave
  4683. °¿    dup currentpoint 3 2 roll
  4684. °¿     trj _pjsf
  4685. °¿    newpath moveto
  4686. °¿    trj _ctm _pjss
  4687. °¿     grestore 3 1 roll moveto tr sp
  4688. °¿    } ddef
  4689. °¿    
  4690. °¿} def
  4691. °¿/e0
  4692. °¿{
  4693. °¿#/Tx    % text                            % textString Tx -
  4694. °¿    {
  4695. °¿        tr _psf
  4696. °¿    } ddef
  4697. °¿*/Tj    % justified text                % textString Tj -
  4698. °¿    {
  4699. °¿     trj _pjsf
  4700. °¿    } ddef
  4701. °¿} def
  4702. °¿/e1
  4703. °¿{
  4704. °¿#/Tx    % text                            % textString Tx -
  4705. °¿    {
  4706. °¿"    dup currentpoint 4 2 roll gsave 
  4707. °¿     tr _psf  
  4708. °¿!    grestore 3 1 roll moveto tr sp 
  4709. °¿    } ddef
  4710. °¿*/Tj    % justified text                % textString Tj -
  4711. °¿    {
  4712. °¿"    dup currentpoint 4 2 roll gsave 
  4713. °¿     trj _pjsf
  4714. °¿!    grestore 3 1 roll moveto tr sp 
  4715. °¿    } ddef
  4716. °¿} def
  4717. °¿/i0
  4718. °¿{
  4719. °¿#/Tx    % text                            % textString Tx -
  4720. °¿    {
  4721. °¿    tr sp
  4722. °¿    } ddef
  4723. °¿*/Tj    % justified text                % textString Tj -
  4724. °¿    {
  4725. °¿        trj jsp
  4726. °¿    } ddef
  4727. °¿} def
  4728. °¿/i1
  4729. °¿{
  4730. °¿W N
  4731. °¿} def
  4732. °¿/o0
  4733. °¿{
  4734. °¿#/Tx    % text                            % textString Tx -
  4735. °¿    {
  4736. °¿    tr sw rmoveto
  4737. °¿    } ddef
  4738. °¿*/Tj    % justified text                % textString Tj -
  4739. °¿    {
  4740. °¿    trj swj rmoveto
  4741. °¿    } ddef
  4742. °¿} def
  4743. °¿/r0
  4744. °¿{
  4745. °¿#/Tx    % text                            % textString Tx -
  4746. °¿    {
  4747. °¿    tr _ctm _pss
  4748. °¿    } ddef
  4749. °¿*/Tj    % justified text                % textString Tj -
  4750. °¿    {
  4751. °¿    trj _ctm _pjss
  4752. °¿    } ddef
  4753. °¿} def
  4754. °¿/r1
  4755. °¿{
  4756. °¿#/Tx    % text                            % textString Tx -
  4757. °¿    {
  4758. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  4759. °¿    tr _ctm _pss 
  4760. °¿!    grestore 3 1 roll moveto tr sp 
  4761. °¿    } ddef
  4762. °¿*/Tj    % justified text                % textString Tj -
  4763. °¿    {
  4764. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  4765. °¿    trj _ctm _pjss
  4766. °¿!    grestore 3 1 roll moveto tr sp 
  4767. °¿    } ddef
  4768. °¿} def
  4769. °¿% font operators
  4770. °¿
  4771. % Binding
  4772. °¿&/To    % begin text                     % bindType To -
  4773. °¿{
  4774. °¿    pop _ctm currentmatrix pop
  4775. °¿} def
  4776. °¿/TO    % end text                    % TO -
  4777. °¿{
  4778. °¿    Te _ctm setmatrix newpath
  4779. °¿} def
  4780. °¿
  4781. % Text paths
  4782. °¿6/Tp    % begin text path                % a b c d tx ty startPt Tp -
  4783. °¿{
  4784. °¿$    pop _tm astore pop _ctm setmatrix 
  4785. °¿"    _tDict begin /W {} def /h {} def
  4786. °¿} def
  4787. °¿/TP    % end text path                    % TP -
  4788. °¿{
  4789. °¿    end
  4790. °¿    iTm 0 0 moveto
  4791. °¿} def
  4792. °¿!% Render mode & matrix operators
  4793. °¿&/Tr    % begin render                    % render Tr - 
  4794. °¿{
  4795. °¿/    _render 3 le {currentpoint newpath moveto} if
  4796. °¿/    dup 8 eq {pop 0} {dup 9 eq {pop 1} if} ifelse
  4797. °¿    dup /_render exch ddef
  4798. °¿!    _renderStart exch get load exec
  4799. °¿} def
  4800. °¿K/iTm % internal set text matrix        % - iTm -    (uses _tm as implicit argument)
  4801. °¿{
  4802. °¿8_ctm setmatrix _tm concat 0 _rise translate _hs 1 scale
  4803. °¿} def
  4804. °¿./Tm % set text matrix                % a b c d tx ty Tm -
  4805. °¿{
  4806. °¿_tm astore pop iTm 0 0 moveto
  4807. °¿} def
  4808. °¿+/Td % translate text matrix         % tx ty Td -
  4809. °¿{
  4810. °¿7_mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
  4811. °¿} def
  4812. °¿/Te    % end render                    % - Te -
  4813. °¿{
  4814. °¿W    _render -1 eq {} {_renderEnd _render get dup null ne {load exec} {pop} ifelse} ifelse
  4815. °¿    /_render -1 ddef
  4816. °¿} def
  4817. °¿
  4818. % Attributes
  4819. °¿)/Ta    % set alignment                    % alignment Ta -
  4820. °¿{
  4821. °¿pop
  4822. °¿} def
  4823. °¿3/Tf    % set font name and size        % fontname size Tf -
  4824. °¿{
  4825. °¿dup 1000 div /_fScl exch ddef
  4826. °¿%exch findfont exch scalefont setfont
  4827. °¿} def
  4828. °¿6/Tl    % set leading                    % leading paragraphLeading Tl -
  4829. °¿{
  4830. °¿pop
  4831. °¿ exch _leading astore pop
  4832. °¿} def
  4833. °¿//Tt    % set user tracking                % userTracking Tt -
  4834. °¿{
  4835. °¿pop
  4836. °¿} def
  4837. °¿</TW % set word spacing                % minSpace optSpace maxSpace TW -
  4838. °¿{
  4839. °¿3 npop
  4840. °¿} def
  4841. °¿0/Tw    % set computed word spacing        % wordSpace Tw
  4842. °¿{
  4843. °¿/_cx exch ddef
  4844. °¿} def
  4845. °¿@/TC % set character spacing            % minSpace optSpace maxSpace TC -
  4846. °¿{
  4847. °¿3 npop
  4848. °¿} def
  4849. °¿2/Tc    % set computed char spacing     % charSpace Tc -
  4850. °¿{
  4851. °¿/_ax exch ddef
  4852. °¿} def
  4853. °¿0/Ts % set super/subscripting (rise)    % rise Ts -
  4854. °¿{
  4855. °¿/_rise exch ddef
  4856. °¿
  4857. currentpoint
  4858. °¿iTm
  4859. °¿moveto
  4860. °¿} def
  4861. °¿M/Ti    % set indentation                % firstStartIndent otherStartIndent stopIndent Ti -
  4862. °¿{
  4863. °¿3 npop
  4864. °¿} def
  4865. °¿2/Tz % set horizontal scaling        % scalePercent Tz -
  4866. °¿{
  4867. °¿100 div /_hs exch ddef
  4868. °¿iTm
  4869. °¿} def
  4870. °¿-/TA % set pairwise kerning            % autoKern TA -
  4871. °¿+                                    %    autoKern = 0 -> no pair kerning
  4872. °¿,                                    %             = 1 -> automatic pair kerning
  4873. °¿{
  4874. °¿pop
  4875. °¿} def
  4876. °¿0/Tq % set hanging quotes            % hangingQuotes Tq -
  4877. °¿3                                    %    hangingQuotes     = 0 -> no hanging quotes
  4878. °¿&                                    %                     = 1 -> hanging quotes
  4879. °¿{
  4880. °¿pop
  4881. °¿} def
  4882. °¿% Text Bodies
  4883. °¿/TX {pop} def
  4884. °¿.%/Tx    % non-justified text            % textString Tx -
  4885. °¿+%/Tj    % justified text                % textString Tj -
  4886. °¿+/Tk    % kern                            % autoKern kernValue Tk -
  4887. °¿;                                    %      autoKern = 0 -> manual kern, = 1 -> auto kern
  4888. °¿3                                    %    kernValue = kern value in em/1000 space
  4889. °¿{
  4890. °¿!exch pop _fScl mul neg 0 rmoveto
  4891. °¿} def
  4892. °¿5/TK    % non-printing kern                % autoKern kernValue TK -
  4893. °¿{
  4894. °¿2 npop
  4895. °¿} def
  4896. °¿+/T* % carriage return & line feed    % - T* -
  4897. °¿{
  4898. °¿_leading aload pop neg Td
  4899. °¿} def
  4900. °¿6/T*- % carriage return & negative line feed    % - T*- -
  4901. °¿{
  4902. °¿_leading aload pop Td
  4903. °¿} def
  4904. °¿,/T-    % print a discretionary hyphen    % - T- -
  4905. °¿{
  4906. °¿ _hyphen Tx
  4907. °¿} def
  4908. °¿+/T+    % discretionary hyphen hyphen    % - T+ -
  4909. °¿{} def
  4910. °¿3/TR    % reset pattern matrix             % a b c d tx ty TR -
  4911. °¿{
  4912. °¿_ctm currentmatrix pop     
  4913. °¿_tm astore pop 
  4914. °¿iTm 0 0 moveto 
  4915. °¿} def
  4916. °¿4/TS    % special chars                    % textString justified TS -
  4917. °¿{
  4918. °¿0 eq {Tx} {Tj} ifelse
  4919. °¿} def
  4920. °¿currentdict readonly pop end
  4921. °¿ setpacking
  4922. °¿%%EndResource
  4923. °¿6%%BeginResource: procset Adobe_IllustratorA_AI3 1.0 2
  4924. °¿@%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog)
  4925. °¿%%Version: 1.0 
  4926. °¿%%CreationDate: (7/22/89) ()
  4927. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  4928. °¿currentpacking true setpacking
  4929. °¿7userdict /Adobe_IllustratorA_AI3 61 dict dup begin put
  4930. °¿% initialization
  4931. °¿ /initialize                % - initialize -
  4932. °¿{
  4933. °¿I% 47 vars, but leave slack of 10 entries for custom Postscript fragments
  4934. °¿<userdict /Adobe_IllustratorA_AI3_vars 57 dict dup begin put
  4935. °¿% paint operands
  4936. °¿/_lp /none def
  4937. °¿ /_pf {} def
  4938. °¿ /_ps {} def
  4939. °¿
  4940. /_psf {} def
  4941. °¿
  4942. /_pss {} def
  4943. °¿/_pjsf {} def
  4944. °¿/_pjss {} def
  4945. °¿
  4946. /_pola 0 def
  4947. °¿/_doClip 0 def
  4948. °¿% paint operators
  4949. °¿$/cf    currentflat def    % - cf flatness
  4950. °¿% typography operands
  4951. °¿/_tm matrix def
  4952. °¿5/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def 
  4953. °¿6/_renderEnd [null null null null /i1 /i1 /i1 /i1] def
  4954. °¿/_render -1 def
  4955. °¿
  4956. /_rise 0 def
  4957. °¿]/_ax 0 def            % x character spacing    (_ax, _ay, _cx, _cy follows awidthshow naming convention)
  4958. °¿#/_ay 0 def            % y character spacing
  4959. °¿/_cx 0 def            % x word spacing
  4960. °¿/_cy 0 def            % y word spacing
  4961. °¿/_leading [0 0] def
  4962. °¿/_ctm matrix def
  4963. °¿/_mtx matrix def
  4964. °¿/_sp 16#020 def
  4965. °¿/_hyphen (-) def
  4966. °¿
  4967. /_fScl 0 def
  4968. °¿ /_cnt 0 def
  4969. °¿ /_hs 1 def
  4970. °¿/_nativeEncoding 0 def
  4971. °¿/_useNativeEncoding 0 def
  4972. °¿/_tempEncode 0 def
  4973. °¿
  4974. /_pntr 0 def
  4975. °¿/_tDict 2 dict def
  4976. °¿% typography operators
  4977. °¿ /Tx {} def
  4978. °¿ /Tj {} def
  4979. °¿% compound path operators
  4980. °¿/CRender {} def
  4981. °¿ % printing
  4982. °¿/_AI3_savepage {} def
  4983. °¿% color operands
  4984. °¿/_gf null def
  4985. °¿/_cf 4 array def
  4986. °¿/_if null def
  4987. °¿/_of false def
  4988. °¿ /_fc {} def
  4989. °¿/_gs null def
  4990. °¿/_cs 4 array def
  4991. °¿/_is null def
  4992. °¿/_os false def
  4993. °¿ /_sc {} def
  4994. °¿
  4995. /_i null def
  4996. °¿Adobe_IllustratorA_AI3 begin
  4997. °¿Adobe_IllustratorA_AI3
  4998. °¿    {
  4999. °¿     dup xcheck
  5000. °¿        {
  5001. °¿        bind
  5002. °¿        } if
  5003. °¿        pop pop
  5004. °¿
  5005.     } forall
  5006. °¿end
  5007. °¿end
  5008. °¿Adobe_IllustratorA_AI3 begin
  5009. °¿"Adobe_IllustratorA_AI3_vars begin
  5010. °¿newpath
  5011. °¿} def
  5012. °¿/terminate                % - terminate -
  5013. °¿{
  5014. °¿end
  5015. °¿end
  5016. °¿} def
  5017. °¿% definition operators
  5018. °¿/_                    % - _ null
  5019. °¿    null def
  5020. °¿/ddef                % key value ddef -
  5021. °¿{
  5022. °¿)Adobe_IllustratorA_AI3_vars 3 1 roll put
  5023. °¿} def
  5024. °¿$/xput                % key value literal xput -
  5025. °¿{
  5026. °¿&dup load dup length exch maxlength eq
  5027. °¿    {
  5028. °¿    dup dup load dup
  5029. °¿    length 2 mul dict copy def
  5030. °¿    } if
  5031. °¿load begin def end
  5032. °¿} def
  5033. °¿/npop                % integer npop -
  5034. °¿{
  5035. °¿    {
  5036. °¿    pop
  5037. °¿
  5038.     } repeat
  5039. °¿} def
  5040. °¿% marking operators
  5041. °¿/sw                    % ax ay string sw x y 
  5042. °¿{
  5043. °¿dup length exch stringwidth
  5044. °¿%exch 5 -1 roll 3 index 1 sub mul add
  5045. °¿ 4 1 roll 3 1 roll 1 sub mul add
  5046. °¿} def
  5047. °¿./swj                % cx cy fillchar ax ay string swj x y
  5048. °¿{
  5049. °¿
  5050. dup 4 1 roll
  5051. °¿dup length exch stringwidth 
  5052. °¿%exch 5 -1 roll 3 index 1 sub mul add
  5053. °¿!4 1 roll 3 1 roll 1 sub mul add 
  5054. °¿6 2 roll /_cnt 0 ddef
  5055. °¿3{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop
  5056. °¿Nexch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
  5057. °¿} def
  5058. °¿#/ss                    % ax ay string matrix ss -
  5059. °¿{
  5060. °¿    4 1 roll
  5061. °¿'    {                % matrix ax ay char 0 0 {proc} -
  5062. °¿        2 npop 
  5063. °¿     (0) exch 2 copy 0 exch put pop
  5064. °¿    gsave
  5065. °¿    false charpath currentpoint
  5066. °¿    4 index setmatrix
  5067. °¿    stroke
  5068. °¿
  5069.     grestore
  5070. °¿    moveto
  5071. °¿    2 copy rmoveto
  5072. °¿    } exch cshow
  5073. °¿3 npop
  5074. °¿} def
  5075. °¿3/jss                % cx cy fillchar ax ay string matrix jss -
  5076. °¿{
  5077. °¿    4 1 roll
  5078. °¿9    {                % cx cy fillchar matrix ax ay char 0 0 {proc} -   
  5079. °¿        2 npop 
  5080. °¿    (0) exch 2 copy 0 exch put 
  5081. °¿    gsave
  5082. °¿        _sp eq 
  5083. °¿        {
  5084. °¿5        exch 6 index 6 index 6 index 5 -1 roll widthshow  
  5085. °¿        currentpoint
  5086. °¿        }
  5087. °¿        {
  5088. °¿        false charpath currentpoint
  5089. °¿        4 index setmatrix stroke
  5090. °¿
  5091.         }ifelse
  5092. °¿
  5093.     grestore
  5094. °¿    moveto
  5095. °¿    2 copy rmoveto
  5096. °¿    } exch cshow
  5097. °¿6 npop
  5098. °¿} def
  5099. °¿% path operators
  5100. °¿/sp                    % ax ay string sp -
  5101. °¿{
  5102. °¿    {
  5103. °¿    2 npop (0) exch
  5104. °¿    2 copy 0 exch put pop
  5105. °¿    false charpath
  5106. °¿    2 copy rmoveto
  5107. °¿    } exch cshow
  5108. °¿2 npop
  5109. °¿} def
  5110. °¿-/jsp                    % cx cy fillchar ax ay string jsp -
  5111. °¿{
  5112. °¿0    {                    % cx cy fillchar ax ay char 0 0 {proc} -
  5113. °¿        2 npop 
  5114. °¿    (0) exch 2 copy 0 exch put 
  5115. °¿        _sp eq 
  5116. °¿        {
  5117. °¿5        exch 5 index 5 index 5 index 5 -1 roll widthshow  
  5118. °¿        }
  5119. °¿        {
  5120. °¿        false charpath
  5121. °¿
  5122.         }ifelse
  5123. °¿    2 copy rmoveto
  5124. °¿    } exch cshow
  5125. °¿5 npop
  5126. °¿} def
  5127. °¿% path construction operators
  5128. °¿/pl                % x y pl x y
  5129. °¿{
  5130. °¿
  5131. transform
  5132. °¿0.25 sub round 0.25 add exch
  5133. °¿0.25 sub round 0.25 add exch
  5134. °¿ itransform
  5135. °¿} def
  5136. °¿/setstrokeadjust where
  5137. °¿    {
  5138. °¿    pop true setstrokeadjust
  5139. °¿    /c                % x1 y1 x2 y2 x3 y3 c -
  5140. °¿    {
  5141. °¿        curveto
  5142. °¿    } def
  5143. °¿    /C
  5144. °¿
  5145.     /c load def
  5146. °¿    /v                % x2 y2 x3 y3 v -
  5147. °¿    {
  5148. °¿    currentpoint 6 2 roll curveto
  5149. °¿    } def
  5150. °¿    /V
  5151. °¿
  5152.     /v load def
  5153. °¿    /y                % x1 y1 x2 y2 y -
  5154. °¿    {
  5155. °¿    2 copy curveto
  5156. °¿    } def
  5157. °¿    /Y
  5158. °¿
  5159.     /y load def
  5160. °¿    /l                % x y l -
  5161. °¿    {
  5162. °¿    lineto
  5163. °¿    } def
  5164. °¿    /L
  5165. °¿
  5166.     /l load def
  5167. °¿    /m                % x y m -
  5168. °¿    {
  5169. °¿    moveto
  5170. °¿    } def
  5171. °¿    }
  5172. °¿    {%else
  5173. °¿    /c
  5174. °¿    {
  5175. °¿     pl curveto
  5176. °¿    } def
  5177. °¿    /C
  5178. °¿
  5179.     /c load def
  5180. °¿    /v
  5181. °¿    {
  5182. °¿"    currentpoint 6 2 roll pl curveto
  5183. °¿    } def
  5184. °¿    /V
  5185. °¿
  5186.     /v load def
  5187. °¿    /y
  5188. °¿    {
  5189. °¿    pl 2 copy curveto
  5190. °¿    } def
  5191. °¿    /Y
  5192. °¿
  5193.     /y load def
  5194. °¿    /l
  5195. °¿    {
  5196. °¿     pl lineto
  5197. °¿    } def
  5198. °¿    /L
  5199. °¿
  5200.     /l load def
  5201. °¿    /m
  5202. °¿    {
  5203. °¿     pl moveto
  5204. °¿    } def
  5205. °¿        }ifelse
  5206. °¿% graphic state operators
  5207. °¿/d                    % array phase d -
  5208. °¿{
  5209. °¿setdash
  5210. °¿} def
  5211. °¿/cf    {} def            % - cf flatness
  5212. °¿/i                    % flatness i -
  5213. °¿{
  5214. °¿    dup 0 eq
  5215. °¿    {
  5216. °¿    pop cf
  5217. °¿    } if
  5218. °¿setflat
  5219. °¿} def
  5220. °¿/j                    % linejoin j -
  5221. °¿{
  5222. °¿ setlinejoin
  5223. °¿} def
  5224. °¿/J                    % linecap J -
  5225. °¿{
  5226. °¿ setlinecap
  5227. °¿} def
  5228. °¿/M                    % miterlimit M -
  5229. °¿{
  5230. °¿setmiterlimit
  5231. °¿} def
  5232. °¿/w                    % linewidth w -
  5233. °¿{
  5234. °¿
  5235. setlinewidth
  5236. °¿} def
  5237. °¿% path painting operators
  5238. °¿/H                    % - H -
  5239. °¿{} def
  5240. °¿/h                    % - h -
  5241. °¿{
  5242. °¿
  5243. closepath
  5244. °¿} def
  5245. °¿/N                    % - N -
  5246. °¿{
  5247. °¿ _pola 0 eq 
  5248. °¿    {
  5249. °¿)    _doClip 1 eq {clip /_doClip 0 ddef} if 
  5250. °¿        newpath
  5251. °¿    } 
  5252. °¿    {
  5253. °¿    /CRender {N} ddef
  5254. °¿        }ifelse
  5255. °¿} def
  5256. °¿/n                    % - n -
  5257. °¿{N} def
  5258. °¿/F                    % - F -
  5259. °¿{
  5260. °¿ _pola 0 eq 
  5261. °¿    {
  5262. °¿    _doClip 1 eq 
  5263. °¿        {
  5264. °¿7        gsave _pf grestore clip newpath /_lp /none ddef _fc 
  5265. °¿        /_doClip 0 ddef
  5266. °¿        }
  5267. °¿        {
  5268. °¿        _pf
  5269. °¿
  5270.         }ifelse
  5271. °¿    } 
  5272. °¿    {
  5273. °¿    /CRender {F} ddef
  5274. °¿        }ifelse
  5275. °¿} def
  5276. °¿/f                    % - f -
  5277. °¿{
  5278. °¿
  5279. closepath
  5280. °¿F
  5281. °¿} def
  5282. °¿/S                    % - S -
  5283. °¿{
  5284. °¿ _pola 0 eq 
  5285. °¿    {
  5286. °¿    _doClip 1 eq 
  5287. °¿        {
  5288. °¿7        gsave _ps grestore clip newpath /_lp /none ddef _sc 
  5289. °¿        /_doClip 0 ddef
  5290. °¿        }
  5291. °¿        {
  5292. °¿        _ps
  5293. °¿
  5294.         }ifelse
  5295. °¿    } 
  5296. °¿    {
  5297. °¿    /CRender {S} ddef
  5298. °¿        }ifelse
  5299. °¿} def
  5300. °¿/s                    % - s -
  5301. °¿{
  5302. °¿
  5303. closepath
  5304. °¿S
  5305. °¿} def
  5306. °¿/B                    % - B -
  5307. °¿{
  5308. °¿ _pola 0 eq 
  5309. °¿    {
  5310. °¿"    _doClip 1 eq     % F clears _doClip
  5311. °¿    gsave F grestore 
  5312. °¿        {
  5313. °¿4        gsave S grestore clip newpath /_lp /none ddef _sc
  5314. °¿        /_doClip 0 ddef
  5315. °¿        } 
  5316. °¿        {
  5317. °¿        S
  5318. °¿
  5319.         }ifelse
  5320. °¿    }
  5321. °¿    {
  5322. °¿    /CRender {B} ddef
  5323. °¿        }ifelse
  5324. °¿} def
  5325. °¿/b                    % - b -
  5326. °¿{
  5327. °¿
  5328. closepath
  5329. °¿B
  5330. °¿} def
  5331. °¿/W                    % - W -
  5332. °¿{
  5333. °¿/_doClip 1 ddef
  5334. °¿} def
  5335. °¿/*                    % - [string] * -
  5336. °¿{
  5337. °¿ count 0 ne 
  5338. °¿    {
  5339. °¿#    dup type (stringtype) eq {pop} if
  5340. °¿    } if 
  5341. °¿_pola 0 eq {newpath} if
  5342. °¿} def
  5343. °¿% group operators
  5344. °¿/u                    % - u -
  5345. °¿{} def
  5346. °¿/U                    % - U -
  5347. °¿{} def
  5348. °¿/q                    % - q -
  5349. °¿{
  5350. °¿_pola 0 eq {gsave} if
  5351. °¿} def
  5352. °¿/Q                    % - Q -
  5353. °¿{
  5354. °¿_pola 0 eq {grestore} if
  5355. °¿} def
  5356. °¿/*u                    % - *u -
  5357. °¿{
  5358. °¿_pola 1 add /_pola exch ddef
  5359. °¿} def
  5360. °¿/*U                    % - *U -
  5361. °¿{
  5362. °¿_pola 1 sub /_pola exch ddef 
  5363. °¿_pola 0 eq {CRender} if
  5364. °¿} def
  5365. °¿/D                    % polarized D -
  5366. °¿
  5367. {pop} def
  5368. °¿/*w                    % - *w -
  5369. °¿{} def
  5370. °¿/*W                    % - *W -
  5371. °¿{} def
  5372. °¿% place operators
  5373. °¿+/`                    % matrix llx lly urx ury string ` -
  5374. °¿{
  5375. °¿/_i save ddef
  5376. °¿6 1 roll 4 npop
  5377. °¿ concat pop
  5378. °¿userdict begin
  5379. °¿/showpage {} def
  5380. °¿
  5381. 0 setgray
  5382. °¿
  5383. 0 setlinecap
  5384. °¿1 setlinewidth
  5385. °¿0 setlinejoin
  5386. °¿10 setmiterlimit
  5387. °¿
  5388. [] 0 setdash
  5389. °¿newpath
  5390. °¿
  5391. 0 setgray
  5392. °¿false setoverprint
  5393. °¿} def
  5394. °¿/~                    % - ~ -
  5395. °¿{
  5396. °¿end
  5397. °¿ _i restore
  5398. °¿} def
  5399. °¿% color operators
  5400. °¿/O                    % flag O -
  5401. °¿{
  5402. °¿0 ne
  5403. °¿/_of exch ddef
  5404. °¿/_lp /none ddef
  5405. °¿} def
  5406. °¿/R                    % flag R -
  5407. °¿{
  5408. °¿0 ne
  5409. °¿/_os exch ddef
  5410. °¿/_lp /none ddef
  5411. °¿} def
  5412. °¿/g                    % gray g -
  5413. °¿{
  5414. °¿/_gf exch ddef
  5415. °¿/_fc
  5416. °¿{ 
  5417. °¿
  5418. _lp /fill ne
  5419. °¿    {
  5420. °¿    _of setoverprint
  5421. °¿
  5422.     _gf setgray
  5423. °¿    /_lp /fill ddef
  5424. °¿    } if
  5425. °¿} ddef
  5426. °¿/_pf
  5427. °¿{
  5428. °¿_fc
  5429. °¿fill
  5430. °¿} ddef
  5431. °¿/_psf
  5432. °¿{
  5433. °¿_fc
  5434. °¿ashow
  5435. °¿} ddef
  5436. °¿/_pjsf
  5437. °¿{
  5438. °¿_fc
  5439. °¿ awidthshow
  5440. °¿} ddef
  5441. °¿/_lp /none ddef
  5442. °¿} def
  5443. °¿/G                    % gray G -
  5444. °¿{
  5445. °¿/_gs exch ddef
  5446. °¿/_sc
  5447. °¿{
  5448. °¿_lp /stroke ne
  5449. °¿    {
  5450. °¿    _os setoverprint
  5451. °¿
  5452.     _gs setgray
  5453. °¿    /_lp /stroke ddef
  5454. °¿    } if
  5455. °¿} ddef
  5456. °¿/_ps
  5457. °¿{
  5458. °¿_sc
  5459. °¿stroke
  5460. °¿} ddef
  5461. °¿/_pss
  5462. °¿{
  5463. °¿_sc
  5464. °¿ss
  5465. °¿} ddef
  5466. °¿/_pjss
  5467. °¿{
  5468. °¿_sc
  5469. °¿jss
  5470. °¿} ddef
  5471. °¿/_lp /none ddef
  5472. °¿} def
  5473. °¿'/k                    % cyan magenta yellow black k -
  5474. °¿{
  5475. °¿_cf astore pop
  5476. °¿/_fc
  5477. °¿{
  5478. °¿
  5479. _lp /fill ne
  5480. °¿    {
  5481. °¿    _of setoverprint
  5482. °¿    _cf aload pop setcmykcolor
  5483. °¿    /_lp /fill ddef
  5484. °¿    } if
  5485. °¿} ddef
  5486. °¿/_pf
  5487. °¿{
  5488. °¿_fc
  5489. °¿fill
  5490. °¿} ddef
  5491. °¿/_psf
  5492. °¿{
  5493. °¿_fc
  5494. °¿ashow
  5495. °¿} ddef
  5496. °¿/_pjsf
  5497. °¿{
  5498. °¿_fc
  5499. °¿ awidthshow
  5500. °¿} ddef
  5501. °¿/_lp /none ddef
  5502. °¿} def
  5503. °¿'/K                    % cyan magenta yellow black K -
  5504. °¿{
  5505. °¿_cs astore pop
  5506. °¿/_sc
  5507. °¿{
  5508. °¿_lp /stroke ne
  5509. °¿    {
  5510. °¿    _os setoverprint
  5511. °¿    _cs aload pop setcmykcolor
  5512. °¿    /_lp /stroke ddef
  5513. °¿    } if
  5514. °¿} ddef
  5515. °¿/_ps
  5516. °¿{
  5517. °¿_sc
  5518. °¿stroke
  5519. °¿} ddef
  5520. °¿/_pss
  5521. °¿{
  5522. °¿_sc
  5523. °¿ss
  5524. °¿} ddef
  5525. °¿/_pjss
  5526. °¿{
  5527. °¿_sc
  5528. °¿jss
  5529. °¿} ddef
  5530. °¿/_lp /none ddef
  5531. °¿} def
  5532. °¿1/x                    % cyan magenta yellow black name gray x -
  5533. °¿{
  5534. °¿/_gf exch ddef
  5535. °¿findcmykcustomcolor
  5536. °¿/_if exch ddef
  5537. °¿/_fc
  5538. °¿{ 
  5539. °¿
  5540. _lp /fill ne
  5541. °¿    {
  5542. °¿    _of setoverprint
  5543. °¿#    _if _gf 1 exch sub setcustomcolor
  5544. °¿    /_lp /fill ddef
  5545. °¿    } if
  5546. °¿} ddef
  5547. °¿/_pf
  5548. °¿{
  5549. °¿_fc
  5550. °¿fill
  5551. °¿} ddef
  5552. °¿/_psf
  5553. °¿{
  5554. °¿_fc
  5555. °¿ashow
  5556. °¿} ddef
  5557. °¿/_pjsf
  5558. °¿{
  5559. °¿_fc
  5560. °¿ awidthshow
  5561. °¿} ddef
  5562. °¿/_lp /none ddef
  5563. °¿} def
  5564. °¿1/X                    % cyan magenta yellow black name gray X -
  5565. °¿{
  5566. °¿/_gs exch ddef
  5567. °¿findcmykcustomcolor
  5568. °¿/_is exch ddef
  5569. °¿/_sc
  5570. °¿{
  5571. °¿_lp /stroke ne
  5572. °¿    {
  5573. °¿    _os setoverprint
  5574. °¿#    _is _gs 1 exch sub setcustomcolor
  5575. °¿    /_lp /stroke ddef
  5576. °¿    } if
  5577. °¿} ddef
  5578. °¿/_ps
  5579. °¿{
  5580. °¿_sc
  5581. °¿stroke
  5582. °¿} ddef
  5583. °¿/_pss
  5584. °¿{
  5585. °¿_sc
  5586. °¿ss
  5587. °¿} ddef
  5588. °¿/_pjss
  5589. °¿{
  5590. °¿_sc
  5591. °¿jss
  5592. °¿} ddef
  5593. °¿/_lp /none ddef
  5594. °¿} def
  5595. °¿% locked object operator
  5596. °¿/A                    % value A -
  5597. °¿{
  5598. °¿pop
  5599. °¿} def
  5600. °¿currentdict readonly pop end
  5601. °¿ setpacking
  5602. °¿% annotate page operator
  5603. °¿/annotatepage
  5604. °¿{
  5605. °¿} def
  5606. °¿%%EndResource
  5607. °¿%/showpage{}def
  5608. °¿/copypage{}def
  5609. °¿[-106 193 6 33]
  5610. °¿[newpath clippath pathbbox]
  5611. °¿
  5612. 2 dict begin
  5613. °¿ /d exch def
  5614. °¿ /s exch def
  5615. °¿d 0 get d 1 get translate
  5616. °¿,d 2 get d 0 get sub s 2 get s 0 get sub div
  5617. °¿,d 3 get d 1 get sub s 3 get s 1 get sub div
  5618. °¿scale
  5619. °¿"s 0 get neg s 1 get neg translate
  5620. °¿end
  5621. °¿ %%EndProlog
  5622. °¿
  5623. %%BeginSetup
  5624. °¿%Adobe_cmykcolor /initialize get exec
  5625. °¿!Adobe_cshow /initialize get exec
  5626. °¿'Adobe_customcolor /initialize get exec
  5627. °¿*Adobe_typography_AI3 /initialize get exec
  5628. °¿,Adobe_IllustratorA_AI3 /initialize get exec
  5629. °¿[
  5630. °¿M39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
  5631. °¿L/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
  5632. °¿I/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
  5633. °¿F/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
  5634. °¿K/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
  5635. °¿A/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
  5636. °¿:/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
  5637. °¿D/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
  5638. °¿C/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
  5639. °¿J/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe
  5640. °¿F/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
  5641. °¿L/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
  5642. °¿H/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
  5643. °¿D/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
  5644. °¿G/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
  5645. °¿F/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
  5646. °¿/hungarumlaut/ogonek/caron
  5647. °¿TE
  5648. °¿8%AI3_BeginEncoding: _Helvetica-Narrow Helvetica-Narrow
  5649. [°¿G/_Helvetica-Narrow/Helvetica-Narrow 0 0 1 TZ
  5650. %AI3_EndEncoding TrueType
  5651. °¿ %%EndSetup
  5652. °¿0 A
  5653. °¿0 O
  5654. °¿0 g
  5655. °¿0 R
  5656. °¿0 G
  5657. °¿0 i°¿ °¿0 J°¿ °¿0 j°¿ °¿0.5 w°¿ °¿10 M°¿ [°¿]0 d°¿
  5658. °¿ %AI3_Note:
  5659. °¿0 D
  5660. °¿-96.453 37.177 m
  5661. °¿-0.453 37.177 L
  5662. °¿-0.453 177.177 L
  5663. °¿-96.453 177.177 L
  5664. °¿-96.453 37.177 L
  5665. °¿b
  5666. °¿1 g
  5667. °¿-98.453 39.177 m
  5668. °¿-2.453 39.177 L
  5669. °¿-2.453 179.177 L
  5670. °¿-98.453 179.177 L
  5671. °¿-98.453 39.177 L
  5672. °¿b
  5673. °¿u
  5674. °¿-98.453 53.927 m
  5675. °¿-2.453 53.927 l
  5676. °¿S
  5677. °¿U
  5678. °¿u
  5679. °¿u
  5680. °¿0 O
  5681. °¿1 g
  5682. °¿2 w°¿
  5683. °¿4.453 105.978 m
  5684. °¿4.453 127.228 L
  5685. °¿-7.797 127.228 L
  5686. °¿-7.797 105.978 L
  5687. °¿4.453 105.978 L
  5688. °¿f
  5689. °¿-1.672 116.603 m
  5690. °¿F
  5691. °¿U
  5692. °¿u
  5693. °¿0 g
  5694. °¿0.25 w°¿
  5695. °¿-3.077 122.045 m
  5696. °¿/-2.838 121.199 -1.959 120.708 -1.113 120.947 c
  5697. °¿.-0.268 121.186 0.224 122.066 -0.016 122.911 c
  5698. °¿.-0.255 123.757 -1.134 124.248 -1.98 124.009 c
  5699. °¿--2.825 123.77 -3.317 122.89 -3.077 122.045 c
  5700. °¿f
  5701. °¿-1.547 122.478 m
  5702. °¿F
  5703. °¿U
  5704. °¿u
  5705. °¿-3.077 116.045 m
  5706. °¿/-2.838 115.199 -1.959 114.708 -1.113 114.947 c
  5707. °¿.-0.268 115.186 0.224 116.066 -0.016 116.911 c
  5708. °¿.-0.255 117.757 -1.134 118.248 -1.98 118.009 c
  5709. °¿--2.825 117.77 -3.317 116.89 -3.077 116.045 c
  5710. °¿f
  5711. °¿-1.547 116.478 m
  5712. °¿F
  5713. °¿U
  5714. °¿u
  5715. °¿-3.077 110.045 m
  5716. °¿/-2.838 109.199 -1.959 108.708 -1.113 108.947 c
  5717. °¿.-0.268 109.186 0.224 110.066 -0.016 110.911 c
  5718. °¿.-0.255 111.757 -1.134 112.248 -1.98 112.009 c
  5719. °¿--2.825 111.77 -3.317 110.89 -3.077 110.045 c
  5720. °¿f
  5721. °¿-1.547 110.478 m
  5722. °¿F
  5723. °¿U
  5724. °¿U
  5725. °¿u
  5726. °¿u
  5727. °¿1 g
  5728. °¿2 w°¿
  5729. °¿-92.547 105.978 m
  5730. °¿-92.547 127.228 L
  5731. °¿-104.797 127.228 L
  5732. °¿-104.797 105.978 L
  5733. °¿-92.547 105.978 L
  5734. °¿f
  5735. °¿-98.672 116.603 m
  5736. °¿F
  5737. °¿U
  5738. °¿u
  5739. °¿0 g
  5740. °¿0.25 w°¿
  5741. °¿-100.077 122.045 m
  5742. °¿2-99.838 121.199 -98.959 120.708 -98.113 120.947 c
  5743. °¿2-97.268 121.186 -96.776 122.066 -97.016 122.911 c
  5744. °¿1-97.255 123.757 -98.134 124.248 -98.98 124.009 c
  5745. °¿2-99.825 123.77 -100.317 122.89 -100.077 122.045 c
  5746. °¿f
  5747. °¿-98.547 122.478 m
  5748. °¿F
  5749. °¿U
  5750. °¿u
  5751. °¿-100.077 116.045 m
  5752. °¿2-99.838 115.199 -98.959 114.708 -98.113 114.947 c
  5753. °¿2-97.268 115.186 -96.776 116.066 -97.016 116.911 c
  5754. °¿1-97.255 117.757 -98.134 118.248 -98.98 118.009 c
  5755. °¿2-99.825 117.77 -100.317 116.89 -100.077 116.045 c
  5756. °¿f
  5757. °¿-98.547 116.478 m
  5758. °¿F
  5759. °¿U
  5760. °¿u
  5761. °¿-100.077 110.045 m
  5762. °¿2-99.838 109.199 -98.959 108.708 -98.113 108.947 c
  5763. °¿2-97.268 109.186 -96.776 110.066 -97.016 110.911 c
  5764. °¿1-97.255 111.757 -98.134 112.248 -98.98 112.009 c
  5765. °¿2-99.825 111.77 -100.317 110.89 -100.077 110.045 c
  5766. °¿f
  5767. °¿-98.547 110.478 m
  5768. °¿F
  5769. °¿U
  5770. °¿U
  5771. °¿u
  5772. °¿0 R
  5773. °¿0 G
  5774. °¿0.5 w°¿
  5775. °¿-98.453 83.427 m
  5776. °¿-2.453 83.427 l
  5777. °¿S
  5778. °¿U
  5779. °¿u
  5780. °¿-97.953 98.177 m
  5781. °¿-1.953 98.177 l
  5782. °¿S
  5783. °¿U
  5784. °¿u
  5785. °¿-98.453 164.427 m
  5786. °¿-2.453 164.427 l
  5787. °¿S
  5788. °¿U
  5789. °¿u
  5790. °¿-98.453 134.927 m
  5791. °¿-2.453 134.927 l
  5792. °¿S
  5793. °¿U
  5794. °¿0 To
  5795. °¿1 0 0 1 -50 168.75 0 Tp
  5796. °¿TP
  5797. °¿-31.5725 0 Td
  5798. °¿0 Tr
  5799. °¿0 O
  5800. °¿0 g
  5801. °¿1 w°¿ °¿4 M°¿
  5802. °¿/_Helvetica-Narrow 9 Tf
  5803. °¿0 Ts
  5804. °¿100 Tz
  5805. °¿0 Tt
  5806. °¿0 TA
  5807. °¿    0 0 5 TC
  5808. °¿100 100 200 TW
  5809. °¿    0 0 0 Ti
  5810. °¿1 Ta
  5811. °¿0 Tq
  5812. °¿28 0 Tl
  5813. °¿0 Tc
  5814. °¿0 Tw
  5815. °¿(length of first buffer)°¿ Tx°¿ 
  5816. °¿(\r) TX°¿ 
  5817. °¿TO
  5818. °¿0 To
  5819. °¿1 0 0 1 -50 87.75 0 Tp
  5820. °¿TP
  5821. °¿-31.3704 0 Td
  5822. °¿0 Tr
  5823. °¿(length of last buffer)°¿ Tx°¿ 
  5824. °¿(\r) TX°¿ 
  5825. °¿TO
  5826. °¿0 R
  5827. °¿0 G
  5828. °¿0.5 w°¿
  5829. °¿-98.453 179.177 m
  5830. °¿-93.5 179.177 l
  5831. °¿S
  5832. °¿-98.453 171.8203 m
  5833. °¿-93.5 171.8203 l
  5834. °¿S
  5835. °¿-98.453 164.4635 m
  5836. °¿-93.5 164.4635 l
  5837. °¿S
  5838. °¿-98.453 157.1068 m
  5839. °¿-93.5 157.1068 l
  5840. °¿S
  5841. °¿-98.453 149.7501 m
  5842. °¿-93.5 149.7501 l
  5843. °¿S
  5844. °¿u
  5845. °¿-98.453 149.7501 m
  5846. °¿-93.5 149.7501 l
  5847. °¿S
  5848. °¿-98.453 142.3934 m
  5849. °¿-93.5 142.3934 l
  5850. °¿S
  5851. °¿U
  5852. °¿u
  5853. °¿-98.453 98.1799 m
  5854. °¿-93.5 98.1799 l
  5855. °¿S
  5856. °¿-98.453 90.8232 m
  5857. °¿-93.5 90.8232 l
  5858. °¿S
  5859. °¿U
  5860. °¿u
  5861. °¿-98.453 90.7501 m
  5862. °¿-93.5 90.7501 l
  5863. °¿S
  5864. °¿-98.453 83.3934 m
  5865. °¿-93.5 83.3934 l
  5866. °¿S
  5867. °¿-98.453 76.0367 m
  5868. °¿-93.5 76.0367 l
  5869. °¿S
  5870. °¿-98.453 61.3232 m
  5871. °¿-93.5 61.3232 l
  5872. °¿S
  5873. °¿-98.453 68.7867 m
  5874. °¿-93.5 68.7867 l
  5875. °¿S
  5876. °¿U
  5877. °¿u
  5878. °¿-98.453 61.2501 m
  5879. °¿-93.5 61.2501 l
  5880. °¿S
  5881. °¿-98.453 53.8934 m
  5882. °¿-93.5 53.8934 l
  5883. °¿S
  5884. °¿-98.453 46.5367 m
  5885. °¿-93.5 46.5367 l
  5886. °¿S
  5887. °¿-98.453 39.1799 m
  5888. °¿-93.5 39.1799 l
  5889. °¿S
  5890. °¿U
  5891. °¿0 To
  5892. °¿1 0 0 1 -50 147.5 0 Tp
  5893. °¿TP
  5894. °¿-32.8008 0 Td
  5895. °¿0 Tr
  5896. °¿0 O
  5897. °¿0 g
  5898. °¿1 w°¿
  5899. °¿(pointer to first buffer)°¿ Tx°¿ 
  5900. °¿(\r) TX°¿ 
  5901. °¿TO
  5902. °¿0 To
  5903. °¿1 0 0 1 -50 67.5 0 Tp
  5904. °¿TP
  5905. °¿-32.5986 0 Td
  5906. °¿0 Tr
  5907. °¿(pointer to last buffer)°¿ Tx°¿ 
  5908. °¿(\r) TX°¿ 
  5909. °¿TO
  5910. °¿0 To
  5911. °¿1 0 0 1 -50 44.5 0 Tp
  5912. °¿TP
  5913. °¿-18.6504 0 Td
  5914. °¿0 Tr
  5915. °¿(zero \(word\))°¿ Tx°¿ 
  5916. °¿(\r) TX°¿ 
  5917. °¿TO
  5918. °¿0 R
  5919. °¿0 G
  5920. °¿0.5 w°¿
  5921. °¿-7.703 171.8203 m
  5922. °¿-2.75 171.8203 l
  5923. °¿S
  5924. °¿-7.703 157.1068 m
  5925. °¿-2.75 157.1068 l
  5926. °¿S
  5927. °¿-7.703 149.7501 m
  5928. °¿-2.75 149.7501 l
  5929. °¿S
  5930. °¿u
  5931. °¿-7.703 149.7501 m
  5932. °¿-2.75 149.7501 l
  5933. °¿S
  5934. °¿-7.703 142.3934 m
  5935. °¿-2.75 142.3934 l
  5936. °¿S
  5937. °¿U
  5938. °¿u
  5939. °¿-7.703 90.7501 m
  5940. °¿-2.75 90.7501 l
  5941. °¿S
  5942. °¿-7.703 83.3934 m
  5943. °¿-2.75 83.3934 l
  5944. °¿S
  5945. °¿-7.703 76.0367 m
  5946. °¿-2.75 76.0367 l
  5947. °¿S
  5948. °¿-7.703 61.3232 m
  5949. °¿-2.75 61.3232 l
  5950. °¿S
  5951. °¿-7.703 68.7867 m
  5952. °¿-2.75 68.7867 l
  5953. °¿S
  5954. °¿U
  5955. °¿u
  5956. °¿-7.703 61.2501 m
  5957. °¿-2.75 61.2501 l
  5958. °¿S
  5959. °¿-7.703 53.8934 m
  5960. °¿-2.75 53.8934 l
  5961. °¿S
  5962. °¿-7.703 46.5367 m
  5963. °¿-2.75 46.5367 l
  5964. °¿S
  5965. °¿-7.703 39.1799 m
  5966. °¿-2.75 39.1799 l
  5967. °¿S
  5968. °¿U
  5969. °¿0 To
  5970. °¿1 0 0 1 -50 183.25 0 Tp
  5971. °¿TP
  5972. °¿
  5973. -8.8154 0 Td
  5974. °¿0 Tr
  5975. °¿0 O
  5976. °¿0 g
  5977. °¿1 w°¿
  5978. °¿(8 bits)°¿ Tx°¿ 
  5979. °¿(\r) TX°¿ 
  5980. °¿TO
  5981. °¿%%PageTrailer
  5982. °¿
  5983. %%Trailer
  5984. °¿+Adobe_IllustratorA_AI3 /terminate get exec
  5985. °¿)Adobe_typography_AI3 /terminate get exec
  5986. °¿&Adobe_customcolor /terminate get exec
  5987. °¿ Adobe_cshow /terminate get exec
  5988. °¿$Adobe_cmykcolor /terminate get exec
  5989. °¿&Adobe_packedarray /terminate get exec
  5990. °¿%%EndDocument
  5991. †ø `◊#ˇ ˇˇˇˇ#◊ 
  5992. d,N Helvetica Narrow
  5993. .°dONLNdÆ,+ÃHReceive buffer area,Times
  5994. °dONLNd7ÆB*EThe User Datagram Protocol (UDP) does not allocate memory for storing°dONLNdZEÆP˘*FUDP stream databases or for buffering received datagrams. Instead, you°dONLNd°SÆ^*Emust pass UDP enough memory for these purposes in the UDPCreate call.°dONLNdÁaÆl*This has two advantages:, p    AppleIconp
  5995. °dONLNduÆ}≥*n
  5996. °dONLNdsª~)
  5997. FThe buffer memory can be allocated off the application heap instead of°dONLNdIŪåk*'the system heap, which is very limited.p
  5998. °dONLNdqïÆù≥(∫Ãn
  5999. °dONLNdsìªû)
  6000. DYou have control over the buffering provided by UDP and can allocate°dONLNd∏°ª¨Ó*@the appropriate amount of memory for the type of application and°dONLNd˘Øª∫5*performance level desired.°dONLNdƒÆœ(ÎÃGThis buffer area for incoming datagrams belongs to the MacTCP driver as°dONLNd\“Æ›
  6001. *Ilong as the UDP stream is open. When UDPRelease is called, this memory is°dONLNd¶‡ÆÎ‰*Ereturned to you and you can then reuse it or return it to the system.
  6002. °dONLNdÏTé(0r    Using UDP
  6003. °dONLNdˆÆ*+ZITo send or receive UDP datagrams, you must first call UDPCreate to create°dONLNd@-Æ8*Ka UDP stream, creating a port listener for the given UDP port and passing a°dONLNdå;ÆF*Fmemory block to the UDP driver to use in buffering incoming datagrams.°dONLNd”IÆT*HUDPCreate also registers an asynchronous notification routine (ASR) that°dONLNdWÆb¸*FUDP uses to notify you of asynchronous events associated with this UDP°dONLNdceÆpÕ*9stream. The MacTCP driver can support 63 open UDP streams°dONLNdùsÆ~˜*Esimultaneously. The RIP process always has a stream open on port 520.°dONLNd„àÆì*GTo receive a UDP datagram, call UDPRead. Then, when you finish with the°dONLNd+ñưÚ*Ebuffer that holds the received datagram, call UDPBfrReturn. To send a°dONLNdq§ÆØÚ*CUDP datagram, call UDPWrite. When you finish using a UDP port, call°dONLNdµ≤ÆΩZ*#UDPRelease to close the UDP stream.°dONLNdŸƒÆœ«*Note:°dONLNdfiƒ«œÒ)A  Use of link-level packets larger than the maximum transfer unit°dONLNd “Æ›Ò(˘ÃD(MTU) on LocalTalk networks is not advised because there are several°dONLNde‡ÆÎÈ*Bproblems with these packets on Datagram Delivery Protocol-Internet°dONLNd®ÓÆ˘¸*DProtocol (DDP-IP) gateways. The packet MTU size should be negotiated°dONLNd̸Æ$*by upper-layer protocols.(Ÿ„    Using UDP
  6004. );13 ÃpÃ)ˇò◊#ˇ ˇˇˇˇ#◊ 
  6005. d,N Helvetica Narrow
  6006. .°dONLNd-d+<I UDP routines,Times
  6007. °dONLNd
  6008. 8xCø+ZHThis section describes calls to the UDP driver. Table 3-1 lists each UDP°dONLNdVFxQÁ*routine and its function.
  6009. °dONLNdpbxmú*    Table 3-1°dONLNdybúm“)$  UDP routines
  6010. °dONLNdàvx~ë(õñRoutine°dONLNdêv“~Ó)ZFunction èîèÛ °î°Û
  6011. °dONLNdôàxì§(Øñ    UDPCreate°dONLNd£à“ì)ZOpens a UDP stream°dONLNd∂óx¢ù(æñUDPRead°dONLNdæó“¢É)Z-Retrieves a datagram received on a UDP stream°dONLNd϶x±≤(Õñ UDPBfrReturn°dONLNd˘¶“±r)Z*Returns a receive buffer to the UDP driver°dONLNd$µx¿†(‹ñUDPWrite°dONLNd-µ“¿U)Z Sends a datagram on a UDP stream°dONLNdNƒxœ¶(Îñ
  6012. UDPRelease°dONLNdYƒ“œ )ZCloses a UDP stream°dONLNdm”xfiú(˙ñUDPMTU°dONLNdt”“fi“)ZCReturns the maximum size of UDP data that can be sent in a datagram°dONLNd∏fl“Í/* without IP fragmentation°dONLNd—Óx˘À(ñUDP Multiport Create°dONLNdÊÓ“˘û)Z6Opens UDP connections on a consecutive series of ports°dONLNd˝xƒ($ñUDP Multiport Send°dONLNd0˝“f)Z&Sends a datagram from a specified port°dONLNdX xÕ(3ñUDP Multiport Receive°dONLNdn “Ã)ZAReceives data from a port that was created with the UDP Multiport°dONLNd∞“#* Create command KîKÛ(Ÿ<14
  6013. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ◊#ˇ ˇˇˇˇ#◊ 
  6014. d,N Helvetica Narrow
  6015. .°dONLNdT-ì+rI    UDPCreate,Times
  6016. °dONLNd
  6017. 8UC°+Parameter block,    Symbol°dONLNd7ÆCπ)YưdONLNd8€CÁ)-26°dONLNd8C)-word°dONLNd$85Cì)-csCode =UPDCreate°dONLNd6IÆUπ(qè°dONLNd8J€UÁ)-28°dONLNd;JU)-long°dONLNd@J5Uw)-stream pointer°dONLNdO[Ægπ(ÉÃÆ°dONLNdQ\€gÁ)-32°dONLNdT\g)-long°dONLNdY\5gª)-pointer to receive buffer area°dONLNdxmÆyπ(ïÃÆ°dONLNdzn€yÁ)-36°dONLNd}ny)-long°dONLNdÇn5y∏)-length of receive buffer area°dONLNd†Æãπ(ßÃÆ°dONLNd¢Ä€ãÁ)-40°dONLNd•Äã)-long°dONLNd™Ä5ã)-,pointer to asynchronous notification routine°dONLNd◊é5ôR*(ASR)°dONLNd›üÆ´π(«Ã´°dONLNdfl†€´Á)-44°dONLNd‚†´)-word°dONLNdÁ†5´z)-local UDP port°dONLNdˆ±ÆΩπ(ŸÃưdONLNd¯≤€ΩÁ)-46°dONLNd˚≤Ω)-long°dONLNd≤5ΩÇ)-user data pointer°dONLNd«Æ“·(ÓÃ>UDPCreate opens a UDP stream. It must be called before any UDP°dONLNdQ’Ƈ˜*Edatagrams can be sent or received on a particular UDP port. UDPCreate°dONLNdó„ÆÓ*Kreturns a stream pointer that must be used in all subsequent UDP calls that°dONLNd„ÒÆ¸/*operate on this UDP stream.°dONLNdˇÆÙ*FThe receive buffer area is a block of memory that you must give to the°dONLNdFƯ*CUDP driver. UDP uses this memory to buffer incoming datagrams. This°dONLNdä"Æ-¯*Eblock of memory belongs to UDP while the stream is open; it cannot be°dONLNd–0Æ;˚*Emodified or relocated until UDPRelease is called. The minimum allowed°dONLNd>ÆIˇ*Msize of the receive buffer area is 2048 bytes, but it should be at least 2N +°dONLNddLÆW‡*D256 bytes in length, where N is the size in bytes of the largest UDP°dONLNd©ZÆe*Kdatagram you expect to receive. If you expect to receive datagrams that are°dONLNdıhÆs„*>of the physical Maximum Transmission Unit (MTU) size, make the°dONLNd4vÆÅ˚*CUDPMTU call and use the returned number N to calculate memory size.°dONLNdxãÆñ*GThe ASR is called by UDP to notify the user of asynchronous events such°dONLNd¿ôƧ*Ias data arrival and Internet Control Message Protocol (ICMP) messages. If°dONLNd
  6018. ߯≤*Kthe routine is 0, you are not notified of asynchronous events. See the next°dONLNdVµÆ¿Œ*:section, “UDP Asynchronous Notification Routine,” for more°dONLNdë√ÆŒË* information.°dONLNdûÿÆ„´*9If the local port is 0, UDP assigns an unused local port.°dONLNdÿÌÆ¯˝*IThe user data pointer is returned in all ASRs for the created UDP stream.°dONLNd"U
  6019. é()s Result codes°dONLNd/Æ
  6020. …)YnoErr°dONLNd55
  6021. [)áno error°dONLNd>Æ
  6022. (;ÃstreamAlreadyOpen°dONLNdP5¸)á,an open stream is already using this receive°dONLNd}"5-h* buffer area°dONLNdâ4Æ?Ó([Ã
  6023. invalidLength°dONLNdó45?”)á$the receive buffer area is too small°dONLNdºFÆQÎ(mÃ
  6024. invalidBufPtr°dONLNd F5Q”)á$the receive buffer area pointer is 0°dONLNdÔXÆc˜(ÃduplicateSocket°dONLNdˇX5cÚ)á*an open stream is already using this local°dONLNd*f5qa*UDP port°dONLNd3xÆÉ(üÃinsufficientResources°dONLNdIx5Éœ)á64 UDP streams are already open+Ü: UDP routines
  6025. )E15 ÃpÃ)ˇ
  6026. ‹◊#ˇ ˇˇˇˇ#◊ 
  6027. d,N Helvetica Narrow
  6028. .°dONLNdx,"+ñH%UDP asynchronous notification routine,Times
  6029. °dONLNd&6xA¬*FThe asynchronous notification routine (ASR), which was registered with°dONLNdmDxOì*<UDP in the UDPCreate call, is called by UDP to notify you of°dONLNd™Rx]~*8asynchronous events relevant to a particular UDP stream.°dONLNd„gxr”*OSince this routine is called from the interrupt level, you must not allocate or°dONLNd3uxÄ√*Freturn memory to the system. Also, you are not allowed to make further°dONLNdzÉxé…*Fsynchronous MacTCP calls from an ASR. The values of all registers must°dONLNd¡ëxú]*.be preserved except registers A0–A2 and D0–D2.°dONLNd≠x∏=*+The C description of the ASR is as follows:,
  6030. Courier
  6031. °dONLNdæx *pascal void UDPNotifyProc (°dONLNd9Ãñÿ+StreamPtr udpStream,°dONLNdO⁄ñÊ,*unsigned short eventCode,°dONLNdjËñÙˆ*Ptr userDataPtr,°dONLNd|ˆñ>*struct ICMPReport *icmpMsg);°dONLNdô x¥(3ñ
  6032. NotifyProc
  6033. °dONLNd£ ¥“)<@ is passed to the UDPCreate call for use on notification of data°dONLNd‰x%Δ(AñIarrival and ICMP message reception. If this method of notification is not°dONLNd.(x3æ*Fdesired, no procedure should be passed to the UDPCreate call. (Pass an°dONLNdu6xAΩ*EASR pointer value of NIL.) Asynchronous notification is used with the°dONLNdªDxO‘*DUDPRead command only. All other commands complete in a finite amount°dONLNdRx]6*(of time and can be called synchronously.°dONLNd)gxr”*KAt entry, A0 contains the stream pointer, A1 contains a pointer to the ICMP°dONLNduuxÄ…*Jreport structure if the event code in D0 is ICMP received, A2 contains the°dONLNd¿Éxé»*Luser data pointer, A5 is already set up to point to application globals, and°dONLNd
  6034. ëxú*!D0 (word) contains an event code.°dONLNd/¶±U(Õ< Event codes°dONLNd;¶x±√)ZUDPDataArrival°dONLNdJ¶ˇ±√)á)a UDP datagram has arrived on this stream°dONLNdv¥ˇøÃ*'but no UDPRead commands are outstanding°dONLNdûΔx—“(ÌñUDPICMPReceived°dONLNdÆΔˇ—¬)á)an ICMP has been received on this stream;°dONLNdÿ‘ˇfl´*%register A1 points to the ICMP report°dONLNd˛ÈxÙ”(ñIAn ICMP message reports an error in the processing of a datagram that was°dONLNdH˜xŒ*Hsent on a UDP stream. When an ICMP message is received, a data structure°dONLNdëx¬*His passed up by UDP to the client to describe the received message. This°dONLNd⁄xö*@data structure, called an ICMP report, has the following format:°dONLNd(x3~*0°dONLNd(•3∫)-long°dONLNd"(“3)-stream pointer°dONLNd1=xH~(dñ4°dONLNd3=•H∫)-long°dONLNd8=“HH)-local IP address of stream°dONLNdSRx]~(yñ8°dONLNdUR•]º)-word°dONLNdZR“]E)-local UDP port of stream°dONLNdsgxrÑ(éñ10°dONLNdvg•r∫)-long°dONLNd{g“r√)-4remote IP address (destination of original datagram)°dONLNd∞|xáÑ(£ñ14°dONLNd≥|•áº)-word°dONLNd∏|“á!)-remote UDP port
  6035. (Ÿ<16
  6036. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ p◊#ˇ ˇˇˇˇ#◊ 
  6037. d,Times
  6038. .°dONLNd!Æ,∫+ÃH16°dONLNd!€,Ú)-word°dONLNd!,c)-ICMP message type°dONLNd6ÆA∫(]Ã18°dONLNd6€AÚ)-word°dONLNd"6Aô)-optional additional information°dONLNdBKÆV∫(rÃ20°dONLNdEK€V)-long°dONLNdJKVΩ)-'optional additional information pointer°dONLNdrgÆr£(éÃ4The values for the ICMP message type are as follows:°dONLNdß|Æá¥*0°dONLNd©|€á;)-network unreachable°dONLNdΩëÆú¥(∏Ã1°dONLNdøë€ú))-host unreachable°dONLNd–¶Æ±¥(ÕÃ2°dONLNd“¶€±=)-protocol unreachable°dONLNdÁªÆΔ¥(‚Ã3°dONLNdȪ€Δ))-port unreachable°dONLNd˙–Æ€¥(˜Ã4°dONLNd¸–€€F)-fragmentation required°dONLNdÂÆ¥( Ã5°dONLNd€1)-source route failed°dONLNd)˙Æ¥(!Ã6°dONLNd+˙€)-
  6039. time exceeded°dONLNd9Æ¥(6Ã7°dONLNd;€3)-parameter problem°dONLNdM$Æ/¥(KÃ8°dONLNdO$€/I)-missing required option°dONLNdg@ÆKI(gÃ!Codes 0–3 are defined as follows:, p    AppleIconp
  6040. °dONLNdâTÆ\≥*n
  6041. °dONLNdãRª]„)
  6042. ANet unreachable indicates that, according to the information in a°dONLNdÕ`ªk    *Kgateway routing table, the network specified in the IP destination field of°dONLNdnªyO*a UDP datagram is unreachable.p
  6043. °dONLNd8ÇÆä≥(ßÃn
  6044. °dONLNd:ĪãÏ)
  6045. BHost unreachable indicates that a gateway determined that the host°dONLNd}éªôˇ*Gspecified in the IP destination field of a UDP datagram is unreachable.p
  6046. °dONLNdΔ¢Æ™≥(«Ãn
  6047. °dONLNd»†ª´)
  6048. GProtocol unreachable indicates that a UDP datagram was delivered to the°dONLNdƪπÍ*Adestination host, but UDP was not ready to receive any datagrams.p
  6049. °dONLNdR¬Æ ≥(ÁÃn
  6050. °dONLNdT¿ªÀÙ)
  6051. CPort unreachable indicates that a UDP datagram was delivered to the°dONLNdòŒªŸ*Jdestination host, but no UDP client was listening on that particular port.°dONLNd‰ÍÆı(ÃEThese ICMP messages may be received occasionally when the topology of°dONLNd*¯Æ*Ithe internet changes. A single destination unreachable message should not°dONLNdtÆ*Gbe taken too seriously; however, if several successive UDPSend commands°dONLNdºÆ*Meach result in an ICMP report indicating that the destination is unreachable,°dONLNd
  6052. "Æ-*Jthe UDP client should assume that the remote host has either crashed or is°dONLNdU0Æ;*no longer accessible.°dONLNdkEÆPÎ*CThe remaining codes (4–8) indicate problems in the format of the IP°dONLNdØSÆ^˝*Dheader on a UDP datagram. They are informational only. Since the UDP°dONLNdÙaÆl›*Dclient has no access to the IP header, you cannot correct the error.,N Helvetica Narrow(ŸŸ UDP routines
  6053. )E17 ÃpÃ)ˇ“◊#ˇ ˇˇˇˇ#◊ 
  6054. d,N Helvetica Narrow
  6055. .°dONLNd-S+<IUDPRead,Times
  6056. °dONLNd8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd"8˛CY),csCode = UDPRead°dONLNd3IxUÉ(qñưdONLNd5J•U±)-28°dONLNd8J“UÁ)-long°dONLNd=JˇUA)-stream pointer°dONLNdL[xgÉ(ÉñưdONLNdN\•g±)-32°dONLNdQ\“gÈ)-word°dONLNdV\ˇg°)- command timeout value in seconds°dONLNdxjˇu;*(0 = infinite)°dONLNdá{xáÉ(£ñ¨°dONLNdâ|•á±)-34°dONLNdå|“áÁ)-long°dONLNdë|ˇáQ)-remote IP address°dONLNd£çxôÉ(µñ¨°dONLNd•é•ô±)-38°dONLNd®é“ôÈ)-word°dONLNd≠éˇôN)-remote UDP port°dONLNdΩüx´É(«ñ¨°dONLNdø†•´±)-40°dONLNd¬†“´Á)-long°dONLNd«†ˇ´[)-pointer to UDP data°dONLNd€±xΩÉ(Ÿñ¨°dONLNd›≤•Ω±)-44°dONLNd‡≤“ΩÈ)-word°dONLNdÂ≤ˇΩX)-length of UDP data°dONLNd¯√xœÉ(ÎñưdONLNd˙ƒ•œ±)-46°dONLNd˝ƒ“œÈ)-word°dONLNdƒˇœs)-reserved; must be set to 0°dONLNd’x·É(˝ñưdONLNd÷•·±)-48°dONLNd"÷“·Á)-long°dONLNd'÷ˇ·L)-user data pointer°dONLNd9ÎxˆΔ(ñEUDPRead retrieves a datagram that has been received on the UDP stream°dONLNd˘x¬*Ddefined by the stream pointer. Some number of datagrams are buffered°dONLNdƒxœ*Dinternally within UDP even when no UDPRead commands are outstanding,°dONLNd    x ‘*Jso it is not necessary to keep a UDPRead command outstanding at all times.°dONLNdT#x.Δ*DThe exact number of datagrams that can be buffered within the MacTCP°dONLNdô1x<Δ*Hdriver depends on the size of the receive buffer area given to MacTCP in°dONLNd‚?xJs*6the UDPCreate call and the size of datagrams received.°dONLNdTx_¥*>If a UDP datagram arrives on an open UDP stream and no UDPRead°dONLNdXbxm¬*Hcommands are outstanding, you are given a data arrival notification as a°dONLNd°px{¡*Bhint that a UDPRead command should be issued. See the section “UDP°dONLNd‰~xâ¥*CAsynchronous Notification Routine” earlier in this chapter for more°dONLNd(åxó≤* information.°dONLNd5°x¨∂*BThe command timeout period is specified in seconds. If no datagram°dONLNdxØx∫ *Farrives within the timeout period, the UDPRead command is completed in°dONLNdøΩx»Œ*Ferror. The minimum allowed value for the command timeout is 2 seconds.°dONLNdÀx÷Ã*CA zero command timeout means infinite; the UDPRead command will not°dONLNdJŸx‰(*&be completed until a datagram arrives.°dONLNdqÓx˘π*CThe remote IP address and remote UDP port specify the source of the°dONLNdµ¸x¶*    datagram.°dONLNdøx–*HUDPRead can return successfully even though the length of UDP data is 0.°dONLNdx*—*JThis happens when a UDP packet arrives that has the passed-in value of the°dONLNdS-x8¬*DUDP stream’s local UDP port, but contains no data. Since the UDPSend°dONLNdò;xF∏*>command permits sending zero-length UDP datagrams, the UDPRead°dONLNd◊IxTì*8command must pass up zero-length datagrams for symmetry.°dONLNd^xiœ*FFor every UDPRead command that is completed successfully and returns a°dONLNdWlxw”*Gnonzero amount of data, you must call UDPBfrReturn with the same stream°dONLNdüzxÖ∑*Epointer and UDP data pointer, to return the receive buffer to the UDP°dONLNdÂàxì¬*driver for reuse.
  6057. (Ÿ<18
  6058. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇN◊#ˇ ˇˇˇˇ#◊ 
  6059. d,Times
  6060. .°dONLNd!T,ç+rH Result codes°dONLNd
  6061. !Æ,…)ZnoErr°dONLNd!5,[)áno error°dONLNd3Æ>˙(ZÃinvalidStreamPtr°dONLNd-35>fl)á$the specified UDP stream is not open°dONLNdREÆP(lÃcommandTimeout°dONLNdaE5P˜)á+no data arrived within the specified period°dONLNdéWÆb(~ÃconnectionTerminated°dONLNd£W5b)á#a UDPRelease command closed the UDP,N Helvetica Narrow
  6062. °dONLNd»}Tã°(ßr UDPBfrReturn
  6063. °dONLNd’ñT°†*Parameter block,    Symbol°dONLNdÂïÆ°π)ZưdONLNdÁñ€°Á)-26°dONLNdÍñ°)-word°dONLNdÔñ5°ß)-csCode = UDPBfrReturn°dONLNd߯≥π(œÃưdONLNd®€≥Á)-28°dONLNd
  6064. ®≥)-long°dONLNd®5≥w)-stream pointer°dONLNdπÆ≈π(·ÃưdONLNd ∫€≈Á)-40°dONLNd#∫≈)-long°dONLNd(∫5≈ë)-pointer to UDP data°dONLNd<ÀÆ◊π(ÛÃÆ°dONLNd>À◊Á)-48°dONLNdAÃ◊)-long°dONLNdFÃ5◊Ç)-user data pointer°dONLNdX·ÆÏı(ÃEUDPBfrReturn returns a receive buffer to the UDP driver that had been°dONLNdûÔÆ˙„*Bpassed to you because of a successful UDPRead call that returned a°dONLNd·˝Æ *nonzero amount of data.°dONLNd˘Tç(9r Result codes°dONLNdÆ…)ZnoErr°dONLNd 5[)áno error°dONLNd$Æ/˙(KÃinvalidStreamPtr°dONLNd&$5/fl)á$the specified UDP stream is not open°dONLNdK6ÆAÎ(]Ã
  6065. invalidBufPtr°dONLNdY65A)á,the user does not own the UDP receive buffer(ŸŸ UDP routines
  6066. )E19 ÃpÃ)ˇ◊#ˇ ˇˇˇˇ#◊ 
  6067. d,N Helvetica Narrow
  6068. .°dONLNd-T+<IUDPWrite,Times
  6069. °dONLNd    8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd#8ˇC[)-csCode = UDPWrite°dONLNd5IxUÉ(qñưdONLNd7J•U±)-28°dONLNd:J“UÁ)-long°dONLNd?JˇUA)-stream pointer°dONLNdN[xgÉ(ÉñưdONLNdP\•g±)-34°dONLNdS\“gÁ)-long°dONLNdX\ˇgQ)-remote IP address°dONLNdjmxyÉ(ïñưdONLNdln•y±)-38°dONLNdon“yÈ)-word°dONLNdtnˇyN)-remote UDP port°dONLNdÑxãÉ(ßñưdONLNdÜÄ•ã±)-40°dONLNdâÄ“ãÁ)-long°dONLNdéġãF)-pointer to WDS°dONLNdùëxùÉ(πñưdONLNdüí•ù±)-44°dONLNd¢í“ùÊ)-byte°dONLNdßíˇùB)-
  6070. checksum flag°dONLNdµ£xØÉ(ÀñưdONLNd∑§•ر)-46°dONLNd∫§“ØÈ)-word°dONLNdø§ˇØÅ)-reserved; must be set to zero°dONLNd›µx¡É(›ñưdONLNdfl∂•¡±)-48°dONLNd‚∂“¡Á)-long°dONLNdÁ∂ˇ¡L)-user data pointer°dONLNd˘Àx÷L(Úñ*UDPWrite sends a datagram on a UDP stream.°dONLNd%‡xε*DThe datagram’s destination is specified by the remote IP address and°dONLNdjÓx˘Ã*Eremote UDP parameter ports. The buffers described by the WDS must not°dONLNd∞¸x‘*Fbe modified or relocated until the command has been completed. The WDS°dONLNd˜
  6071. x”*Kcan describe up to 6 buffers. The total length of the UDP data described by°dONLNdCx#≈*Fthe WDS must be between 0 and 8,192 inclusive. If the Checksum flag is°dONLNdä&x1•*>nonzero, UDP computes and transmits a checksum; otherwise, the°dONLNd…4x?¢*Bchecksum is transmitted as 0. The reserved field must be set to 0.°dONLNd IxT±*BIn an Ethernet environment, the size of UDPWrite packets should be°dONLNdOWxb≤*Hrestricted to less than or equal to 8192 bytes. Packets of this size can°dONLNdòexpÕ*Gusually be reassembled by computers operating in Ethernet environments.°dONLNd‡sx~≥*BIn a LocalTalk environment, the size of UDPWrite packets should be°dONLNd#Åxå—*Krestricted to less than or equal to 1458 bytes because of Datagram Delivery°dONLNdoèxöŒ*GProtocol-Internet Protocol (DDP-IP) gateway performance considerations.°dONLNd∑°x¨ë*Note:°dONLNdº°ë¨£)<  Unless you have prior knowledge of the capabilities of the°dONLNd˘Øx∫∑(÷ñEdestination machine, the UDPWrite size should be limited to the value°dONLNd?Ωx»î*9returned by the UDPMTU call for maximum interoperability.°dONLNdy“›W(˘< Result codes°dONLNdÜ“x›ì)ZnoErr°dONLNd哎›%)áno error°dONLNdï‰xÔƒ( ñinvalidStreamPtr°dONLNd¶‰ˇÔ©)á$the specified UDP stream is not open°dONLNdÀˆxÆ(ñ
  6072. invalidWDS°dONLNd÷ˆˇ—)á*too many buffers are in WDS or WDS pointer°dONLNdˇ*is NIL°dONLNd    x!∏(=ñ
  6073. invalidLength°dONLNdˇ!º)á)the total amount of data described by the°dONLNdA$x/í(KñWDS °dONLNdF$ˇ/á)áwas greater than 65,535 bytes°dONLNdd6xA⁄(]ñinsufficientResources°dONLNdz6ˇA«)á*too many datagrams are outstanding in the °dONLNd•DˇOC*transmit queue°dONLNd¥VxaÀ(}ñipNoFragMemErr°dONLNd√Vˇa–)á.insufficient internal memory was available to °dONLNdÚdˇo[*fragment the packet°dONLNdvxÅ´(ùñ
  6074. ipRouteErr°dONLNdvˇÅÀ)á,unable to send the packet to an off-network °dONLNd>Ñˇèø*)destination because all gateways are down
  6075. (Ÿ<20
  6076. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ h◊#ˇ ˇˇˇˇ#◊ 
  6077. d,N Helvetica Narrow
  6078. .°dONLNdT-ó+rI
  6079. UDPRelease,Times
  6080. °dONLNd 8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd8€CÁ)-26°dONLNd 8C)-word°dONLNd%85Cõ)-csCode = UDPRelease°dONLNd9IÆUπ(qÃÆ°dONLNd;J€UÁ)-28°dONLNd>JU)-long°dONLNdCJ5Uw)-stream pointer°dONLNdR[Ægπ(Éè°dONLNdT\€gÁ)-32°dONLNdW\g)-long°dONLNd\\5gª)-pointer to receive buffer area°dONLNd{mÆyπ(ïè°dONLNd}n€yÁ)-36°dONLNdÄny)-long°dONLNdÖn5y∏)-length of receive buffer area°dONLNd£Æãπ(ßÃÆ°dONLNd•Ä€ãÁ)-46°dONLNd®Äã)-long°dONLNd≠Ä5ãÇ)-user data pointer°dONLNdøïƆÒ(ºÃ@UDPRelease closes a UDP stream. Any outstanding commands on that°dONLNd£ÆÆ˙*Hstream are terminated with an error. The ownership of the receive buffer°dONLNdI±Æº™*6area used to create the UDP stream passes back to you.°dONLNdÄΔÆ—›*@Before UDPRelease is called, you must make sure that all pending°dONLNd¡‘ÆflÛ*AUDPWrite commands have been completed. There is no way to abort a°dONLNd‚ÆÌF*UDPWrite command in progress.°dONLNd!ÙÆˇ«*Note:°dONLNd&Ù«ˇ˙)B  UDP Release must be called to release memory that is held by the°dONLNdiÆ
  6081. º()Ã;driver. Failure to do so may produce unpredictable results.°dONLNd¶T"ç(>r Result codes°dONLNd≥Æ"…)ZnoErr°dONLNdπ5"[)áno error°dONLNd¬)Æ4˙(PÃinvalidStreamPtr°dONLNd”)54fl)á$the specified UDP stream is not open
  6082. °dONLNd¯OT]â(yrUDPMTU
  6083. °dONLNdˇhTs†*Parameter block°dONLNdgÆsπ)ZưdONLNdh€sÁ)-26°dONLNdhs)-word°dONLNdh5s∫)-csCode = UDPMaxMTUSize°dONLNd0yÆÖπ(°Ã¨°dONLNd2z€ÖÁ)-32°dONLNd5zÖ)-word°dONLNd:z5Ö¶)-maximum datagram size°dONLNdPãÆóπ(≥ÃÆ°dONLNdRå€óÁ)-34°dONLNdUåó)-long°dONLNdZå5óz)-remote address°dONLNdiùÆ©π(≈ÃÆ°dONLNdkû€©Á)-38°dONLNdnû©)-long°dONLNdsû5©Ç)-user data pointer°dONLNdÖ≥ÆæÒ(⁄ÃAUDPMTU returns the maximum size of UDP data that can be sent in a°dONLNd«¡ÆÃ*Gsingle datagram without fragmentation. This number does not include the°dONLNdœÆ⁄*LIP and UDP headers. The value is relative to the destination address. If the°dONLNd\›ÆË›*Baddress is on the local network, the network MTU size is returned;°dONLNdüÎÆˆW*&otherwise, a value of 548 is returned.°dONLNdΔT ç('r Result codes°dONLNd”Æ …)ZnoErr°dONLNdŸ5 [)áno error+Ü≤ UDP routines
  6084. )E21 ÃpÃ)ˇ ◊#ˇ ˇˇˇˇ#◊ 
  6085. d,N Helvetica Narrow
  6086. .°dONLNd-í+<IUDP Multiport Create,Times
  6087. °dONLNd8Cj*Parameter block,    Symbol°dONLNd%7xCÉ)ZưdONLNd'8•C±)-26°dONLNd*8“CÈ)-word°dONLNd/8ˇCy)-csCode = UDPMultiCreate°dONLNdGIxUÉ(qñ¨°dONLNdIJ•U±)-28°dONLNdLJ“UÁ)-long°dONLNdQJˇUA)-stream pointer°dONLNd`[xgÉ(ÉñưdONLNdb\•g±)-32°dONLNde\“gÁ)-long°dONLNdj\ˇgÖ)-pointer to receive buffer area°dONLNdâmxyÉ(ïñưdONLNdãn•y±)-36°dONLNdén“yÁ)-long°dONLNdìnˇyÇ)-length of receive buffer area°dONLNd±xãÉ(ßñưdONLNd≥Ä•ã±)-40°dONLNd∂Ä“ãÁ)-long°dONLNdªÄˇãŒ)--pointer to asynchronous notification routine °dONLNdÎéˇô*(ASR)°dONLNdÒüx´É(«ñưdONLNdÛ†•´±)-44°dONLNdˆ†“´È)-word°dONLNd˚†ˇ´P)-starting UDP port°dONLNd
  6088. ±xΩÉ(ŸñưdONLNd≤•Ω±)-46°dONLNd≤“ΩÁ)-long°dONLNd≤ˇΩL)-user data pointer°dONLNd)√xœÉ(ÎñưdONLNd+ƒ•œ±)-50°dONLNd.ƒ“œÈ)-word°dONLNd3ƒˇœ5)- ending port°dONLNd?Ÿx‰Δ(ñEUDP Multiport Create opens UDP connections on a consecutive series of°dONLNdÖÁxÚ‘*Oports. This routine is similar to UDPCreate except that it takes a starting and°dONLNd’ıxø*Gending port instead of a single UDP port. The starting port must not be°dONLNdxΔ*Jzero. The connection is established on a range of ports, from the starting°dONLNdhx”*Jport to the ending port, inclusive. The UDP Multiport Send routine must be°dONLNd≥x*¥*Dused with this type of connection stream (see the next section, “UDP°dONLNd¯-x8Œ*IMultiport Send”). Reading datagrams from this type of stream is identical°dONLNdB;xFÀ*Fto UDPRead, except that the receiving port may change from datagram to°dONLNdâIxT¶*    datagram.°dONLNdì^iW(Ö< Result codes°dONLNd†^xiì)ZnoErr°dONLNd¶^ˇi%)áno error°dONLNdØpx{‘(óñstreamAlreadyOpen°dONLNd¡pˇ{Δ)á,an open stream is already using this receive°dONLNdÓ~ˇâ2* buffer area°dONLNd˙êxõ∏(∑ñ
  6089. invalidLength°dONLNd    êˇõù)á$the receive buffer area is too small°dONLNd.¢x≠µ(…ñ
  6090. invalidBufPtr°dONLNd=¢ˇ≠ù)á$the receive buffer area pointer is 0°dONLNdb¥xø¡(€ñduplicateSocket°dONLNds¥ˇøº)á*an open stream is already using this local°dONLNdû¬ˇÕ+*UDP port°dONLNdß‘xfl⁄(˚ñinsufficientResources°dONLNdΩ‘ˇflô)á64 UDP streams are already open
  6091. (Ÿ<22
  6092. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ
  6093. p◊#ˇ ˇˇˇˇ#◊ 
  6094. d,N Helvetica Narrow
  6095. .°dONLNdT-Ω+rIUDP Multiport Send,Times
  6096. °dONLNd8TC†*Parameter block,    Symbol°dONLNd#7ÆCπ)ZưdONLNd%8€CÁ)-26°dONLNd(8C)-word°dONLNd-85C©)-csCode = UDPMultiSend°dONLNdCIÆUπ(qÃÆ°dONLNdEJ€UÁ)-28°dONLNdHJU)-long°dONLNdMJ5Uw)-stream pointer°dONLNd\[Ægπ(ÉÃÆ°dONLNd^\€gÁ)-34°dONLNda\g)-long°dONLNdf\5gá)-remote IP address°dONLNdxmÆyπ(ïÃÆ°dONLNdzn€yÁ)-38°dONLNd}ny)-word°dONLNdÇn5yÑ)-remote UDP port°dONLNdíÆãπ(ßÃÆ°dONLNdîÄ€ãÁ)-40°dONLNdóÄã)-long°dONLNdúÄ5ã|)-pointer to WDS°dONLNd´ëÆùπ(πÃÆ°dONLNd≠í€ùÁ)-44°dONLNd∞íù)-byte°dONLNdµí5ùx)-
  6097. checksum flag°dONLNd√£ÆØπ(ÀÃÆ°dONLNd≈§€ØÁ)-46°dONLNd»§Ø)-word°dONLNdÕ§5Ø[)-reserved°dONLNd÷µÆ¡π(›ÃưdONLNdÿ∂€¡Á)-48°dONLNd€∂¡)-long°dONLNd‡∂5¡Ç)-user data pointer°dONLNdÚ«Æ”π(ÔÃÆ°dONLNdÙ»€”Á)-52°dONLNd˜»”)-word°dONLNd¸»5”a)-
  6098. local port°dONLNd›ÆË›(Ã?UDP Multiport Send sends a datagram from a specified port. (See°dONLNdGÎÆˆÛ* “UDPWrite.”)°dONLNdTT ç('r Result codes°dONLNdaÆ …)ZnoErr°dONLNdg5 [)áno error°dONLNdpÆ˙(9ÃinvalidStreamPtr°dONLNdÇ5fl)á$the specified UDP stream is not open°dONLNdß$Æ/‰(KÃ
  6099. invalidWDS°dONLNd≥$5/)á*too many buffers are in WDS or WDS pointer°dONLNdfi25=R*is NIL°dONLNdÂDÆOÓ(kÃ
  6100. invalidLength°dONLNdÙD5OÚ)á)the total amount of data described by the°dONLNdR5]◊*!WDS was greater than 65,535 bytes°dONLNd@dÆo(ãÃinsufficientResources°dONLNdVd5o˙)á)too many datagrams are outstanding in the°dONLNdÄr5}y*transmit queue°dONLNdèÑÆè(´ÃipNoFragMemErr°dONLNdüÑ5è˙)á,insufficient internal memory is available to°dONLNdÃí5ùë*fragment the packet°dONLNd‡§ÆØ·(ÀÃ
  6101. ipRouteErr°dONLNdϧ5Ø˛)á+unable to send the packet to an off-network°dONLNd≤5Ωı*)destination because all gateways are down(ŸŸ UDP routines
  6102. )D23 ÃpÃ)ˇ
  6103. Æ◊#ˇ ˇˇˇˇ#◊ 
  6104. d,N Helvetica Narrow
  6105. .°dONLNd-ï+<IUDP Multiport Receive,Times
  6106. °dONLNd8Cj*Parameter block,    Symbol°dONLNd&7xCÉ)ZưdONLNd(8•C±)-26°dONLNd+8“CÈ)-word°dONLNd08ˇCs)-csCode = UDPMultiRead°dONLNdFIxUÉ(qñưdONLNdHJ•U±)-28°dONLNdKJ“UÁ)-long°dONLNdPJˇUA)-stream pointer°dONLNd_[xgÉ(ÉñưdONLNda\•g±)-32°dONLNdd\“gÈ)-word°dONLNdi\ˇg°)- command timeout value in seconds°dONLNdãjˇu;*(0 = infinite)°dONLNdö{xáÉ(£ñ¨°dONLNdú|•á±)-34°dONLNdü|“áÁ)-long°dONLNd§|ˇáQ)-remote IP address°dONLNd∂çxôÉ(µñ¨°dONLNd∏é•ô±)-38°dONLNdªé“ôÈ)-word°dONLNd¿éˇôN)-remote UDP port°dONLNd–üx´É(«ñ¨°dONLNd“†•´±)-40°dONLNd’†“´Á)-long°dONLNd⁄†ˇ´[)-pointer to UDP data°dONLNdÓ±xΩÉ(Ÿñ¨°dONLNd≤•Ω±)-44°dONLNdÛ≤“ΩÈ)-word°dONLNd¯≤ˇΩX)-length of UDP data°dONLNd √xœÉ(ÎñưdONLNd
  6107. ƒ•œ±)-46°dONLNdƒ“œÈ)-word°dONLNdƒˇœs)-reserved; must be set to 0°dONLNd0’x·É(˝ñưdONLNd2÷•·±)-48°dONLNd5÷“·Á)-long°dONLNd:÷ˇ·L)-user data pointer°dONLNdLÁxÛÉ(ñ¨°dONLNdN˕۱)-52°dONLNdQË“ÛÁ)-long°dONLNdVˡÛG)-destination host°dONLNdg˘xÉ(!ñ¨°dONLNdi˙•±)-56°dONLNdl˙“È)-word°dONLNdq˙ˇG)-destination port°dONLNdÇxº(6ñDUDP Multiport Receive receives data from a port created with the UDP°dONLNd«x(—*GMultiport Create command. The port and host address on which the packet°dONLNd+x6Æ*Fwas received is specified in the destination port and destination host°dONLNdV9xD„*parameter-block fields.°dONLNdnNYW(u< Result codes°dONLNd{NxYì)ZnoErr°dONLNdÅNˇY%)áno error°dONLNdä`xkƒ(áñinvalidStreamPtr°dONLNdú`ˇk©)á$the specified UDP stream is not open°dONLNd¡rx}Õ(ôñcommandTimeout°dONLNd—rˇ}¡)á+no data arrived within the specified period°dONLNd˛Ñxè‡(´ñconnectionTerminated°dONLNdÑˇè∫)á#a UDPRelease command closed the UDP°dONLNd7íˇù*stream
  6108. (Ÿ<24
  6109. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ
  6110. t◊#ˇ ˇˇˇˇ#◊ 
  6111. d,N Helvetica Narrow
  6112. .°dONLNdT-Ï+rIC parameter-block definitions,Times
  6113. °dONLNd8ÆCÙ+ZEThe following C type definitions are used with parameter-block Device°dONLNddFÆQ*Manager calls to UDP:,
  6114. Courier
  6115. °dONLNdzWÆc*#define UDPCreate°dONLNdåWbcn)¥20°dONLNdèeÆq(çÃ#define UDPRead°dONLNdüebqn)¥21°dONLNd¢sÆ&(õÃ#define UDPBfrReturn°dONLNd∑sbn)¥22°dONLNd∫ÅÆç(©Ã#define UDPWrite°dONLNdÀÅbçn)¥23°dONLNdŒèÆõ(∑Ã#define UDPRelease°dONLNd·èbõn)¥24°dONLNd‰ùÆ©,(≈Ã#define UDPMaxMTUSize°dONLNd˙ùb©n)¥25°dONLNd˝´Æ∑(”Ã#define UDPStatus°dONLNd´b∑n)¥26°dONLNdπÆ≈2(·Ã#define UDPMultiCreate°dONLNd)πb≈n)¥27°dONLNd,«Æ”&(ÔÃ#define UDPMultiSend°dONLNdA«b”n)¥28°dONLNdD’Æ·&(˝Ã#define UDPMultiRead°dONLNdY’b·n)¥29°dONLNd\ÁÆÛP(Ãtypedef enum UDPEventCode {°dONLNdyıÃ>+UDPDataArrival = 1,°dONLNdéÃ,*UDPICMPReceived,°dONLNd†ÃD*lastUDPEvent = 32767°dONLNd∂Ã+ *}UDPEventCode;°dONLNdΔ1Æ=í(YÃ&typedef pascal void (*UDPNotifyProc) (°dONLNdÓ?ÃKD+StreamPtr udpStream,°dONLNdMÃYb*unsigned short eventCode,°dONLNd![Ãg,*Ptr userDataPtr,°dONLNd3iÃut*struct ICMPReport *icmpMsg);°dONLNdP{Æá(£Ã;typedef void (*UDPIOCompletionProc) (struct UDPiopb *iopb);°dONLNdåçÆôn* typedef unsigned short udp_port;
  6116. °dONLNd≠™Æµ˘*DThe following parameter block is used for UDPCreate, UDPMultiCreate,°dONLNdÚ∏Æ√*and UDPRelease calls:
  6117. °dONLNd…Æ’V*typedef struct UDPCreatePB {"°∂°∂°∂°dONLNd&◊ĉ+Ptr °dONLNd+◊5„e)ircvBuff;°dONLNd5ÂÃÒ(
  6118. Í
  6119. unsigned long°dONLNdCÂ5Òw)i rcvBuffLen;°dONLNdPÛÃˇ(Í
  6120. UDPNotifyProc°dONLNd^Û5ˇw)i notifyProc;°dONLNdkÃ
  6121.  ()Íunsigned short°dONLNdz5
  6122. q)i
  6123. localPort;°dONLNdÜÃfi(7ÍPtr°dONLNdä5})i userDataPtr;°dONLNdòÃ)¸(EÍudp_port°dONLNd°5)w)i endingPort;°dONLNd≠+Æ7(SÃ} UDPCreatePB;
  6124. °dONLNdºAãL+›Continued on following page , p    AppleIconp°dONLNdÿ@K
  6125. )x.(ŸïC parameter-block definitions
  6126. )à25 ÃpÃ)ˇf◊#ˇ ˇˇˇˇ#◊ 
  6127. d,
  6128. Courier
  6129. .°dONLNd x,+ñHtypedef struct UDPSendPB {°dONLNd.ñ:Í+unsigned short°dONLNd+.ˇ:5)i    reserved;°dONLNd6<ñH¿(d¥ip_addr°dONLNd><ˇHA)i remoteHost;°dONLNdKJñVΔ(r¥udp_port°dONLNdTJˇVA)i remotePort;°dONLNdaXñd®(Ä¥Ptr°dONLNdeXˇd))iwdsPtr;°dONLNdnfñr¿(é¥Boolean°dONLNdvfˇr5)i    checkSum;°dONLNdÅtñÄÍ(ú¥unsigned short°dONLNdêtˇÄA)i sendLength;°dONLNdùÇñé®(™¥Ptr°dONLNd°ÇˇéG)i userDataPtr;°dONLNdØêñúΔ(∏¥udp_port°dONLNd∏êˇú;)i
  6130. localPort;°dONLNd√ûx™¿(Δñ } UDPSendPB;,Times
  6131. °dONLNd–ªxΔÇ*7The following parameter block is used with the UDPRead,°dONLNd…x‘_*+UDPMultiReceive, and UDPBfrReturn commands:
  6132. °dONLNd4⁄xÊ&*typedef struct UDPReceivePB {°dONLNdSËñÙÍ+unsigned short°dONLNdbË,Ù\)ñtimeOut;°dONLNdlˆñ¿(¥ip_addr°dONLNdtˆ,n)ñ remoteHost;°dONLNdÅñΔ(,¥udp_port°dONLNdä,n)ñ remotePort;°dONLNdóñÆ(:¥Ptr °dONLNdú,\)ñrcvBuff;°dONLNd¶ ñ,Í(H¥unsigned short°dONLNdµ ,,n)ñ rcvBuffLen;°dONLNd¬.ñ:Í(V¥unsigned short°dONLNd—.,:å)ñsecondTimeStamp;°dONLNd„<ñH®(d¥Ptr°dONLNdÁ<,Ht)ñ userDataPtr;°dONLNdıJñV¿(r¥ip_addr°dONLNd˝J,Vb)ñ    destHost;°dONLNdXñdΔ(Ä¥udp_port°dONLNdX,db)ñ    destPort;°dONLNdfxr“(éñ} UDPReceivePB;°dONLNd+xxÑ*typedef struct UDPMTUPB {°dONLNdFÜñíÍ+unsigned short°dONLNdUÜ,í\)ñmtuSize;°dONLNd_îñ†¿(º¥ip_addr°dONLNdgî,†n)ñ remoteHost;°dONLNdt¢ñÆ®( ¥Ptr°dONLNdx¢,Æt)ñ userDataPtr;°dONLNdÖ∞xº∫(ÿñ } UDPMTUPB;,N Helvetica Narrow(Ÿ<26
  6133. )"Chapter 3 / User Datagram Protocol Ã:ÃÛˇ‚◊#ˇ ˇˇˇˇ#◊ 
  6134. d,
  6135. Courier
  6136. .°dONLNd Æ,>+ÃHtypedef struct UDPiopb {°dONLNd.Ã:‰+char°dONLNd .b:§)ñ fill12[12];°dONLNd-<ÃH>(dÍUDPIOCompletionProc°dONLNdA<bH∞)ñ
  6137. ioCompletion;°dONLNdPJÃVÍ(rÍshort°dONLNdVJbVò)ñ    ioResult;°dONLNdaXÃd‰(ÄÍchar°dONLNdgXbd§)ñ *ioNamePtr;°dONLNdtfÃrÍ(éÍshort°dONLNdzfbrû)ñ
  6138. ioVRefNum;°dONLNdÜtÃÄÍ(úÍshort°dONLNdåtbÄû)ñ
  6139. ioCRefNum;°dONLNdòÇÃéÍ(™Íshort°dONLNdûÇbéå)ñcsCode;°dONLNdßêÃú(∏Í    StreamPtr°dONLNd±êbúû)ñ
  6140. udpStream;°dONLNdΩûÙˆ(ΔÍunion {°dONLNd«¨Í∏V+struct UDPCreatePB°dONLNd⁄¨b∏å)xcreate;°dONLNd‰∫ÍΔJ(‚struct UDPSendPB°dONLNdı∫bΔÄ)xsend;°dONLNd˝»Í‘\(struct UDPReceivePB°dONLNd»b‘í)xreceive;°dONLNd÷Í‚D(˛struct UDPMTUPB°dONLNd,÷b‚z)xmtu;°dONLNd2‰Ã( Í
  6141. } csParam;°dONLNd=ÚÆ˛Í(Ã
  6142. } UDPiopb;,N Helvetica Narrow
  6143. (ŸïC parameter-block definitions
  6144. )à27 ÃpÃ)ˇ@◊#ˇ ˇˇˇˇ#◊ 
  6145. d,N Helvetica Narrow
  6146. 0.°dONLNd*TZj+rn4
  6147. °dONLNdAÆTö)ZTransmission Control Protocol,Times
  6148. °dONLNd ™Æµˇ*cHThe Transmission Control Protocol (TCP) is a highly reliable, connection°dONLNdh™ˇµ(—-°dONLNdi∏Æ√(flÃLoriented byte-stream protocol. It is designed to operate over a wide variety°dONLNd∂ΔÆ—*Lof networks and to provide virtual circuit service with orderly transmission°dONLNd‘Æfl *Aof user data. TCP serves as the basis for a reliable interprocess°dONLNdE‚ÆÌ*Bcommunication mechanism on top of the IP layer where loss, damage,°dONLNdàÆ˚Ø*8duplication, delay, or misordering of packets can occur. ÃpÃ)ˇ4B◊#ˇ ˇˇˇˇ#◊ 
  6149. d,N Helvetica Narrow
  6150. .°dONLNd-s+<IData structures,Times
  6151. °dONLNd8xCÕ+ZIThis section describes TCP Read and Write Data Structures and the receive°dONLNdZFxQÆ* buffer area.
  6152. °dONLNdgaxn*Read and Write Data Structures
  6153. °dONLNdÜyxу*EThe MacTCP driver uses Read Data Structures and Write Data Structures°dONLNdÃáxí”*I(RDS/WDS) to pass data between the user and TCP. These structures allow a°dONLNdïx†‘*Osingle read or write operation to handle multiple blocks of data; that is, they°dONLNdf£xÆÃ*Iallow scatter-read and gather-write capability. Figure 4-1 shows TCP Read°dONLNd∞±xº*and Write Data Structures.
  6154. 4ÎêÏë°d
  6155. ONLNf‰
  6156. Ïëã<ò@p@pÏë,ÛÛ˚1˚˚I˚˚Iú¿¸˚1Y˚˚IXĸ˚IX@¸˚1ïĸÛÛÛıˇıˇıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ò@Äp@Äp,ëlıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ˛ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿òÄüpÄüplëãıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ıˇ¿ˆˇ¿ˆˇ¿ÛÛÛÛòÄp@pHH˙r@ ÜIJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  6157. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  6158. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  6159.  
  6160.  
  6161.  ˛êêê@pÏë,'ëëœˇˇ˛ˇ˛ˇÕ–ˇˇˇ˝ˇŒ–    ˇˇˇˇ˛ˇˇˇ”œˇ˛˛˛ˇ˛ˇ˛—– ˇˇˇˇˇˇ˛ˇ“– ˇˇˇˇˇˇ˝ˇ”œˇˇ˛    ˇˇˇ˛ˇˇ“ëëë˙†ˇ˘
  6162. ˙ˇ¢ˇ˘
  6163. ˙ˇ¢˛ˇ˚
  6164. ˙ˇ¢˛ˇ˚
  6165. ˙ˇ¢˛ˇ˚%˙ˇÔˇÚˇ˜ˇ˛ˇˇˆˇ˘˛ˇÏ˛ˇ˚*˙ˇÔˇÙˇˇ¯ˇ˛ˇ¯ˇ˛ˇ˙ˇˇÎ˛ˇ˚G˙ˇÔˇˇ˛ˇˇ˛ˇˇ˝ˇ¸ˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˛ˇˇÛ˛ˇ˚K˙˚ˇÙˇˇ˛ˇˇˇˇˇˇˇ˛ˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇ˜˘ˇ˚I˙ˇÔ˝ˇˇˇˇˇˇˇˇ˛ˇˇˇ˛
  6166. ˇˇˇˇˇ˛ ˇˇˇˇˇˇ˛ˇˇÚ˛ˇ˚I˙ˇÔˇˇ˝ ˇˇˇˇˇˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˝ˇÚ˛ˇ˚J˙ˇÔˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˛ˇˇˇˇ˛˛˛ˇ˛˛ ˛ˇˇˇ˛ˇ˛Ú˛ˇ˚˙ˇÂˇˇ¡˛ˇ˚˙ˇ‰ˇ¿˛ˇ˚
  6167. ˙ˇ¢˛ˇ˚˙ûˇ˚
  6168. ˙ˇ¢˛ˇ˚
  6169. ˙ˇ¢˛ˇ˚
  6170. ˙ˇ¢˛ˇ˚
  6171. ˙ˇ¢˛ˇ˚
  6172. ˙ˇ¢˛ˇ˚
  6173. ˙ˇ¢˛ˇ˚
  6174. ˙˚ˇ¨˘ˇ˚
  6175. ˙ˇ¢˛ˇ˚
  6176. ˙ˇ¢˛ˇ˚
  6177. ˙ˇ¢˛ˇ˚˙ˇË˛Èˇˇˆˇ¯˛ˇÓ˛ˇ˚$˙ˇ‚ˇ¯ˇ˙ˇ¯ˇ˛ˇ˘ˇˇÌ˛ˇ˚I˙ˇˇˇ˛ˇ˛ˇ˛
  6178. ˇˇˇˇˇˇˇˇ˝˛ˇˇˇ˝ˇ
  6179. ˇˇˇˇ˝ˇˇˇˇÙ˛ˇ˚M˙ˇˇ˛ˇ˛ˇˇˇ˛ˇ˛ˇ˛ˇ˛ˇ˛
  6180. ˇ˛ˇˇ˛˛˛ˇ˛ˇˇˇˇˇˇÛ˛ˇ˚M˙˚ˇıˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇ˛ˇˇ¯˘ˇ˚L˙ˇˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇ˛ˇˇˇ˝ˇˇ˛
  6181. ˇˇˇˇˇˇˇ˛ˇÛ˛ˇ˚K˙ˇ˛ˇ˛ˇ˛ˇˇ˛ˇˇˇ˛˝ˇˇ˝˛ˇ˛ˇ˛ˇˇˇ˛ ˇ˛ˇˇ˛ˇˇÛ˛ˇ˚˙ˇˇ¥˛ˇ˚˙ˇˇ¥˛ˇ˚
  6182. ˙ˇ¢˛ˇ˚
  6183. ˙ˇ¢˛ˇ˚
  6184. ˙˚ˇ¨˘ˇ˚
  6185. ˙ˇ¢˛ˇ˚
  6186. ˙ˇ¢˛ˇ˚
  6187. ˙ˇ¢˛ˇ˚
  6188. ˙ˇ¢˛ˇ˚
  6189. ˙ˇ¢˛ˇ˚
  6190. ˙ˇ¢˛ˇ˚
  6191. ˙ˇ¢˛ˇ˚˙ûˇ˚
  6192. ˙ˇ¢˛ˇ˚
  6193. ˙ˇ¢˛ˇ˚
  6194. ˙ˇ¢˛ˇ˚
  6195. ˙ˇ¢˛ˇ˚
  6196. ˙ˇ¢˛ˇ˚
  6197. ˙ˇ¢˛ˇ˚òÄp@ÄpHH˙s® áIJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  6198. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  6199. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  6200.  
  6201.  
  6202.  ˛êêê@Äp,ël'ëëëë
  6203. ˚˝ˇ§˝ˇ¸
  6204. ˚˝ˇ§˝ˇ¸
  6205. ˚˛ˇ£˛ˇ˚
  6206. ˘ˇ°ˇ˚ëë
  6207. ˚˝ˇ§˝ˇ¸
  6208. ˚˝ˇ§˝ˇ¸
  6209. ˚˛ˇ£˛ˇ˚
  6210. ˘ˇ°ˇ˚ëë
  6211. ˚˝ˇ§˝ˇ¸
  6212. ˚˝ˇ§˝ˇ¸
  6213. ˚˛ˇ£˛ˇ˚
  6214. ˘ˇ°ˇ˚ëëë
  6215. ˙ˇ¢˛ˇ˚
  6216. ˙ˇ¢˛ˇ˚
  6217. ˙ˇ¢˛ˇ˚
  6218. ˙ˇ¢˛ˇ˚
  6219. ˙ˇ¢˛ˇ˚
  6220. ˙ˇ¢˛ˇ˚˙ûˇ˚
  6221. ˙ˇ¢˛ˇ˚
  6222. ˙ˇ¢˛ˇ˚
  6223. ˙ˇ¢˛ˇ˚
  6224. ˙ˇ¢˛ˇ˚#˙ˇÔˇÚˇ˜˛ˇÙˇ˘ˇ˛Ï˛ˇ˚*˙ˇÔˇÙˇˇ¯ˇ˛ˇ¯ˇ˛ˇ˙ˇˇÎ˛ˇ˚F˙ˇÔˇˇˇˇ˛ˇˇ˝ˇ¸
  6225. ˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇ˝ˇˇˇˇÚ˛ˇ˚J˙˚ˇÙˇˇˇˇˇˇˇˇˇˇ˛ˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇˆ˘ˇ˚J˙ˇÔˇ˛ˇ
  6226. ˇˇˇˇˇˇˇ˛ˇˇˇ˛
  6227. ˇˇˇˇˇ˛ ˇˇˇˇˇˇ˛ˇˇÒ˛ˇ˚J˙ˇÔˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇÒ˛ˇ˚I˙ˇÔˇ˛ˇˇˇ˛ˇ˛ˇˇ˝˛ˇ˛ˇˇˇˇˇ˛ˇˇˇ˛ ˇˇˇˇˇˇˇÒ˛ˇ˚˙ˇÂˇˇ¡˛ˇ˚˙ˇ‰ˇ¿˛ˇ˚
  6228. ˙ˇ¢˛ˇ˚˙ûˇ˚
  6229. ˙ˇ¢˛ˇ˚
  6230. ˙ˇ¢˛ˇ˚
  6231. ˙ˇ¢˛ˇ˚
  6232. ˙ˇ¢˛ˇ˚
  6233. ˙ˇ¢˛ˇ˚
  6234. ˙ˇ¢˛ˇ˚
  6235. ˙ˇ¢˛ˇ˚
  6236. ˙˚ˇ¨˘ˇ˚
  6237. ˙ˇ¢˛ˇ˚˙ˇËˇÈˇıˇ˘ˇˇÌ˛ˇ˚$˙ˇ‚˛¯ˇ˘ˇ˘˛˛˛˙˛ˇÏ˛ˇ˚K˙ˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇ˝ˇˇ˛ˇˇÙ˛ˇ˚L˙ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇˇ˝ˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇÛ˛ˇ˚L˙ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇˇ˛˛˛ˇ˛˝    ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇ˛ˇÛ˛ˇ˚K˙˚ˇıˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇ˝ˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˝ˇ¯˘ˇ˚J˙ˇˇˇ˛ˇˇˇˇˇˇˇˇ˝ˇˇ¸ˇˇˇˇˇ˛ˇˇˇ˛ ˇˇˇˇˇˇˇÛ˛ˇ˚˙ˇˇ¥˛ˇ˚˙ˇˇ¥˛ˇ˚
  6238. ˙ˇ¢˛ˇ˚òÄpÄüpHH˙r@ àIJˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôô    ˇˇÃÃff
  6239. ˇˇÃÃ33 ˇˇÃà ˇˇôôˇˇ
  6240. ˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃàˇˇôô!ˇˇff"ˇˇ33#ˇˇ$ÃÃˇˇˇˇ%ÃÃˇˇÃÃ&ÃÃˇˇôô'ÃÃˇˇff(ÃÃˇˇ33)ÃÃˇˇ*ÃÃÃÃˇˇ+ÃÃÃÃÃÃ,ÃÃÃÃôô-ÃÃÃÃff.ÃÃÃÃ33/ÃÃÃÃ0ÃÃôôˇˇ1ÃÃôôÃÃ2ÃÃôôôô3ÃÃôôff4ÃÃôô335ÃÃôô6ÃÃffˇˇ7ÃÃffÃÃ8ÃÃffôô9ÃÃffff:ÃÃff33;ÃÃff<ÃÃ33ˇˇ=ÃÃ33ÃÃ>ÃÃ33ôô?ÃÃ33ff@ÃÃ3333AÃÃ33BÃÃˇˇCÃÃÃÃDÃÃôôEÃÃffFÃÃ33GÃÃHôôˇˇˇˇIôôˇˇÃÃJôôˇˇôôKôôˇˇffLôôˇˇ33MôôˇˇNôôÃÃˇˇOôôÃÃÃÃPôôÃÃôôQôôÃÃffRôôÃÃ33SôôÃÃTôôôôˇˇUôôôôÃÃVôôôôôôWôôôôffXôôôô33YôôôôZôôffˇˇ[ôôffÃÃ\ôôffôô]ôôffff^ôôff33_ôôff`ôô33ˇˇaôô33ÃÃbôô33ôôcôô33ffdôô3333eôô33fôôˇˇgôôÃÃhôôôôiôôffjôô33kôôlffˇˇˇˇmffˇˇÃÃnffˇˇôôoffˇˇffpffˇˇ33qffˇˇrffÃÃˇˇsffÃÃÃÃtffÃÃôôuffÃÃffvffÃÃ33wffÃÃxffôôˇˇyffôôÃÃzffôôôô{ffôôff|ffôô33}ffôô~ffffˇˇffffÃÃÄffffôôÅffffffÇffff33ÉffffÑff33ˇˇÖff33ÃÃÜff33ôôáff33ffàff3333âff33äffˇˇãffÃÃåffôôçfffféff33èffê33ˇˇˇˇë33ˇˇÃÃí33ˇˇôôì33ˇˇffî33ˇˇ33ï33ˇˇñ33ÃÃˇˇó33ÃÃÃÃò33ÃÃôôô33ÃÃffö33ÃÃ33õ33ÃÃú33ôôˇˇù33ôôÃÃû33ôôôôü33ôôff†33ôô33°33ôô¢33ffˇˇ£33ffÃç33ffôô•33ffff¶33ff33ß33ff®3333ˇˇ©3333ÃÙ3333ôô´3333ff¨333333≠3333Æ33ˇˇØ33ÃÃ∞33ôô±33ff≤3333≥33¥ˇˇˇˇµˇˇÃÃ∂ˇˇôô∑ˇˇff∏ˇˇ33πˇˇ∫ÃÃˇˇªÃÃÃúÃÃôôΩÃÃffæÃÃ33øÃÿôôˇˇ¡ôôÃìôôôô√ôôffƒôô33≈ôôΔffˇˇ«ffÃûffôô…ffff ff33ÀffÃ33ˇˇÕ33ÃÃŒ33ôôœ33ff–3333—33“ˇˇ”ÃÑôô’ff÷33◊ÿˇˇˇŸ˘`˘`˘`⁄Ú–Ú–Ú–€Ï@Ï@Ï@‹Â∞Â∞Â∞›fl fl fl fiÿêÿêÿêfl“““‡ÀpÀpÀp·ƒ‡ƒ‡ƒ‡‚æPæPæP„∑¿∑¿∑¿‰±0±0±0™†™†™†Ê§§§ÁùÄùÄùÄËñññÈê`ê`ê`Íâ–â–â–ÎÉ@É@É@Ï|∞|∞|∞Ìv v v ÓoêoêoêÔiiibpbpbpÒ[‡[‡[‡ÚUPUPUPÛN¿N¿N¿ÙH0H0H0ıA†A†A†ˆ;;;˜4Ä4Ä4į---˘'`'`'`˙ – – –˚@@@¸∞∞∞˝
  6241.  
  6242.  
  6243.  ˛êêêÄüplëã'
  6244. ˙ˇ¢˛ˇ˚
  6245. ˙ˇ¢˛ˇ˚
  6246. ˙˚ˇ¨˘ˇ˚
  6247. ˙ˇ¢˛ˇ˚
  6248. ˙ˇ¢˛ˇ˚
  6249. ˙ˇ¢˛ˇ˚
  6250. ˙ˇ¢˛ˇ˚
  6251. ˙ˇ¢˛ˇ˚
  6252. ˙ˇ¢˛ˇ˚
  6253. ˙ˇ¢˛ˇ˚˙ûˇ˚
  6254. ˙ˇ¢˛ˇ˚
  6255. ˙ˇ¢˛ˇ˚˙ˇ—ˇÚˇˇ‰˛ˇ˚˙ˇ“ˇÒˇˇÂ˛ˇ˚0˙ˇ‚˛ˇˇ˛˛˛ˇˇ˝˛ˇˇˇˇ˛ˇ˛ˇˇÂ˛ˇ˚/˙ˇ‡
  6256. ˇˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇÂ˛ˇ˚0˙˚ˇÊˇ˛ˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇÍ˘ˇ˚0˙ˇ‚ˇˇ˝ˇ˛ˇ˛ˇˇˇˇˇ˛ˇˇˇˇÂ˛ˇ˚/˙ˇ‚˛ˇˇˇˇˇ˝ˇ˛ˇˇˇˇ˛ˇˇˇÂ˛ˇ˚˙ˇ“ˇÔˇÂ˛ˇ˚˙ˇ—ˇÒˇ‰˛ˇ˚
  6257. ˙ˇ¢˛ˇ˚
  6258. ˙ˇ¢˛ˇ˚˙ûˇ˚¯†ˇ˚¯†ˇ˚ëëëë
  6259. <°d
  6260. ONLNf§
  6261. Ïëã<°d
  6262. ONLNf<
  6263. .üpüp(Ïë °d
  6264. ONLNfîR
  6265. d
  6266. .°dONLNdÀqx|†+¨
  6267. Figure 4-1°dONLNd’q†|2)($  TCP Read and Write Data Structures
  6268. °dONLNd˙êxõ–(∑ñKThe simplest possible Read and Write Data Structures are 8 bytes in length:°dONLNdFûx©Δ*Ha word length, a long pointer, and a terminating word of 0. Up to 65,000°dONLNdè¨x∑ø*Dbuffers can be described by an RDS/WDS used to transfer data between°dONLNd‘∫x≈ *TCP and the user.
  6269. °dONLNdÊ’x‚⁄*Receive buffer area
  6270. °dONLNd˙Ìx¯æ*DTCP does not allocate memory for storing TCP stream databases or for°dONLNd?˚x±*Cbuffering received datagrams. Instead, you are required to pass TCP°dONLNdÉ    xø*Denough memory for these purposes in the TCPCreate call. This has two°dONLNd»x"≠* advantages:, p    AppleIconp
  6271. °dONLNd’+x3}*n
  6272. °dONLNd◊)Ö4œ)
  6273. FThe buffer memory can be allocated off the application heap instead of°dONLNd7ÖB5*'the system heap, which is very limited.p
  6274. °dONLNdFKxS}(pñn
  6275. °dONLNdHIÖT )
  6276. DYou have control over the buffering provided by TCP and can allocate°dONLNdçWÖb∏*@the appropriate amount of memory for the type of application and°dONLNdŒeÖpˇ*performance level desired.
  6277. (Ÿ<30
  6278. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ†æ†¬°¿/, 128 string def
  6279. °¿5{currentfile , readstring {(,,,,,,,,,,,,,,,,) search
  6280. °¿K{pop pop pop {currentfile read {46 eq {exit} if} {exit} ifelse} loop exit}
  6281. °¿+{pop} ifelse} {pop exit} ifelse} bind loop
  6282. †ø†æ†¬°¿í,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.
  6283. †ø†æ†¬°¿-%%BeginDocument: Adobe Illustrator(TM) 3.2.2
  6284. °¿%!PS-Adobe-3.0 °¿    EPSF-3.0
  6285. °¿'%%Creator: Adobe Illustrator(TM) 3.2.2
  6286. °¿*%%For: (Debbie McDaniel) (Apple Computer)
  6287. °¿$%%CreationDate: (4/12/93) (2:29 PM)
  6288. °¿%%BoundingBox: -115 103 -3 262
  6289. °¿%%DocumentProcessColors: Black
  6290. °¿"%%DocumentFonts: Helvetica-Narrow
  6291. °¿=%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0
  6292. °¿"%%+ procset Adobe_cmykcolor 1.1 0
  6293. °¿%%+ procset Adobe_cshow 1.1 0
  6294. °¿$%%+ procset Adobe_customcolor 1.0 0
  6295. °¿'%%+ procset Adobe_typography_AI3 1.0 1
  6296. °¿)%%+ procset Adobe_IllustratorA_AI3 1.0 1
  6297. °¿%AI3_ColorUsage: Black&White
  6298. °¿ %AI3_TemplateBox: -42 80 -42 80
  6299. °¿ %AI3_TileBox: -330 -280 222 450
  6300. °¿$%AI3_DocumentPreview: Macintosh_Pic
  6301. °¿%%EndComments
  6302. °¿%%BeginProlog
  6303. †ø†æ†¬°¿1%%BeginResource: procset Adobe_packedarray 2.0 0
  6304. °¿"%%Title: (Packed Array Operators)
  6305. °¿%%Version: 2.0 
  6306. °¿%%CreationDate: (8/2/90) ()
  6307. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6308. °¿1userdict /Adobe_packedarray 5 dict dup begin put
  6309. °¿/initialize            % - initialize -
  6310. °¿{
  6311. °¿/packedarray where
  6312. °¿    {
  6313. °¿    pop
  6314. °¿    }
  6315. °¿    {
  6316. °¿    Adobe_packedarray begin
  6317. °¿    Adobe_packedarray
  6318. °¿        {
  6319. °¿
  6320.         dup xcheck
  6321. °¿            {
  6322. °¿            bind
  6323. °¿            } if
  6324. °¿        userdict 3 1 roll put
  6325. °¿         } forall
  6326. °¿    end
  6327. °¿
  6328.     } ifelse
  6329. °¿} def
  6330. °¿/terminate            % - terminate -
  6331. °¿{
  6332. °¿} def
  6333. °¿2/packedarray        % arguments count packedarray array
  6334. °¿{
  6335. °¿array astore readonly
  6336. °¿} def
  6337. °¿%/setpacking            % boolean setpacking -
  6338. °¿{
  6339. °¿pop
  6340. °¿} def
  6341. °¿(/currentpacking        % - setpacking boolean
  6342. °¿{
  6343. °¿false
  6344. °¿} def
  6345. °¿currentdict readonly pop end
  6346. °¿%%EndResource
  6347. °¿'Adobe_packedarray /initialize get exec
  6348. °¿/%%BeginResource: procset Adobe_cmykcolor 1.1 0
  6349. °¿ %%Title: (CMYK Color Operators)
  6350. °¿%%Version: 1.1 
  6351. °¿%%CreationDate: (1/23/89) ()
  6352. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6353. °¿currentpacking true setpacking
  6354. °¿/userdict /Adobe_cmykcolor 4 dict dup begin put
  6355. °¿/initialize            % - initialize -
  6356. °¿{
  6357. °¿/setcmykcolor where
  6358. °¿    {
  6359. °¿    pop
  6360. °¿    }
  6361. °¿    {
  6362. °¿5    userdict /Adobe_cmykcolor_vars 2 dict dup begin put
  6363. °¿    /_setrgbcolor
  6364. °¿        /setrgbcolor load def
  6365. °¿    /_currentrgbcolor
  6366. °¿        /currentrgbcolor load def
  6367. °¿    Adobe_cmykcolor begin
  6368. °¿    Adobe_cmykcolor
  6369. °¿        {
  6370. °¿
  6371.         dup xcheck
  6372. °¿            {
  6373. °¿            bind
  6374. °¿            } if
  6375. °¿
  6376.         pop pop
  6377. °¿         } forall
  6378. °¿    end
  6379. °¿    end
  6380. °¿    Adobe_cmykcolor begin
  6381. °¿
  6382.     } ifelse
  6383. °¿} def
  6384. °¿/terminate            % - terminate -
  6385. °¿{
  6386. °¿currentdict Adobe_cmykcolor eq
  6387. °¿    {
  6388. °¿    end
  6389. °¿    } if
  6390. °¿} def
  6391. °¿:/setcmykcolor        % cyan magenta yellow black setcmykcolor -
  6392. °¿{
  6393. °¿1 sub 4 1 roll
  6394. °¿3
  6395. °¿    {
  6396. °¿    3 index add neg dup 0 lt
  6397. °¿        {
  6398. °¿        pop 0
  6399. °¿        } if
  6400. °¿
  6401.     3 1 roll
  6402. °¿
  6403.     } repeat
  6404. °¿,Adobe_cmykcolor_vars /_setrgbcolor get exec
  6405. °¿pop
  6406. °¿} def 
  6407. °¿A/currentcmykcolor    % - currentcmykcolor cyan magenta yellow black
  6408. °¿{
  6409. °¿0Adobe_cmykcolor_vars /_currentrgbcolor get exec
  6410. °¿3
  6411. °¿    {
  6412. °¿    1 sub neg 3 1 roll
  6413. °¿
  6414.     } repeat
  6415. °¿0
  6416. °¿} def
  6417. °¿currentdict readonly pop end
  6418. °¿ setpacking
  6419. °¿%%EndResource
  6420. °¿+%%BeginResource: procset Adobe_cshow 1.1 0
  6421. °¿%%Title: (cshow Operator)
  6422. °¿%%Version: 1.1 
  6423. °¿%%CreationDate: (1/23/89) ()
  6424. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6425. °¿currentpacking true setpacking
  6426. °¿+userdict /Adobe_cshow 3 dict dup begin put
  6427. °¿/initialize            % - initialize -
  6428. °¿{
  6429. °¿
  6430. /cshow where
  6431. °¿    {
  6432. °¿    pop
  6433. °¿    }
  6434. °¿    {
  6435. °¿1    userdict /Adobe_cshow_vars 1 dict dup begin put
  6436. °¿    /_cshow        % - _cshow proc
  6437. °¿            {} def
  6438. °¿    Adobe_cshow begin
  6439. °¿
  6440.     Adobe_cshow
  6441. °¿        {
  6442. °¿
  6443.         dup xcheck
  6444. °¿            {
  6445. °¿            bind
  6446. °¿            } if
  6447. °¿        userdict 3 1 roll put
  6448. °¿         } forall
  6449. °¿    end
  6450. °¿    end
  6451. °¿
  6452.     } ifelse
  6453. °¿} def
  6454. °¿/terminate            % - terminate -
  6455. °¿{
  6456. °¿} def
  6457. °¿ /cshow                % proc string cshow -
  6458. °¿{
  6459. °¿exch
  6460. °¿Adobe_cshow_vars
  6461. °¿    exch /_cshow
  6462. °¿
  6463.     exch put
  6464. °¿    {
  6465. °¿'    0 0 Adobe_cshow_vars /_cshow get exec
  6466. °¿
  6467.     } forall
  6468. °¿} def
  6469. °¿currentdict readonly pop end
  6470. °¿ setpacking
  6471. °¿%%EndResource
  6472. °¿1%%BeginResource: procset Adobe_customcolor 1.0 0
  6473. °¿"%%Title: (Custom Color Operators)
  6474. °¿%%Version: 1.0 
  6475. °¿%%CreationDate: (5/9/88) ()
  6476. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6477. °¿currentpacking true setpacking
  6478. °¿1userdict /Adobe_customcolor 5 dict dup begin put
  6479. °¿/initialize            % - initialize -
  6480. °¿{
  6481. °¿/setcustomcolor where
  6482. °¿    {
  6483. °¿    pop
  6484. °¿    }
  6485. °¿    {
  6486. °¿    Adobe_customcolor begin
  6487. °¿    Adobe_customcolor
  6488. °¿        {
  6489. °¿
  6490.         dup xcheck
  6491. °¿            {
  6492. °¿            bind
  6493. °¿            } if
  6494. °¿
  6495.         pop pop
  6496. °¿         } forall
  6497. °¿    end
  6498. °¿    Adobe_customcolor begin
  6499. °¿
  6500.     } ifelse
  6501. °¿} def
  6502. °¿/terminate            % - terminate -
  6503. °¿{
  6504. °¿!currentdict Adobe_customcolor eq
  6505. °¿    {
  6506. °¿    end
  6507. °¿    } if
  6508. °¿} def
  6509. °¿Q/findcmykcustomcolor    % cyan magenta yellow black name findcmykcustomcolor object
  6510. °¿{
  6511. °¿5 packedarray
  6512. °¿}  def
  6513. °¿0/setcustomcolor        % object tint setcustomcolor -
  6514. °¿{
  6515. °¿exch
  6516. °¿aload pop pop
  6517. °¿4
  6518. °¿    {
  6519. °¿    4 index mul 4 1 roll
  6520. °¿
  6521.     } repeat
  6522. °¿5 -1 roll pop
  6523. °¿
  6524. setcmykcolor
  6525. °¿} def
  6526. °¿(/setoverprint        % boolean setoverprint -
  6527. °¿{
  6528. °¿pop
  6529. °¿} def
  6530. °¿currentdict readonly pop end
  6531. °¿ setpacking
  6532. °¿%%EndResource
  6533. °¿4%%BeginResource: procset Adobe_typography_AI3 1.1 0
  6534. °¿ %%Title: (Typography Operators)
  6535. °¿%%Version: 1.0 
  6536. °¿%%CreationDate:(5/31/90) ()
  6537. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6538. °¿currentpacking true setpacking
  6539. °¿5userdict /Adobe_typography_AI3 47 dict dup begin put
  6540. °¿/initialize            % - initialize -
  6541. °¿{
  6542. °¿/TZ
  6543. °¿ where
  6544. °¿    {
  6545. °¿    pop
  6546. °¿    }
  6547. °¿    {
  6548. °¿    Adobe_typography_AI3 begin
  6549. °¿    Adobe_typography_AI3
  6550. °¿        {
  6551. °¿
  6552.         dup xcheck
  6553. °¿            {
  6554. °¿            bind
  6555. °¿            } if
  6556. °¿
  6557.         pop pop
  6558. °¿         } forall
  6559. °¿    end
  6560. °¿    Adobe_typography_AI3 begin
  6561. °¿
  6562.     } ifelse
  6563. °¿} def
  6564. °¿/terminate            % - terminate -
  6565. °¿{
  6566. °¿$currentdict Adobe_typography_AI3 eq
  6567. °¿    {
  6568. °¿    end
  6569. °¿    } if
  6570. °¿} def
  6571. °¿b% [ number value stream [ array for encoding modification ] modifyEncoding ==> [ modified array ]
  6572. °¿/modifyEncoding
  6573. °¿{
  6574. °¿    /_tempEncode exch ddef
  6575. °¿    
  6576. °¿$    % pointer for sequential encodings
  6577. °¿    /_pntr 0 ddef
  6578. °¿    
  6579. °¿    {
  6580. °¿        % get bottom object
  6581. °¿        counttomark -1 roll
  6582. °¿        % is it a mark ?
  6583. °¿        dup type dup /marktype eq         
  6584. °¿        {
  6585. °¿
  6586.             % exit
  6587. °¿            pop pop exit
  6588. °¿        }
  6589. °¿        {
  6590. °¿            % ... object ... type ....
  6591. °¿            % insert if a nametype
  6592. °¿            /nametype eq
  6593. °¿            {
  6594. °¿5                % insert the name at _pntr and increment pointer
  6595. °¿B                _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
  6596. °¿                put
  6597. °¿            }
  6598. °¿            {
  6599. °¿#                % reset _pntr if it's a number
  6600. °¿                /_pntr exch ddef                    
  6601. °¿            }
  6602. °¿
  6603.             ifelse
  6604. °¿        }
  6605. °¿            ifelse
  6606. °¿    }
  6607. °¿    loop    
  6608. °¿    
  6609. °¿     % return the modified encoding
  6610. °¿
  6611.     _tempEncode
  6612. °¿}
  6613. °¿def
  6614. °¿9/TE    % Set std platform encoding     % (encoding pairs) TE -
  6615. °¿{
  6616. °¿1    StandardEncoding 256 array copy modifyEncoding 
  6617. °¿    /_nativeEncoding exch def
  6618. °¿} def
  6619. °¿% re-define font
  6620. °¿% expected arguments
  6621. °¿% for 'normal fonts : 
  6622. °¿L% [ /_Helvetica-Bold/Helvetica-Bold direction fontScript defaultEncoding TZ
  6623. °¿%
  6624. °¿5% for cartographic, pictographic, and expert fonts :
  6625. °¿1% [ ... number value stream ... /_Symbol/Symbol 
  6626. °¿*%    direction fontScript defaultEncoding TZ
  6627. °¿*% for blended fonts w/ default encoding :
  6628. °¿-% [ /_AdobeSans_20ULig1XCond-Bold/AdobeSans 
  6629. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  6630. °¿*% for blended fonts w/ special encoding :
  6631. °¿D% [ ... number value stream ... /_AdobeSans_20ULig1XCond/AdobeSans 
  6632. °¿;%    direction fontScript defaultEncoding [ w0 w1 ... wn ] TZ
  6633. °¿/TZ        
  6634. °¿{
  6635. °¿"    % set weight vector (if present)
  6636. °¿=    dup type /arraytype eq {/_wv exch def} {/_wv 0 def} ifelse 
  6637. °¿"    % platform dependent coding flag
  6638. °¿    /_useNativeEncoding exch def
  6639. °¿    % pop fontScript & direction
  6640. °¿        pop pop
  6641. °¿    
  6642. °¿'    % create a new dictionary with length
  6643. °¿+    % equal to original dictionary length + 2
  6644. °¿+    % copy all the key/value pairs except FID
  6645. °¿C    % call makeblended font with the weight values if _wv is an array
  6646. °¿P    findfont _wv type /arraytype eq {_wv makeblendedfont} if dup length 2 add dict
  6647. °¿    
  6648. °¿    begin
  6649. °¿    
  6650. °¿$        % copy all the values but the FID
  6651. °¿        % into the new dictionary
  6652. °¿         mark exch
  6653. °¿        {
  6654. °¿/            1 index /FID ne { def } if cleartomark mark
  6655. °¿        }
  6656. °¿            forall
  6657. °¿        % discard last mark
  6658. °¿        pop
  6659. °¿        
  6660. °¿        % define FontName
  6661. °¿        /FontName exch def
  6662. °¿        
  6663. °¿(        % if no re-encoding stream is present
  6664. °¿1        % then if the base encoding vector of the font
  6665. °¿$        % is the same as StandardEncoding
  6666. °¿/        % and the use platform encoding flag is true
  6667. °¿&        % then install AI platform encoding
  6668. °¿+        % else leave the base encoding in effect
  6669. °¿        counttomark 0 eq
  6670. °¿        {
  6671. °¿            1 _useNativeEncoding eq
  6672. °¿            {
  6673. °¿"                /Encoding _nativeEncoding def
  6674. °¿            }
  6675. °¿            if
  6676. °¿            % clean up
  6677. °¿            cleartomark
  6678. °¿        }
  6679. °¿        {    
  6680. °¿             % custom encoding to be done
  6681. °¿;            % start off with a copy of the font's standard encoding
  6682. °¿"            /Encoding load 256 array copy 
  6683. °¿%            modifyEncoding /Encoding exch def
  6684. °¿        }
  6685. °¿         ifelse        
  6686. °¿        FontName currentdict
  6687. °¿    end
  6688. °¿    
  6689. °¿    % register the new font
  6690. °¿    definefont pop
  6691. °¿}
  6692. °¿def
  6693. °¿% text painting operators
  6694. °¿"/tr                    % string tr ax ay string 
  6695. °¿{
  6696. °¿_ax _ay 3 2 roll
  6697. °¿} def
  6698. °¿2/trj                % string trj cx cy fillchar ax ay string 
  6699. °¿{
  6700. °¿_cx _cy _sp _ax _ay 6 5 roll
  6701. °¿} def
  6702. °¿/a0
  6703. °¿{
  6704. °¿#/Tx    % text                            % textString Tx -
  6705. °¿    {
  6706. °¿    dup 
  6707. °¿    currentpoint 3 2 roll
  6708. °¿        tr _psf
  6709. °¿    newpath moveto
  6710. °¿    tr _ctm _pss
  6711. °¿    } ddef
  6712. °¿*/Tj    % justified text                % textString Tj -
  6713. °¿    {
  6714. °¿    dup
  6715. °¿    currentpoint 3 2 roll
  6716. °¿     trj _pjsf
  6717. °¿    newpath moveto
  6718. °¿    trj _ctm _pjss
  6719. °¿    } ddef
  6720. °¿    
  6721. °¿} def
  6722. °¿/a1
  6723. °¿{
  6724. °¿#/Tx    % text                            % textString Tx -
  6725. °¿    {
  6726. °¿!    dup currentpoint 4 2 roll gsave
  6727. °¿    dup currentpoint 3 2 roll
  6728. °¿        tr _psf
  6729. °¿    newpath moveto
  6730. °¿    tr _ctm _pss
  6731. °¿     grestore 3 1 roll moveto tr sp
  6732. °¿    } ddef
  6733. °¿*/Tj    % justified text                % textString Tj -
  6734. °¿    {
  6735. °¿!    dup currentpoint 4 2 roll gsave
  6736. °¿    dup currentpoint 3 2 roll
  6737. °¿     trj _pjsf
  6738. °¿    newpath moveto
  6739. °¿    trj _ctm _pjss
  6740. °¿     grestore 3 1 roll moveto tr sp
  6741. °¿    } ddef
  6742. °¿    
  6743. °¿} def
  6744. °¿/e0
  6745. °¿{
  6746. °¿#/Tx    % text                            % textString Tx -
  6747. °¿    {
  6748. °¿        tr _psf
  6749. °¿    } ddef
  6750. °¿*/Tj    % justified text                % textString Tj -
  6751. °¿    {
  6752. °¿     trj _pjsf
  6753. °¿    } ddef
  6754. °¿} def
  6755. °¿/e1
  6756. °¿{
  6757. °¿#/Tx    % text                            % textString Tx -
  6758. °¿    {
  6759. °¿"    dup currentpoint 4 2 roll gsave 
  6760. °¿     tr _psf  
  6761. °¿!    grestore 3 1 roll moveto tr sp 
  6762. °¿    } ddef
  6763. °¿*/Tj    % justified text                % textString Tj -
  6764. °¿    {
  6765. °¿"    dup currentpoint 4 2 roll gsave 
  6766. °¿     trj _pjsf
  6767. °¿!    grestore 3 1 roll moveto tr sp 
  6768. °¿    } ddef
  6769. °¿} def
  6770. °¿/i0
  6771. °¿{
  6772. °¿#/Tx    % text                            % textString Tx -
  6773. °¿    {
  6774. °¿    tr sp
  6775. °¿    } ddef
  6776. °¿*/Tj    % justified text                % textString Tj -
  6777. °¿    {
  6778. °¿        trj jsp
  6779. °¿    } ddef
  6780. °¿} def
  6781. °¿/i1
  6782. °¿{
  6783. °¿W N
  6784. °¿} def
  6785. °¿/o0
  6786. °¿{
  6787. °¿#/Tx    % text                            % textString Tx -
  6788. °¿    {
  6789. °¿    tr sw rmoveto
  6790. °¿    } ddef
  6791. °¿*/Tj    % justified text                % textString Tj -
  6792. °¿    {
  6793. °¿    trj swj rmoveto
  6794. °¿    } ddef
  6795. °¿} def
  6796. °¿/r0
  6797. °¿{
  6798. °¿#/Tx    % text                            % textString Tx -
  6799. °¿    {
  6800. °¿    tr _ctm _pss
  6801. °¿    } ddef
  6802. °¿*/Tj    % justified text                % textString Tj -
  6803. °¿    {
  6804. °¿    trj _ctm _pjss
  6805. °¿    } ddef
  6806. °¿} def
  6807. °¿/r1
  6808. °¿{
  6809. °¿#/Tx    % text                            % textString Tx -
  6810. °¿    {
  6811. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  6812. °¿    tr _ctm _pss 
  6813. °¿!    grestore 3 1 roll moveto tr sp 
  6814. °¿    } ddef
  6815. °¿*/Tj    % justified text                % textString Tj -
  6816. °¿    {
  6817. °¿=    dup currentpoint 4 2 roll currentpoint gsave newpath moveto
  6818. °¿    trj _ctm _pjss
  6819. °¿!    grestore 3 1 roll moveto tr sp 
  6820. °¿    } ddef
  6821. °¿} def
  6822. °¿% font operators
  6823. °¿
  6824. % Binding
  6825. °¿&/To    % begin text                     % bindType To -
  6826. °¿{
  6827. °¿    pop _ctm currentmatrix pop
  6828. °¿} def
  6829. °¿/TO    % end text                    % TO -
  6830. °¿{
  6831. °¿    Te _ctm setmatrix newpath
  6832. °¿} def
  6833. °¿
  6834. % Text paths
  6835. °¿6/Tp    % begin text path                % a b c d tx ty startPt Tp -
  6836. °¿{
  6837. °¿$    pop _tm astore pop _ctm setmatrix 
  6838. °¿"    _tDict begin /W {} def /h {} def
  6839. °¿} def
  6840. °¿/TP    % end text path                    % TP -
  6841. °¿{
  6842. °¿    end
  6843. °¿    iTm 0 0 moveto
  6844. °¿} def
  6845. °¿!% Render mode & matrix operators
  6846. °¿&/Tr    % begin render                    % render Tr - 
  6847. °¿{
  6848. °¿/    _render 3 le {currentpoint newpath moveto} if
  6849. °¿/    dup 8 eq {pop 0} {dup 9 eq {pop 1} if} ifelse
  6850. °¿    dup /_render exch ddef
  6851. °¿!    _renderStart exch get load exec
  6852. °¿} def
  6853. °¿K/iTm % internal set text matrix        % - iTm -    (uses _tm as implicit argument)
  6854. °¿{
  6855. °¿8_ctm setmatrix _tm concat 0 _rise translate _hs 1 scale
  6856. °¿} def
  6857. °¿./Tm % set text matrix                % a b c d tx ty Tm -
  6858. °¿{
  6859. °¿_tm astore pop iTm 0 0 moveto
  6860. °¿} def
  6861. °¿+/Td % translate text matrix         % tx ty Td -
  6862. °¿{
  6863. °¿7_mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
  6864. °¿} def
  6865. °¿/Te    % end render                    % - Te -
  6866. °¿{
  6867. °¿W    _render -1 eq {} {_renderEnd _render get dup null ne {load exec} {pop} ifelse} ifelse
  6868. °¿    /_render -1 ddef
  6869. °¿} def
  6870. °¿
  6871. % Attributes
  6872. °¿)/Ta    % set alignment                    % alignment Ta -
  6873. °¿{
  6874. °¿pop
  6875. °¿} def
  6876. °¿3/Tf    % set font name and size        % fontname size Tf -
  6877. °¿{
  6878. °¿dup 1000 div /_fScl exch ddef
  6879. °¿%exch findfont exch scalefont setfont
  6880. °¿} def
  6881. °¿6/Tl    % set leading                    % leading paragraphLeading Tl -
  6882. °¿{
  6883. °¿pop
  6884. °¿ exch _leading astore pop
  6885. °¿} def
  6886. °¿//Tt    % set user tracking                % userTracking Tt -
  6887. °¿{
  6888. °¿pop
  6889. °¿} def
  6890. °¿</TW % set word spacing                % minSpace optSpace maxSpace TW -
  6891. °¿{
  6892. °¿3 npop
  6893. °¿} def
  6894. °¿0/Tw    % set computed word spacing        % wordSpace Tw
  6895. °¿{
  6896. °¿/_cx exch ddef
  6897. °¿} def
  6898. °¿@/TC % set character spacing            % minSpace optSpace maxSpace TC -
  6899. °¿{
  6900. °¿3 npop
  6901. °¿} def
  6902. °¿2/Tc    % set computed char spacing     % charSpace Tc -
  6903. °¿{
  6904. °¿/_ax exch ddef
  6905. °¿} def
  6906. °¿0/Ts % set super/subscripting (rise)    % rise Ts -
  6907. °¿{
  6908. °¿/_rise exch ddef
  6909. °¿
  6910. currentpoint
  6911. °¿iTm
  6912. °¿moveto
  6913. °¿} def
  6914. °¿M/Ti    % set indentation                % firstStartIndent otherStartIndent stopIndent Ti -
  6915. °¿{
  6916. °¿3 npop
  6917. °¿} def
  6918. °¿2/Tz % set horizontal scaling        % scalePercent Tz -
  6919. °¿{
  6920. °¿100 div /_hs exch ddef
  6921. °¿iTm
  6922. °¿} def
  6923. °¿-/TA % set pairwise kerning            % autoKern TA -
  6924. °¿+                                    %    autoKern = 0 -> no pair kerning
  6925. °¿,                                    %             = 1 -> automatic pair kerning
  6926. °¿{
  6927. °¿pop
  6928. °¿} def
  6929. °¿0/Tq % set hanging quotes            % hangingQuotes Tq -
  6930. °¿3                                    %    hangingQuotes     = 0 -> no hanging quotes
  6931. °¿&                                    %                     = 1 -> hanging quotes
  6932. °¿{
  6933. °¿pop
  6934. °¿} def
  6935. °¿% Text Bodies
  6936. °¿/TX {pop} def
  6937. °¿.%/Tx    % non-justified text            % textString Tx -
  6938. °¿+%/Tj    % justified text                % textString Tj -
  6939. °¿+/Tk    % kern                            % autoKern kernValue Tk -
  6940. °¿;                                    %      autoKern = 0 -> manual kern, = 1 -> auto kern
  6941. °¿3                                    %    kernValue = kern value in em/1000 space
  6942. °¿{
  6943. °¿!exch pop _fScl mul neg 0 rmoveto
  6944. °¿} def
  6945. °¿5/TK    % non-printing kern                % autoKern kernValue TK -
  6946. °¿{
  6947. °¿2 npop
  6948. °¿} def
  6949. °¿+/T* % carriage return & line feed    % - T* -
  6950. °¿{
  6951. °¿_leading aload pop neg Td
  6952. °¿} def
  6953. °¿6/T*- % carriage return & negative line feed    % - T*- -
  6954. °¿{
  6955. °¿_leading aload pop Td
  6956. °¿} def
  6957. °¿,/T-    % print a discretionary hyphen    % - T- -
  6958. °¿{
  6959. °¿ _hyphen Tx
  6960. °¿} def
  6961. °¿+/T+    % discretionary hyphen hyphen    % - T+ -
  6962. °¿{} def
  6963. °¿3/TR    % reset pattern matrix             % a b c d tx ty TR -
  6964. °¿{
  6965. °¿_ctm currentmatrix pop     
  6966. °¿_tm astore pop 
  6967. °¿iTm 0 0 moveto 
  6968. °¿} def
  6969. °¿4/TS    % special chars                    % textString justified TS -
  6970. °¿{
  6971. °¿0 eq {Tx} {Tj} ifelse
  6972. °¿} def
  6973. °¿currentdict readonly pop end
  6974. °¿ setpacking
  6975. °¿%%EndResource
  6976. °¿6%%BeginResource: procset Adobe_IllustratorA_AI3 1.0 2
  6977. °¿@%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog)
  6978. °¿%%Version: 1.0 
  6979. °¿%%CreationDate: (7/22/89) ()
  6980. °¿L%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved)
  6981. °¿currentpacking true setpacking
  6982. °¿7userdict /Adobe_IllustratorA_AI3 61 dict dup begin put
  6983. °¿% initialization
  6984. °¿ /initialize                % - initialize -
  6985. °¿{
  6986. °¿I% 47 vars, but leave slack of 10 entries for custom Postscript fragments
  6987. °¿<userdict /Adobe_IllustratorA_AI3_vars 57 dict dup begin put
  6988. °¿% paint operands
  6989. °¿/_lp /none def
  6990. °¿ /_pf {} def
  6991. °¿ /_ps {} def
  6992. °¿
  6993. /_psf {} def
  6994. °¿
  6995. /_pss {} def
  6996. °¿/_pjsf {} def
  6997. °¿/_pjss {} def
  6998. °¿
  6999. /_pola 0 def
  7000. °¿/_doClip 0 def
  7001. °¿% paint operators
  7002. °¿$/cf    currentflat def    % - cf flatness
  7003. °¿% typography operands
  7004. °¿/_tm matrix def
  7005. °¿5/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def 
  7006. °¿6/_renderEnd [null null null null /i1 /i1 /i1 /i1] def
  7007. °¿/_render -1 def
  7008. °¿
  7009. /_rise 0 def
  7010. °¿]/_ax 0 def            % x character spacing    (_ax, _ay, _cx, _cy follows awidthshow naming convention)
  7011. °¿#/_ay 0 def            % y character spacing
  7012. °¿/_cx 0 def            % x word spacing
  7013. °¿/_cy 0 def            % y word spacing
  7014. °¿/_leading [0 0] def
  7015. °¿/_ctm matrix def
  7016. °¿/_mtx matrix def
  7017. °¿/_sp 16#020 def
  7018. °¿/_hyphen (-) def
  7019. °¿
  7020. /_fScl 0 def
  7021. °¿ /_cnt 0 def
  7022. °¿ /_hs 1 def
  7023. °¿/_nativeEncoding 0 def
  7024. °¿/_useNativeEncoding 0 def
  7025. °¿/_tempEncode 0 def
  7026. °¿
  7027. /_pntr 0 def
  7028. °¿/_tDict 2 dict def
  7029. °¿% typography operators
  7030. °¿ /Tx {} def
  7031. °¿ /Tj {} def
  7032. °¿% compound path operators
  7033. °¿/CRender {} def
  7034. °¿ % printing
  7035. °¿/_AI3_savepage {} def
  7036. °¿% color operands
  7037. °¿/_gf null def
  7038. °¿/_cf 4 array def
  7039. °¿/_if null def
  7040. °¿/_of false def
  7041. °¿ /_fc {} def
  7042. °¿/_gs null def
  7043. °¿/_cs 4 array def
  7044. °¿/_is null def
  7045. °¿/_os false def
  7046. °¿ /_sc {} def
  7047. °¿
  7048. /_i null def
  7049. °¿Adobe_IllustratorA_AI3 begin
  7050. °¿Adobe_IllustratorA_AI3
  7051. °¿    {
  7052. °¿     dup xcheck
  7053. °¿        {
  7054. °¿        bind
  7055. °¿        } if
  7056. °¿        pop pop
  7057. °¿
  7058.     } forall
  7059. °¿end
  7060. °¿end
  7061. °¿Adobe_IllustratorA_AI3 begin
  7062. °¿"Adobe_IllustratorA_AI3_vars begin
  7063. °¿newpath
  7064. °¿} def
  7065. °¿/terminate                % - terminate -
  7066. °¿{
  7067. °¿end
  7068. °¿end
  7069. °¿} def
  7070. °¿% definition operators
  7071. °¿/_                    % - _ null
  7072. °¿    null def
  7073. °¿/ddef                % key value ddef -
  7074. °¿{
  7075. °¿)Adobe_IllustratorA_AI3_vars 3 1 roll put
  7076. °¿} def
  7077. °¿$/xput                % key value literal xput -
  7078. °¿{
  7079. °¿&dup load dup length exch maxlength eq
  7080. °¿    {
  7081. °¿    dup dup load dup
  7082. °¿    length 2 mul dict copy def
  7083. °¿    } if
  7084. °¿load begin def end
  7085. °¿} def
  7086. °¿/npop                % integer npop -
  7087. °¿{
  7088. °¿    {
  7089. °¿    pop
  7090. °¿
  7091.     } repeat
  7092. °¿} def
  7093. °¿% marking operators
  7094. °¿/sw                    % ax ay string sw x y 
  7095. °¿{
  7096. °¿dup length exch stringwidth
  7097. °¿%exch 5 -1 roll 3 index 1 sub mul add
  7098. °¿ 4 1 roll 3 1 roll 1 sub mul add
  7099. °¿} def
  7100. °¿./swj                % cx cy fillchar ax ay string swj x y
  7101. °¿{
  7102. °¿
  7103. dup 4 1 roll
  7104. °¿dup length exch stringwidth 
  7105. °¿%exch 5 -1 roll 3 index 1 sub mul add
  7106. °¿!4 1 roll 3 1 roll 1 sub mul add 
  7107. °¿6 2 roll /_cnt 0 ddef
  7108. °¿3{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop
  7109. °¿Nexch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
  7110. °¿} def
  7111. °¿#/ss                    % ax ay string matrix ss -
  7112. °¿{
  7113. °¿    4 1 roll
  7114. °¿'    {                % matrix ax ay char 0 0 {proc} -
  7115. °¿        2 npop 
  7116. °¿     (0) exch 2 copy 0 exch put pop
  7117. °¿    gsave
  7118. °¿    false charpath currentpoint
  7119. °¿    4 index setmatrix
  7120. °¿    stroke
  7121. °¿
  7122.     grestore
  7123. °¿    moveto
  7124. °¿    2 copy rmoveto
  7125. °¿    } exch cshow
  7126. °¿3 npop
  7127. °¿} def
  7128. °¿3/jss                % cx cy fillchar ax ay string matrix jss -
  7129. °¿{
  7130. °¿    4 1 roll
  7131. °¿9    {                % cx cy fillchar matrix ax ay char 0 0 {proc} -   
  7132. °¿        2 npop 
  7133. °¿    (0) exch 2 copy 0 exch put 
  7134. °¿    gsave
  7135. °¿        _sp eq 
  7136. °¿        {
  7137. °¿5        exch 6 index 6 index 6 index 5 -1 roll widthshow  
  7138. °¿        currentpoint
  7139. °¿        }
  7140. °¿        {
  7141. °¿        false charpath currentpoint
  7142. °¿        4 index setmatrix stroke
  7143. °¿
  7144.         }ifelse
  7145. °¿
  7146.     grestore
  7147. °¿    moveto
  7148. °¿    2 copy rmoveto
  7149. °¿    } exch cshow
  7150. °¿6 npop
  7151. °¿} def
  7152. °¿% path operators
  7153. °¿/sp                    % ax ay string sp -
  7154. °¿{
  7155. °¿    {
  7156. °¿    2 npop (0) exch
  7157. °¿    2 copy 0 exch put pop
  7158. °¿    false charpath
  7159. °¿    2 copy rmoveto
  7160. °¿    } exch cshow
  7161. °¿2 npop
  7162. °¿} def
  7163. °¿-/jsp                    % cx cy fillchar ax ay string jsp -
  7164. °¿{
  7165. °¿0    {                    % cx cy fillchar ax ay char 0 0 {proc} -
  7166. °¿        2 npop 
  7167. °¿    (0) exch 2 copy 0 exch put 
  7168. °¿        _sp eq 
  7169. °¿        {
  7170. °¿5        exch 5 index 5 index 5 index 5 -1 roll widthshow  
  7171. °¿        }
  7172. °¿        {
  7173. °¿        false charpath
  7174. °¿
  7175.         }ifelse
  7176. °¿    2 copy rmoveto
  7177. °¿    } exch cshow
  7178. °¿5 npop
  7179. °¿} def
  7180. °¿% path construction operators
  7181. °¿/pl                % x y pl x y
  7182. °¿{
  7183. °¿
  7184. transform
  7185. °¿0.25 sub round 0.25 add exch
  7186. °¿0.25 sub round 0.25 add exch
  7187. °¿ itransform
  7188. °¿} def
  7189. °¿/setstrokeadjust where
  7190. °¿    {
  7191. °¿    pop true setstrokeadjust
  7192. °¿    /c                % x1 y1 x2 y2 x3 y3 c -
  7193. °¿    {
  7194. °¿        curveto
  7195. °¿    } def
  7196. °¿    /C
  7197. °¿
  7198.     /c load def
  7199. °¿    /v                % x2 y2 x3 y3 v -
  7200. °¿    {
  7201. °¿    currentpoint 6 2 roll curveto
  7202. °¿    } def
  7203. °¿    /V
  7204. °¿
  7205.     /v load def
  7206. °¿    /y                % x1 y1 x2 y2 y -
  7207. °¿    {
  7208. °¿    2 copy curveto
  7209. °¿    } def
  7210. °¿    /Y
  7211. °¿
  7212.     /y load def
  7213. °¿    /l                % x y l -
  7214. °¿    {
  7215. °¿    lineto
  7216. °¿    } def
  7217. °¿    /L
  7218. °¿
  7219.     /l load def
  7220. °¿    /m                % x y m -
  7221. °¿    {
  7222. °¿    moveto
  7223. °¿    } def
  7224. °¿    }
  7225. °¿    {%else
  7226. °¿    /c
  7227. °¿    {
  7228. °¿     pl curveto
  7229. °¿    } def
  7230. °¿    /C
  7231. °¿
  7232.     /c load def
  7233. °¿    /v
  7234. °¿    {
  7235. °¿"    currentpoint 6 2 roll pl curveto
  7236. °¿    } def
  7237. °¿    /V
  7238. °¿
  7239.     /v load def
  7240. °¿    /y
  7241. °¿    {
  7242. °¿    pl 2 copy curveto
  7243. °¿    } def
  7244. °¿    /Y
  7245. °¿
  7246.     /y load def
  7247. °¿    /l
  7248. °¿    {
  7249. °¿     pl lineto
  7250. °¿    } def
  7251. °¿    /L
  7252. °¿
  7253.     /l load def
  7254. °¿    /m
  7255. °¿    {
  7256. °¿     pl moveto
  7257. °¿    } def
  7258. °¿        }ifelse
  7259. °¿% graphic state operators
  7260. °¿/d                    % array phase d -
  7261. °¿{
  7262. °¿setdash
  7263. °¿} def
  7264. °¿/cf    {} def            % - cf flatness
  7265. °¿/i                    % flatness i -
  7266. °¿{
  7267. °¿    dup 0 eq
  7268. °¿    {
  7269. °¿    pop cf
  7270. °¿    } if
  7271. °¿setflat
  7272. °¿} def
  7273. °¿/j                    % linejoin j -
  7274. °¿{
  7275. °¿ setlinejoin
  7276. °¿} def
  7277. °¿/J                    % linecap J -
  7278. °¿{
  7279. °¿ setlinecap
  7280. °¿} def
  7281. °¿/M                    % miterlimit M -
  7282. °¿{
  7283. °¿setmiterlimit
  7284. °¿} def
  7285. °¿/w                    % linewidth w -
  7286. °¿{
  7287. °¿
  7288. setlinewidth
  7289. °¿} def
  7290. °¿% path painting operators
  7291. °¿/H                    % - H -
  7292. °¿{} def
  7293. °¿/h                    % - h -
  7294. °¿{
  7295. °¿
  7296. closepath
  7297. °¿} def
  7298. °¿/N                    % - N -
  7299. °¿{
  7300. °¿ _pola 0 eq 
  7301. °¿    {
  7302. °¿)    _doClip 1 eq {clip /_doClip 0 ddef} if 
  7303. °¿        newpath
  7304. °¿    } 
  7305. °¿    {
  7306. °¿    /CRender {N} ddef
  7307. °¿        }ifelse
  7308. °¿} def
  7309. °¿/n                    % - n -
  7310. °¿{N} def
  7311. °¿/F                    % - F -
  7312. °¿{
  7313. °¿ _pola 0 eq 
  7314. °¿    {
  7315. °¿    _doClip 1 eq 
  7316. °¿        {
  7317. °¿7        gsave _pf grestore clip newpath /_lp /none ddef _fc 
  7318. °¿        /_doClip 0 ddef
  7319. °¿        }
  7320. °¿        {
  7321. °¿        _pf
  7322. °¿
  7323.         }ifelse
  7324. °¿    } 
  7325. °¿    {
  7326. °¿    /CRender {F} ddef
  7327. °¿        }ifelse
  7328. °¿} def
  7329. °¿/f                    % - f -
  7330. °¿{
  7331. °¿
  7332. closepath
  7333. °¿F
  7334. °¿} def
  7335. °¿/S                    % - S -
  7336. °¿{
  7337. °¿ _pola 0 eq 
  7338. °¿    {
  7339. °¿    _doClip 1 eq 
  7340. °¿        {
  7341. °¿7        gsave _ps grestore clip newpath /_lp /none ddef _sc 
  7342. °¿        /_doClip 0 ddef
  7343. °¿        }
  7344. °¿        {
  7345. °¿        _ps
  7346. °¿
  7347.         }ifelse
  7348. °¿    } 
  7349. °¿    {
  7350. °¿    /CRender {S} ddef
  7351. °¿        }ifelse
  7352. °¿} def
  7353. °¿/s                    % - s -
  7354. °¿{
  7355. °¿
  7356. closepath
  7357. °¿S
  7358. °¿} def
  7359. °¿/B                    % - B -
  7360. °¿{
  7361. °¿ _pola 0 eq 
  7362. °¿    {
  7363. °¿"    _doClip 1 eq     % F clears _doClip
  7364. °¿    gsave F grestore 
  7365. °¿        {
  7366. °¿4        gsave S grestore clip newpath /_lp /none ddef _sc
  7367. °¿        /_doClip 0 ddef
  7368. °¿        } 
  7369. °¿        {
  7370. °¿        S
  7371. °¿
  7372.         }ifelse
  7373. °¿    }
  7374. °¿    {
  7375. °¿    /CRender {B} ddef
  7376. °¿        }ifelse
  7377. °¿} def
  7378. °¿/b                    % - b -
  7379. °¿{
  7380. °¿
  7381. closepath
  7382. °¿B
  7383. °¿} def
  7384. °¿/W                    % - W -
  7385. °¿{
  7386. °¿/_doClip 1 ddef
  7387. °¿} def
  7388. °¿/*                    % - [string] * -
  7389. °¿{
  7390. °¿ count 0 ne 
  7391. °¿    {
  7392. °¿#    dup type (stringtype) eq {pop} if
  7393. °¿    } if 
  7394. °¿_pola 0 eq {newpath} if
  7395. °¿} def
  7396. °¿% group operators
  7397. °¿/u                    % - u -
  7398. °¿{} def
  7399. °¿/U                    % - U -
  7400. °¿{} def
  7401. °¿/q                    % - q -
  7402. °¿{
  7403. °¿_pola 0 eq {gsave} if
  7404. °¿} def
  7405. °¿/Q                    % - Q -
  7406. °¿{
  7407. °¿_pola 0 eq {grestore} if
  7408. °¿} def
  7409. °¿/*u                    % - *u -
  7410. °¿{
  7411. °¿_pola 1 add /_pola exch ddef
  7412. °¿} def
  7413. °¿/*U                    % - *U -
  7414. °¿{
  7415. °¿_pola 1 sub /_pola exch ddef 
  7416. °¿_pola 0 eq {CRender} if
  7417. °¿} def
  7418. °¿/D                    % polarized D -
  7419. °¿
  7420. {pop} def
  7421. °¿/*w                    % - *w -
  7422. °¿{} def
  7423. °¿/*W                    % - *W -
  7424. °¿{} def
  7425. °¿% place operators
  7426. °¿+/`                    % matrix llx lly urx ury string ` -
  7427. °¿{
  7428. °¿/_i save ddef
  7429. °¿6 1 roll 4 npop
  7430. °¿ concat pop
  7431. °¿userdict begin
  7432. °¿/showpage {} def
  7433. °¿
  7434. 0 setgray
  7435. °¿
  7436. 0 setlinecap
  7437. °¿1 setlinewidth
  7438. °¿0 setlinejoin
  7439. °¿10 setmiterlimit
  7440. °¿
  7441. [] 0 setdash
  7442. °¿newpath
  7443. °¿
  7444. 0 setgray
  7445. °¿false setoverprint
  7446. °¿} def
  7447. °¿/~                    % - ~ -
  7448. °¿{
  7449. °¿end
  7450. °¿ _i restore
  7451. °¿} def
  7452. °¿% color operators
  7453. °¿/O                    % flag O -
  7454. °¿{
  7455. °¿0 ne
  7456. °¿/_of exch ddef
  7457. °¿/_lp /none ddef
  7458. °¿} def
  7459. °¿/R                    % flag R -
  7460. °¿{
  7461. °¿0 ne
  7462. °¿/_os exch ddef
  7463. °¿/_lp /none ddef
  7464. °¿} def
  7465. °¿/g                    % gray g -
  7466. °¿{
  7467. °¿/_gf exch ddef
  7468. °¿/_fc
  7469. °¿{ 
  7470. °¿
  7471. _lp /fill ne
  7472. °¿    {
  7473. °¿    _of setoverprint
  7474. °¿
  7475.     _gf setgray
  7476. °¿    /_lp /fill ddef
  7477. °¿    } if
  7478. °¿} ddef
  7479. °¿/_pf
  7480. °¿{
  7481. °¿_fc
  7482. °¿fill
  7483. °¿} ddef
  7484. °¿/_psf
  7485. °¿{
  7486. °¿_fc
  7487. °¿ashow
  7488. °¿} ddef
  7489. °¿/_pjsf
  7490. °¿{
  7491. °¿_fc
  7492. °¿ awidthshow
  7493. °¿} ddef
  7494. °¿/_lp /none ddef
  7495. °¿} def
  7496. °¿/G                    % gray G -
  7497. °¿{
  7498. °¿/_gs exch ddef
  7499. °¿/_sc
  7500. °¿{
  7501. °¿_lp /stroke ne
  7502. °¿    {
  7503. °¿    _os setoverprint
  7504. °¿
  7505.     _gs setgray
  7506. °¿    /_lp /stroke ddef
  7507. °¿    } if
  7508. °¿} ddef
  7509. °¿/_ps
  7510. °¿{
  7511. °¿_sc
  7512. °¿stroke
  7513. °¿} ddef
  7514. °¿/_pss
  7515. °¿{
  7516. °¿_sc
  7517. °¿ss
  7518. °¿} ddef
  7519. °¿/_pjss
  7520. °¿{
  7521. °¿_sc
  7522. °¿jss
  7523. °¿} ddef
  7524. °¿/_lp /none ddef
  7525. °¿} def
  7526. °¿'/k                    % cyan magenta yellow black k -
  7527. °¿{
  7528. °¿_cf astore pop
  7529. °¿/_fc
  7530. °¿{
  7531. °¿
  7532. _lp /fill ne
  7533. °¿    {
  7534. °¿    _of setoverprint
  7535. °¿    _cf aload pop setcmykcolor
  7536. °¿    /_lp /fill ddef
  7537. °¿    } if
  7538. °¿} ddef
  7539. °¿/_pf
  7540. °¿{
  7541. °¿_fc
  7542. °¿fill
  7543. °¿} ddef
  7544. °¿/_psf
  7545. °¿{
  7546. °¿_fc
  7547. °¿ashow
  7548. °¿} ddef
  7549. °¿/_pjsf
  7550. °¿{
  7551. °¿_fc
  7552. °¿ awidthshow
  7553. °¿} ddef
  7554. °¿/_lp /none ddef
  7555. °¿} def
  7556. °¿'/K                    % cyan magenta yellow black K -
  7557. °¿{
  7558. °¿_cs astore pop
  7559. °¿/_sc
  7560. °¿{
  7561. °¿_lp /stroke ne
  7562. °¿    {
  7563. °¿    _os setoverprint
  7564. °¿    _cs aload pop setcmykcolor
  7565. °¿    /_lp /stroke ddef
  7566. °¿    } if
  7567. °¿} ddef
  7568. °¿/_ps
  7569. °¿{
  7570. °¿_sc
  7571. °¿stroke
  7572. °¿} ddef
  7573. °¿/_pss
  7574. °¿{
  7575. °¿_sc
  7576. °¿ss
  7577. °¿} ddef
  7578. °¿/_pjss
  7579. °¿{
  7580. °¿_sc
  7581. °¿jss
  7582. °¿} ddef
  7583. °¿/_lp /none ddef
  7584. °¿} def
  7585. °¿1/x                    % cyan magenta yellow black name gray x -
  7586. °¿{
  7587. °¿/_gf exch ddef
  7588. °¿findcmykcustomcolor
  7589. °¿/_if exch ddef
  7590. °¿/_fc
  7591. °¿{ 
  7592. °¿
  7593. _lp /fill ne
  7594. °¿    {
  7595. °¿    _of setoverprint
  7596. °¿#    _if _gf 1 exch sub setcustomcolor
  7597. °¿    /_lp /fill ddef
  7598. °¿    } if
  7599. °¿} ddef
  7600. °¿/_pf
  7601. °¿{
  7602. °¿_fc
  7603. °¿fill
  7604. °¿} ddef
  7605. °¿/_psf
  7606. °¿{
  7607. °¿_fc
  7608. °¿ashow
  7609. °¿} ddef
  7610. °¿/_pjsf
  7611. °¿{
  7612. °¿_fc
  7613. °¿ awidthshow
  7614. °¿} ddef
  7615. °¿/_lp /none ddef
  7616. °¿} def
  7617. °¿1/X                    % cyan magenta yellow black name gray X -
  7618. °¿{
  7619. °¿/_gs exch ddef
  7620. °¿findcmykcustomcolor
  7621. °¿/_is exch ddef
  7622. °¿/_sc
  7623. °¿{
  7624. °¿_lp /stroke ne
  7625. °¿    {
  7626. °¿    _os setoverprint
  7627. °¿#    _is _gs 1 exch sub setcustomcolor
  7628. °¿    /_lp /stroke ddef
  7629. °¿    } if
  7630. °¿} ddef
  7631. °¿/_ps
  7632. °¿{
  7633. °¿_sc
  7634. °¿stroke
  7635. °¿} ddef
  7636. °¿/_pss
  7637. °¿{
  7638. °¿_sc
  7639. °¿ss
  7640. °¿} ddef
  7641. °¿/_pjss
  7642. °¿{
  7643. °¿_sc
  7644. °¿jss
  7645. °¿} ddef
  7646. °¿/_lp /none ddef
  7647. °¿} def
  7648. °¿% locked object operator
  7649. °¿/A                    % value A -
  7650. °¿{
  7651. °¿pop
  7652. °¿} def
  7653. °¿currentdict readonly pop end
  7654. °¿ setpacking
  7655. °¿% annotate page operator
  7656. °¿/annotatepage
  7657. °¿{
  7658. °¿} def
  7659. °¿%%EndResource
  7660. °¿%/showpage{}def
  7661. °¿/copypage{}def
  7662. °¿[-115 262 -3 103]
  7663. °¿[newpath clippath pathbbox]
  7664. °¿
  7665. 2 dict begin
  7666. °¿ /d exch def
  7667. °¿ /s exch def
  7668. °¿d 0 get d 1 get translate
  7669. °¿,d 2 get d 0 get sub s 2 get s 0 get sub div
  7670. °¿,d 3 get d 1 get sub s 3 get s 1 get sub div
  7671. °¿scale
  7672. °¿"s 0 get neg s 1 get neg translate
  7673. °¿end
  7674. °¿ %%EndProlog
  7675. °¿
  7676. %%BeginSetup
  7677. °¿%Adobe_cmykcolor /initialize get exec
  7678. °¿!Adobe_cshow /initialize get exec
  7679. °¿'Adobe_customcolor /initialize get exec
  7680. °¿*Adobe_typography_AI3 /initialize get exec
  7681. °¿,Adobe_IllustratorA_AI3 /initialize get exec
  7682. °¿[
  7683. °¿M39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
  7684. °¿L/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
  7685. °¿I/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
  7686. °¿F/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
  7687. °¿K/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
  7688. °¿A/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
  7689. °¿:/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
  7690. °¿D/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
  7691. °¿C/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
  7692. °¿J/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe
  7693. °¿F/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
  7694. °¿L/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
  7695. °¿H/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
  7696. °¿D/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
  7697. °¿G/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
  7698. °¿F/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
  7699. °¿/hungarumlaut/ogonek/caron
  7700. °¿TE
  7701. °¿8%AI3_BeginEncoding: _Helvetica-Narrow Helvetica-Narrow
  7702. [°¿G/_Helvetica-Narrow/Helvetica-Narrow 0 0 1 TZ
  7703. %AI3_EndEncoding TrueType
  7704. °¿ %%EndSetup
  7705. °¿0 A
  7706. °¿u
  7707. °¿u
  7708. °¿0 O
  7709. °¿0 g
  7710. °¿0 R
  7711. °¿0 G
  7712. °¿0 i°¿ °¿0 J°¿ °¿0 j°¿ °¿0.5 w°¿ °¿10 M°¿ [°¿]0 d°¿
  7713. °¿ %AI3_Note:
  7714. °¿0 D
  7715. °¿-105.031 107.0853 m
  7716. °¿-9.031 107.0853 L
  7717. °¿-9.031 247.0853 L
  7718. °¿-105.031 247.0853 L
  7719. °¿-105.031 107.0853 L
  7720. °¿b
  7721. °¿1 g
  7722. °¿-107.031 109.0853 m
  7723. °¿-11.031 109.0853 L
  7724. °¿-11.031 249.0853 L
  7725. °¿-107.031 249.0853 L
  7726. °¿-107.031 109.0853 L
  7727. °¿b
  7728. °¿u
  7729. °¿-107.031 123.8353 m
  7730. °¿-11.031 123.8353 l
  7731. °¿S
  7732. °¿U
  7733. °¿u
  7734. °¿u
  7735. °¿0 O
  7736. °¿1 g
  7737. °¿2 w°¿
  7738. °¿-4.125 175.8863 m
  7739. °¿-4.125 197.1363 L
  7740. °¿-16.375 197.1363 L
  7741. °¿-16.375 175.8863 L
  7742. °¿-4.125 175.8863 L
  7743. °¿f
  7744. °¿-10.25 186.5113 m
  7745. °¿F
  7746. °¿U
  7747. °¿u
  7748. °¿0 g
  7749. °¿0.25 w°¿
  7750. °¿-11.655 191.9533 m
  7751. °¿4-11.416 191.1073 -10.537 190.6163 -9.691 190.8553 c
  7752. °¿2-8.846 191.0943 -8.354 191.9743 -8.594 192.8193 c
  7753. °¿3-8.833 193.6653 -9.712 194.1563 -10.558 193.9173 c
  7754. °¿5-11.403 193.6783 -11.895 192.7983 -11.655 191.9533 c
  7755. °¿f
  7756. °¿-10.125 192.3863 m
  7757. °¿F
  7758. °¿U
  7759. °¿u
  7760. °¿-11.655 185.9533 m
  7761. °¿4-11.416 185.1073 -10.537 184.6163 -9.691 184.8553 c
  7762. °¿2-8.846 185.0943 -8.354 185.9743 -8.594 186.8193 c
  7763. °¿3-8.833 187.6653 -9.712 188.1563 -10.558 187.9173 c
  7764. °¿5-11.403 187.6783 -11.895 186.7983 -11.655 185.9533 c
  7765. °¿f
  7766. °¿-10.125 186.3863 m
  7767. °¿F
  7768. °¿U
  7769. °¿u
  7770. °¿-11.655 179.9533 m
  7771. °¿4-11.416 179.1073 -10.537 178.6163 -9.691 178.8553 c
  7772. °¿2-8.846 179.0943 -8.354 179.9743 -8.594 180.8193 c
  7773. °¿3-8.833 181.6653 -9.712 182.1563 -10.558 181.9173 c
  7774. °¿5-11.403 181.6783 -11.895 180.7983 -11.655 179.9533 c
  7775. °¿f
  7776. °¿-10.125 180.3863 m
  7777. °¿F
  7778. °¿U
  7779. °¿U
  7780. °¿u
  7781. °¿u
  7782. °¿1 g
  7783. °¿2 w°¿
  7784. °¿-101.125 175.8863 m
  7785. °¿-101.125 197.1363 L
  7786. °¿-113.375 197.1363 L
  7787. °¿-113.375 175.8863 L
  7788. °¿-101.125 175.8863 L
  7789. °¿f
  7790. °¿-107.25 186.5113 m
  7791. °¿F
  7792. °¿U
  7793. °¿u
  7794. °¿0 g
  7795. °¿0.25 w°¿
  7796. °¿-108.655 191.9533 m
  7797. °¿8-108.416 191.1073 -107.537 190.6163 -106.691 190.8553 c
  7798. °¿8-105.846 191.0943 -105.354 191.9743 -105.594 192.8193 c
  7799. °¿8-105.833 193.6653 -106.712 194.1563 -107.558 193.9173 c
  7800. °¿8-108.403 193.6783 -108.895 192.7983 -108.655 191.9533 c
  7801. °¿f
  7802. °¿-107.125 192.3863 m
  7803. °¿F
  7804. °¿U
  7805. °¿u
  7806. °¿-108.655 185.9533 m
  7807. °¿8-108.416 185.1073 -107.537 184.6163 -106.691 184.8553 c
  7808. °¿8-105.846 185.0943 -105.354 185.9743 -105.594 186.8193 c
  7809. °¿8-105.833 187.6653 -106.712 188.1563 -107.558 187.9173 c
  7810. °¿8-108.403 187.6783 -108.895 186.7983 -108.655 185.9533 c
  7811. °¿f
  7812. °¿-107.125 186.3863 m
  7813. °¿F
  7814. °¿U
  7815. °¿u
  7816. °¿-108.655 179.9533 m
  7817. °¿8-108.416 179.1073 -107.537 178.6163 -106.691 178.8553 c
  7818. °¿8-105.846 179.0943 -105.354 179.9743 -105.594 180.8193 c
  7819. °¿8-105.833 181.6653 -106.712 182.1563 -107.558 181.9173 c
  7820. °¿8-108.403 181.6783 -108.895 180.7983 -108.655 179.9533 c
  7821. °¿f
  7822. °¿-107.125 180.3863 m
  7823. °¿F
  7824. °¿U
  7825. °¿U
  7826. °¿u
  7827. °¿0 R
  7828. °¿0 G
  7829. °¿0.5 w°¿
  7830. °¿-107.031 153.3353 m
  7831. °¿-11.031 153.3353 l
  7832. °¿S
  7833. °¿U
  7834. °¿u
  7835. °¿-106.531 168.0853 m
  7836. °¿-10.531 168.0853 l
  7837. °¿S
  7838. °¿U
  7839. °¿u
  7840. °¿-107.031 234.3353 m
  7841. °¿-11.031 234.3353 l
  7842. °¿S
  7843. °¿U
  7844. °¿u
  7845. °¿-107.031 204.8353 m
  7846. °¿-11.031 204.8353 l
  7847. °¿S
  7848. °¿U
  7849. °¿0 To
  7850. °¿1 0 0 1 -58.578 238.6583 0 Tp
  7851. °¿TP
  7852. °¿-31.5725 0 Td
  7853. °¿0 Tr
  7854. °¿0 O
  7855. °¿0 g
  7856. °¿1 w°¿ °¿4 M°¿
  7857. °¿/_Helvetica-Narrow 9 Tf
  7858. °¿0 Ts
  7859. °¿100 Tz
  7860. °¿0 Tt
  7861. °¿0 TA
  7862. °¿    0 0 5 TC
  7863. °¿100 100 200 TW
  7864. °¿    0 0 0 Ti
  7865. °¿1 Ta
  7866. °¿0 Tq
  7867. °¿28 0 Tl
  7868. °¿0 Tc
  7869. °¿0 Tw
  7870. °¿(length of first buffer)°¿ Tx°¿ 
  7871. °¿(\r) TX°¿ 
  7872. °¿TO
  7873. °¿0 To
  7874. °¿1 0 0 1 -58.578 157.6583 0 Tp
  7875. °¿TP
  7876. °¿-31.3704 0 Td
  7877. °¿0 Tr
  7878. °¿(length of last buffer)°¿ Tx°¿ 
  7879. °¿(\r) TX°¿ 
  7880. °¿TO
  7881. °¿0 R
  7882. °¿0 G
  7883. °¿0.5 w°¿
  7884. °¿-107.031 249.0853 m
  7885. °¿-102.078 249.0853 l
  7886. °¿S
  7887. °¿-107.031 241.7286 m
  7888. °¿-102.078 241.7286 l
  7889. °¿S
  7890. °¿-107.031 234.3719 m
  7891. °¿-102.078 234.3719 l
  7892. °¿S
  7893. °¿-107.031 227.0152 m
  7894. °¿-102.078 227.0152 l
  7895. °¿S
  7896. °¿-107.031 219.6584 m
  7897. °¿-102.078 219.6584 l
  7898. °¿S
  7899. °¿u
  7900. °¿-107.031 219.6584 m
  7901. °¿-102.078 219.6584 l
  7902. °¿S
  7903. °¿-107.031 212.3017 m
  7904. °¿-102.078 212.3017 l
  7905. °¿S
  7906. °¿U
  7907. °¿u
  7908. °¿-107.031 168.0883 m
  7909. °¿-102.078 168.0883 l
  7910. °¿S
  7911. °¿-107.031 160.7316 m
  7912. °¿-102.078 160.7316 l
  7913. °¿S
  7914. °¿U
  7915. °¿u
  7916. °¿-107.031 160.6584 m
  7917. °¿-102.078 160.6584 l
  7918. °¿S
  7919. °¿-107.031 153.3017 m
  7920. °¿-102.078 153.3017 l
  7921. °¿S
  7922. °¿-107.031 145.945 m
  7923. °¿-102.078 145.945 l
  7924. °¿S
  7925. °¿-107.031 131.2316 m
  7926. °¿-102.078 131.2316 l
  7927. °¿S
  7928. °¿-107.031 138.695 m
  7929. °¿-102.078 138.695 l
  7930. °¿S
  7931. °¿U
  7932. °¿u
  7933. °¿-107.031 131.1584 m
  7934. °¿-102.078 131.1584 l
  7935. °¿S
  7936. °¿-107.031 123.8017 m
  7937. °¿-102.078 123.8017 l
  7938. °¿S
  7939. °¿-107.031 116.445 m
  7940. °¿-102.078 116.445 l
  7941. °¿S
  7942. °¿-107.031 109.0883 m
  7943. °¿-102.078 109.0883 l
  7944. °¿S
  7945. °¿U
  7946. °¿0 To
  7947. °¿1 0 0 1 -58.578 217.4083 0 Tp
  7948. °¿TP
  7949. °¿-32.8008 0 Td
  7950. °¿0 Tr
  7951. °¿0 O
  7952. °¿0 g
  7953. °¿1 w°¿
  7954. °¿(pointer to first buffer)°¿ Tx°¿ 
  7955. °¿(\r) TX°¿ 
  7956. °¿TO
  7957. °¿0 To
  7958. °¿1 0 0 1 -58.578 137.4083 0 Tp
  7959. °¿TP
  7960. °¿-32.5986 0 Td
  7961. °¿0 Tr
  7962. °¿(pointer to last buffer)°¿ Tx°¿ 
  7963. °¿(\r) TX°¿ 
  7964. °¿TO
  7965. °¿0 To
  7966. °¿1 0 0 1 -58.578 114.4083 0 Tp
  7967. °¿TP
  7968. °¿-18.6504 0 Td
  7969. °¿0 Tr
  7970. °¿(zero \(word\))°¿ Tx°¿ 
  7971. °¿(\r) TX°¿ 
  7972. °¿TO
  7973. °¿0 R
  7974. °¿0 G
  7975. °¿0.5 w°¿
  7976. °¿-16.281 241.7286 m
  7977. °¿-11.328 241.7286 l
  7978. °¿S
  7979. °¿-16.281 227.0152 m
  7980. °¿-11.328 227.0152 l
  7981. °¿S
  7982. °¿-16.281 219.6584 m
  7983. °¿-11.328 219.6584 l
  7984. °¿S
  7985. °¿u
  7986. °¿-16.281 219.6584 m
  7987. °¿-11.328 219.6584 l
  7988. °¿S
  7989. °¿-16.281 212.3017 m
  7990. °¿-11.328 212.3017 l
  7991. °¿S
  7992. °¿U
  7993. °¿u
  7994. °¿-16.281 160.6584 m
  7995. °¿-11.328 160.6584 l
  7996. °¿S
  7997. °¿-16.281 153.3017 m
  7998. °¿-11.328 153.3017 l
  7999. °¿S
  8000. °¿-16.281 145.945 m
  8001. °¿-11.328 145.945 l
  8002. °¿S
  8003. °¿-16.281 131.2316 m
  8004. °¿-11.328 131.2316 l
  8005. °¿S
  8006. °¿-16.281 138.695 m
  8007. °¿-11.328 138.695 l
  8008. °¿S
  8009. °¿U
  8010. °¿u
  8011. °¿-16.281 131.1584 m
  8012. °¿-11.328 131.1584 l
  8013. °¿S
  8014. °¿-16.281 123.8017 m
  8015. °¿-11.328 123.8017 l
  8016. °¿S
  8017. °¿-16.281 116.445 m
  8018. °¿-11.328 116.445 l
  8019. °¿S
  8020. °¿-16.281 109.0883 m
  8021. °¿-11.328 109.0883 l
  8022. °¿S
  8023. °¿U
  8024. °¿0 To
  8025. °¿1 0 0 1 -58.578 253.1583 0 Tp
  8026. °¿TP
  8027. °¿
  8028. -8.8154 0 Td
  8029. °¿0 Tr
  8030. °¿0 O
  8031. °¿0 g
  8032. °¿1 w°¿
  8033. °¿(8 bits)°¿ Tx°¿ 
  8034. °¿(\r) TX°¿ 
  8035. °¿TO
  8036. °¿U
  8037. °¿U
  8038. °¿%%PageTrailer
  8039. °¿
  8040. %%Trailer
  8041. °¿+Adobe_IllustratorA_AI3 /terminate get exec
  8042. °¿)Adobe_typography_AI3 /terminate get exec
  8043. °¿&Adobe_customcolor /terminate get exec
  8044. °¿ Adobe_cshow /terminate get exec
  8045. °¿$Adobe_cmykcolor /terminate get exec
  8046. °¿&Adobe_packedarray /terminate get exec
  8047. °¿%%EndDocument
  8048. †ø †◊#ˇ ˇˇˇˇ#◊ 
  8049. d,Times
  8050. .°dONLNd!Æ,+ÃHFThe buffer area for incoming datagrams belongs to the MacTCP driver as°dONLNdG/Æ:*Ilong as the TCP stream is open. When TCPRelease is called, this memory is°dONLNdë=ÆH‰*Ereturned to you and you can then reuse it or return it to the system.°dONLNd◊RÆ]¯*EAn application should allocate memory by first finding the MTU of the°dONLNd`Ækˇ*Dphysical network (see the UDPMTU section in Chapter 3). Some network°dONLNdbnÆy”*<devices supported by MacTCP have very large MTU sizes. If an°dONLNdü|Æá*Happropriate amount of memory is not allocated to the TCP connection, the°dONLNdËäÆï¸*Cconnection will behave unpredictably. The minimum memory allocation°dONLNd,òÆ£*Hshould be 4N + 1024, where N is the size of the physical MTU returned by°dONLNdu¶Æ±*the UDPMTU call.,N Helvetica Narrow
  8051. °dONLNdÜÃT⁄å(ˆr    Using TCP
  8052. °dONLNdêÂÆ +Z<This section describes how to send and receive TCP segments.
  8053. °dONLNdÕÆ
  8054. 3*Streams and connections
  8055. °dONLNdÂÆ#*GA TCP stream supports one connection at a time. But a TCP connection on°dONLNd-&Æ1˚*Fa stream can be closed and another connection opened without releasing°dONLNdt4Æ?Û*Athe TCP stream. The MacTCP driver can support 64 open TCP streams°dONLNd∂BÆMˆ*simultaneously.
  8056. °dONLNdΔ]Æjc*!Asynchronous notification routine
  8057. °dONLNdËuÆÄ*JWhen a TCP stream is created, a routine can be registered that TCP uses to°dONLNd3ÉÆéÁ*Cnotify you of asynchronous events relevant to that TCP stream. This°dONLNdwëÆú *>routine is called the asynchronous notification routine (ASR).°dONLNd∂¶Æ±¸*EExamples of events that the MacTCP driver communicates to the user by°dONLNd¸¥ÆøM*means of an ASR include Timeout°dONLNd¥MøP)ü °dONLNd¥Pø)%Expired, Data Arrived, and Connection°dONLNdB¬ÆÕÓ(ÈÃGTerminated. Since the ASR is called from the interrupt level, it cannot°dONLNdä–Æ€Ï*Ballocate or release memory. In addition, synchronous MacTCP driver°dONLNdÕfiÆÈr*&commands cannot be issued from an ASR.
  8058. °dONLNdÙ˘Æ*Connection opening
  8059. °dONLNdÆ*ETo listen for an incoming connection, use the TCPPassiveOpen command.°dONLNdMÆ*¸*CThis command can be used to specify whether any incoming connection°dONLNdë-Æ8¸*Hwill be accepted or only connections from a particular remote IP address°dONLNd⁄;ÆFÔ*
  8060. and TCP port.°dONLNdËPÆ[Í*@To initiate outgoing connections, use the TCPActiveOpen command.(Ÿ‚    Using TCP
  8061. )<31 ÃpÃ)ˇ ¥◊#ˇ ˇˇˇˇ#◊ 
  8062. d,N Helvetica Narrow
  8063. .°dONLNdx,≈+ñHReceiving data,Times
  8064. °dONLNd7xBŒ*GTwo methods are available for receiving data: a high-performance method°dONLNdWExPØ*Band a simple method. You can choose the method that best suits the°dONLNdöSx^b*2application or combine the two methods if desired.°dONLNdÕhxs‘*FUsing the TCPNoCopyRcv routine is the high-performance method. Data is°dONLNdvxÅÕ*Kdelivered to the user directly from the internal TCP receive buffers and no°dONLNd`Ñxèœ*Hcopy is required. An RDS is formatted to allow many received segments to°dONLNd©íxùÀ*Bbe delivered to the user in one TCPNoCopyRcv command. TCPBfrReturn°dONLNdφx´—*Fmust be called for every TCPNoCopyRcv that returns a nonzero amount of°dONLNd3Æxπ≈*Jdata in order to return the internal receive buffers to the MacTCP driver.°dONLNd~√xŒ«*HUsing the TCPRcv routine is the simple method of receiving data. Data is°dONLNd«—x‹À*Jcopied from the TCP internal receive buffers into the user’s buffer, which°dONLNdflxÍõ*>can be of arbitrary length and location. No RDS is used and no°dONLNdQÌx¯*TCPBfrReturn call is required.
  8065. °dONLNdqxæ* Sending data
  8066. °dONLNd~ x+À*ITo send data on a connection that is already established, use the TCPSend°dONLNd».x9©*command.°dONLNd—CxNø*CBoth commands use WDSs to implement a gather-write capability. This°dONLNdQx\–*Iallows you to send several noncontiguous chunks of data in one operation.
  8067. °dONLNd_lxy©*Timeouts
  8068. °dONLNdhÑxè *GTCP normally provides some timeout services to the upper-layer protocol°dONLNd∞íxù“*L(ULP). This timeout service is known as the ULP timeout. If there is data to°dONLNd˝†x´‘*Ksend on a connection, but for some specified period of time the data cannot°dONLNdIÆxπÕ*Lbe sent (either because the remote TCP is not set to receive any data or the°dONLNdñºx«»*Hdata has been sent but the remote TCP has not acknowledged it), then the°dONLNdfl x’⁄*ULP timeout expires.°dONLNdÙflxÍ√*DWhen the ULP timeout expires, TCP executes the specified ULP timeout°dONLNd9Ìx¯Δ*Jaction. There are two possible actions: abort the connection or report the°dONLNdÑ˚xÜ*:timer expiration by means of an ASR and restart the timer.°dONLNdøx¶*@In addition to this normal TCP timer, the MacTCP driver provides°dONLNdx)¡*Ccommand timeouts on commands that are not subject to the ULP timer.°dONLNdD,x7ª*<These commands are TCPPassiveOpen, TCPNoCopyRcv, and TCPRcv.
  8069. (Ÿ<32
  8070. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ
  8071. ™◊#ˇ ˇˇˇˇ#◊ 
  8072. d,Times
  8073. .°dONLNd!Æ,Ê+ÃH>A TCPPassiveOpen command instructs TCP to wait for an incoming°dONLNd?/Æ:    *Nconnection. The ULP timer is not started until the first connection initiation°dONLNdé=ÆHÙ*Asegment arrives. To prevent a TCPPassiveOpen command from waiting°dONLNd–KÆVÎ*Eindefinitely for a connection initiation segment to arrive, a command°dONLNdYÆd*Ktimeout is provided. If no connection initiation segment is received within°dONLNdbgÆr*Ethe specified timeout period, the TCPPassiveOpen command is completed°dONLNd®uÆÄ*with an error code.°dONLNdºäÆï¸*ASimilarly, the TCPNoCopyRcv and TCPRcv commands are not protected°dONLNd˛òÆ£˝*Cby the ULP timer. In the absence of command timeouts, both commands°dONLNdB¶Æ±*Mcould wait indefinitely for data to arrive. If a command timeout is specified°dONLNdê¥ÆøÊ*:on a TCPNoCopyRcv or TCPRcv command, the command is always°dONLNdÀ¬ÆÕ˘*Jcompleted within the specified time period. If no data has arrived at that°dONLNd–Æ€˚*Hpoint, the command is completed with an error. If some data has arrived,°dONLNd_fiÆÈ*Jthe command is completed successfully, returning the data that has arrived°dONLNd™ÏƘÀ*so far.,N Helvetica Narrow
  8074. °dONLNd≤Æ* Pushed data
  8075. °dONLNdæÆ*‹*@Usually, TCP is allowed to collect data sent by means of TCPSend°dONLNdˇ-Æ8*Icommands and to send that data in segments, as convenient. By setting the°dONLNdI;ÆFÒ*CPush flag in the TCPSend command, TCP can be instructed to send all°dONLNdçIÆT    *unsent data at once.°dONLNd¢^Æi˚*LSimilarly, TCP is allowed to collect received data internally and deliver it°dONLNdÔlÆw*Jwith reasonable promptness to the user. However, when pushed data arrives,°dONLNd:zÆÖß*7TCP immediately delivers all received data to the user.°dONLNdrèÆöÓ*GNote that there is no necessary relationship between the Push flag in a°dONLNd∫ùÆ®*BTCPSend command and segment boundaries. The push function does not°dONLNd˝´Æ∂ò*/provide a method of marking message boundaries.
  8076. °dONLNd-ΔÆ”Ò* Urgent mode
  8077. °dONLNd9fiÆÈÔ*BThe urgent mechanism for TCP allows the sending user to prompt the°dONLNd|ÏÆ˜˘*Jreceiving user to accept urgent data. It also permits the receiving TCP to°dONLNd«˙ÆÛ*Gindicate to the receiving user when all currently known urgent data has°dONLNdÆ*been received.°dONLNdÆ(*HTCP does not define what the user is required to do when in urgent mode,°dONLNdg+Æ6*Obut the general practice is that the receiving user takes action to process the°dONLNd∑9ÆD*arriving data quickly.°dONLNdŒNÆY˚*FA receiving user can be put in urgent mode in two ways: by means of an°dONLNd\Æg˘*@Urgent flag in a TCPNoCopyRcv or TCPRcv command, or by an urgent°dONLNdVjÆu*GASR notification. The user is always taken out of urgent mode by a Mark°dONLNdûxÆÉ    *Fflag in the TCPNoCopyRcv or TCPRcv command that contains the last byte°dONLNdÂÜÆëÚ*of urgent data.(Ÿ‚    Using TCP
  8078. );33 ÃpÃ)ˇ ¬◊#ˇ ˇˇˇˇ#◊ 
  8079. d,Times
  8080. .°dONLNd!x,≥+ñHCTo send data as urgent, you must set the Urgent flag in the TCPSend°dONLNdD/x:©*command.°dONLNdMAxLë*Note:°dONLNdRAëL∂)@  RFC 793 contained an incorrect specification pertaining to the°dONLNdìOxZ∑(vñDdescription of the end of urgent data. Consequently, many hosts have°dONLNdÿ]xh *Himplemented urgent data incorrectly. RFC 1122 corrects the definition of°dONLNd!kxvπ*Eurgent data. The MacTCP driver is compliant with both specifications,°dONLNdgyxÑà*<allowing you to send urgent data using either specification.°dONLNd•éxôπ*BSince there’s currently no known way to programmatically determine°dONLNdËúxß–*Iwhether the remote site is compliant with RFC 793 or 1122, there’s no way°dONLNd2™xµ«*Fto determine which urgent data format to use. You must devise your own°dONLNdy∏x√ü*    strategy.°dONLNdÉÕxÿ‘*IIt is recommended that you make urgent data self-formatting to circumvent°dONLNdÕ€xÊq*6the problem of detecting the exact end of urgent data.°dONLNdx˚”*HAn application can send urgent data according to RFC 793 or 1122. Unless°dONLNdM˛x    º*Han application specifies otherwise, urgent data is sent using the method°dONLNdñ x‚*specified in RFC 1122.,N Helvetica Narrow
  8081. °dONLNd≠'x4‡*Connection closing
  8082. °dONLNd¿?xJÀ*GTCP closes communications gracefully. All outstanding Send requests are°dONLNdMxX≈*Gtransmitted and acknowledged before the connection is allowed to close.°dONLNdP[xfÆ*=You can issue several TCPSend commands followed by a TCPClose°dONLNdéixt‘*Lcommand and expect that all the data will be sent successfully to the remote°dONLNd€wxÇè*TCP.°dONLNd·åxó…*CA TCPClose command means “I have no more data to send,” but it does°dONLNd%öx•¿*Dnot mean “I will receive no more data” or “shut down this connection°dONLNdj®x≥…*Eimmediately.” A connection may remain open indefinitely as the remote°dONLNd∞∂x¡°*<TCP continues to send data after a TCPClose command has been°dONLNd̃xœÃ*Ccompleted. When the remote TCP also issues a close command—and only°dONLNd1“x›”*Fthen—the connection is closed. A TCPRcv command should be issued after°dONLNdx‡xÎÕ*Ga TCPClose command has been completed to make sure that all the data is°dONLNd¿Óx˘°*    received.°dONLNd x»*KIf the desired effect is to break the connection without any assurance that°dONLNdxÜ*;all data in transit is delivered, use the TCPAbort command.
  8083. °dONLNdR,x9'*Network management information
  8084. °dONLNdrDxOæ*ATCP keeps two types of network management information: global TCP°dONLNd¥Rx]¬*Hinformation and stream-specific information, which is relevant only to a°dONLNd˝`xk»*particular stream.
  8085. (Ÿ<34
  8086. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ ¶◊#ˇ ˇˇˇˇ#◊ 
  8087. d,Times
  8088. .°dONLNd!Æ,ˇ+ÃHBThe TCPGlobalInfo command makes global TCP information accessible.°dONLNdC/Æ:˙*GThis command returns pointers to the actual structures where TCP stores°dONLNdã=ÆH¸*Kthis information. Thus, the user has read-write access to this information.°dONLNd◊RÆ]¯*CThe TCPStatus command makes stream-specific information accessible.°dONLNd`Æk‹*AMost stream-specific information is copied into the TCPStatus I/O°dONLNd]nÆy¸*Jparameter block, giving the user read-only access. But a direct pointer to°dONLNd®|Æáˇ*Othe traffic statistics allows the user read-write access to those counters (see°dONLNd¯äÆïõ*3the section “TCPGlobalInfo” later in this chapter).,N Helvetica Narrow
  8089. °dONLNd,•Æ≤Q*Formatting MacTCP commands
  8090. °dONLNdGΩÆ»¸*HIn most cases, a 0 value for a parameter in an I/O parameter block means°dONLNdêÀÆ÷ˇ*Lthat TCP will use its default value. Thus, you must initialize I/O parameter°dONLNd›ŸÆ‰¸*Jblocks and then fill in the required parameters, plus optional parameters.
  8091. °dONLNd(ˇT
  8092. ò()r TCP routines
  8093. °dONLNd5Æ#Ï+ZGThis section presents calls to the TCP driver. Table 4-1 lists each TCP°dONLNd}&Æ1*routine and its function.
  8094. °dONLNdòBÆM”*    Table 4-1°dONLNd°B”M    )%  TCP routines
  8095. °dONLNd∞VÆ^«({ÃRoutine°dONLNd∏V^$)ZFunction o o) Å Å)
  8096. °dONLNd¡hÆs⁄(èà   TCPCreate°dONLNdÀhsU)ZOpens a TCP stream°dONLNdfiwÆÇÔ(ûÃTCPPassiveOpen°dONLNdÌwÇÑ)Z"Listens for an incoming connection°dONLNdÜÆëÎ(≠Ã
  8097. TCPActiveOpen°dONLNdÜë†)Z*Initiates an outgoing call to a remote TCP°dONLNdIïÆ†”(ºÃTCPSend°dONLNdQï†é)Z$Sends specified data on a connection°dONLNdv§ÆØÎ(Àà TCPNoCopyRcv°dONLNdɧØÀ)Z5Retrieves data that has been received on a connection°dONLNdπ≥ÆæË(⁄à TCPBfrReturn°dONLNdΔ≥æƒ)Z2Returns a set of receive buffers to the TCP driver°dONLNd˘¬ÆÕŒ(ÈÃTCPRcv°dONLNd¬ÕÀ)Z5Retrieves data that has been received on a connection°dONLNd6—Æ‹‘(¯ÃTCPClose°dONLNd?—‹Õ)Z7Signals that the user has no more data to send on this °dONLNdw›Ë.*
  8098. connection°dONLNdÇÏÆ˜◊(ÃTCPAbort°dONLNdãϘæ)Z1Terminates the connection without trying to send °dONLNdΩ¯†* )outstanding data or deliver received data°dONLNdÁÆ⁄(.à   TCPStatus°dONLNdÒ”)Z5Extracts information from TCP regarding a particular °dONLNd'.*
  8099. connection°dONLNd2"Æ-‹(IÃ
  8100. TCPRelease°dONLNd="-V)ZCloses a TCP stream°dONLNdQ1Æ<Â(XÃ
  8101. TCPGlobalInfo°dONLNd_1<
  8102. )ZFAllows the user access to global statistics and parameters that affect°dONLNd¶=HW* the operation of TCP p p)
  8103. +≤u TCP routines
  8104. )E35 ÃpÃ)ˇ
  8105. ◊#ˇ ˇˇˇˇ#◊ 
  8106. d,N Helvetica Narrow
  8107. .°dONLNd-[+<I    TCPCreate,Times
  8108. °dONLNd
  8109. 8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd$8ˇC^)-csCode = TCPCreate°dONLNd7IxUÉ(qñ¨°dONLNd9J•U±)-28°dONLNd<J“UÁ)-long°dONLNdAJˇUA)-stream pointer°dONLNdP[xgÉ(ÉñưdONLNdR\•g±)-32°dONLNdU\“gÁ)-long°dONLNdZ\ˇgÖ)-pointer to receive buffer area°dONLNdymxyÉ(ïñưdONLNd{n•y±)-36°dONLNd~n“yÁ)-long°dONLNdÉnˇyÇ)-length of receive buffer area°dONLNd°xãÉ(ßñưdONLNd£Ä•ã±)-40°dONLNd¶Ä“ãÁ)-long°dONLNd´ÄˇãD)-pointer to ASR°dONLNd∫ëxùÉ(πñưdONLNdºí•ù±)-44°dONLNdøí“ùÁ)-long°dONLNdƒíˇùL)-user data pointer°dONLNd÷ßx≤Δ(ŒñETCPCreate opens a TCP stream. A TCP stream is not equivalent to a TCP°dONLNdµx¿“*Iconnection. The MacTCP driver returns a pointer to a stream database. The°dONLNdf√xŒœ*Istream pointer is an input parameter in all subsequent commands affecting°dONLNd∞—x‹™* the stream.°dONLNdºÊxÒ∂*DThe receive buffer area is a block of memory that TCP uses to buffer°dONLNdÙxˇ¡*Cincoming segments. Ownership of this block of memory passes to TCP.°dONLNdEx
  8110. ©*8The memory—a minimum of 4096 bytes—cannot be modified or°dONLNd~x¬*Irelocated until TCPRelease is called. The size of the receive window that°dONLNd»x)Ã*KTCP offers is based on the size of the receive buffer area passed to TCP in°dONLNd,x7æ*Dthe TCPCreate call. High-performance and block-oriented applications°dONLNdY:xE»*Ishould provide TCP with a large receive buffer area: 16 kilobytes (KB) is°dONLNd£HxSª*Crecommended and up to 128 KB can be useful in certain applications.°dONLNdÁVxaœ*HCharacter-oriented applications can use the minimum value of 4096 bytes;°dONLNd0dxoQ*-however, at least 8192 bytes are recommended.°dONLNd^yxÑ∫*AAn ASR may be provided. The ASR is called by TCP to notify you of°dONLNd†áxíΩ*Fasynchronous events such as Data arrival, Urgent data outstanding, and°dONLNdÁïx†•*CConnection terminated. If the routine is 0, you are not notified of°dONLNd+£xÆ⁄*asynchronous events.°dONLNd@∏√W(fl< Result codes°dONLNdM∏x√ì)ZnoErr°dONLNdS∏ˇ√%)áno error°dONLNd\ x’‘(ÒñstreamAlreadyOpen°dONLNdn ˇ’Δ)á,an open stream is already using this receive°dONLNdõÿˇ„2* buffer area°dONLNdßÍxı∏(ñ
  8111. invalidLength°dONLNdµ͡ıù)á$the receive buffer area is too small°dONLNd⁄¸xµ(#ñ
  8112. invalidBufPtr°dONLNd˸ˇù)á$the receive buffer area pointer is 0°dONLNd
  8113. x⁄(5ñinsufficientResources°dONLNd#ˇó)á64 TCP streams are already open
  8114. (Ÿ<36
  8115. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ F◊#ˇ ˇˇˇˇ#◊ 
  8116. d,N Helvetica Narrow
  8117. .°dONLNdÆ,Z+ÃH%TCP asynchronous notification routine,Times
  8118. °dONLNd&6ÆAÈ*BThe TCP asynchronous notification routine (ASR) is a user-supplied°dONLNdiDÆO˝*Hroutine called by TCP to notify you of asynchronous events relevant to a°dONLNd≤RÆ]*Jparticular TCP stream. You register this routine with TCP in the TCPCreate°dONLNd˝`Æk¡*call.°dONLNduÆÄˆ*NSince this routine is called at interrupt level, it cannot release or allocate°dONLNdRÉÆé*?memory. An ASR routine can issue additional asynchronous MacTCP°dONLNdíëÆú„*
  8119. driver calls.°dONLNd†´Æ∂s*+The C description of the ASR is as follows:,
  8120. Courier
  8121. °dONLNdúƻ* pascal void°dONLNdÿº»b)ZTCPNotifyProc (°dONLNdΠ÷Ä*StreamPtr tcpStream,°dONLNdÿ‰û*unsigned short eventCode,°dONLNd ÊÚh*Ptr userDataPtr,°dONLNd4Ù∞*unsigned short terminReason,°dONLNdT∞*struct ICMPReport *icmpMsg);
  8122. °dONLNdqÆ#˜(?ÃGRegister A1 contains a pointer to the Internet Control Message Protocol°dONLNdπ&Æ1Î*D(ICMP) report structure if the event code in D0 is ICMP received, A2°dONLNd˛4Æ?˛*Lcontains the user data pointer, A5 is already set up to point to application°dONLNdKBÆM˘*Gglobals, D0 (word) contains an event code, and D1 contains a reason for°dONLNdìPÆ[Ê* termination.°dONLNd†eTpã(år Event codes°dONLNd¨eÆpœ)Zclosing°dONLNd¥e5p)á-all data on this connection has been received°dONLNd‰s5~s*
  8123. and delivered°dONLNdÚÖÆêÈ(¨Ã ULP timeout°dONLNd˛Ö5ê˛)á)no response from the remote TCP; reported°dONLNd(ì5û*-only if TCP is configured to report a timeout°dONLNdV°5¨”*"instead of aborting the connection°dONLNdy≥ÆæŸ(⁄à   terminate°dONLNdÉ≥5æ¥)áconnection no longer exists°dONLNdü≈Æ–·(Ïà data arrival°dONLNd¨≈5–‘)á!data arrived, no receive commands°dONLNdŒ”5fik* outstanding°dONLNd⁄ÂÆ( Ãurgent data outstanding°dONLNdÚÂ5Ã)áuser should go into urgent mode°dONLNd˜Æ(ÃICMP message received°dONLNd(˜5‚)á$an Internet Control Message has been°dONLNdM5*-received on the stream; register A1 points to°dONLNd{5Ä*the ICMP report°dONLNdã-Æ8(TÃKFor the terminate event, a reason for connection termination is given in D1°dONLNd◊;ÆF–*(word):°dONLNdflMÆXÈ* remote abort°dONLNdÏM5XÍ)á%the remote TCP aborted the connection°dONLNd_ÆjÙ(ÜÃnetwork failure°dONLNd"_5jè)ácurrently not in use°dONLNd7qÆ| (òÃsecurity/precedence °dONLNdLq5|¯)á+invalid security option or precedence level°dONLNdxÆä⁄(¶Ãmismatch(Ÿÿ TCP routines
  8124. )E37 ÃpÃ)ˇ◊#ˇ ˇˇˇˇ#◊ 
  8125. d,Times
  8126. .°dONLNd!x,≥+ñH ULP timeout°dONLNd !ˇ,—)á+the ULP timeout expired; ULP timeout action°dONLNd8/ˇ:!*is abort°dONLNdAAxL®(hñ    ULP abort°dONLNdKAˇL≠)á"the user issued a TCPAbort command°dONLNdnSx^ß(zñ    ULP close°dONLNdxSˇ^ï)á the connection closed gracefully°dONLNdôexp∏(åñservice failure°dONLNd©eˇpø)á(unexpected connection initiation segment°dONLNd“sˇ~*read°dONLNd◊Öxêó(¨ñNote:  °dONLNdfiÖóêÑ)4Refer to the Appendix for the values of these types.°dONLNdöx•¿(¡ñIA closing notification means that the remote TCP has sent all the data it°dONLNd]®x≥≈*Jintends to send on this connection and that all data has been delivered to°dONLNd®∂x¡…*Ithe user. Closing notification does not mean that the connection has been°dONLNdÚƒxœ–*Kbroken. You can continue to send data for an arbitrary length of time after°dONLNd>“x›Œ*Ga closing notification is given. Only when you issue a TCPClose command°dONLNd܇xÎ*"will the connection be terminated.°dONLNd©ıx‘*JThe ULP timeout notification is given if the configured ULP timeout action°dONLNdÙx»*Jfor this connection is report, and the local TCP cannot get some data sent°dONLNd?x…*Gor acknowledged (or both), within the specified ULP timeout period. The°dONLNdáx* *JULP timer is restarted after notification and expires again in another ULP°dONLNd“-x8*"timeout period if nothing changes.°dONLNdıBxM≈*GFor each connection, TCP issues exactly one terminate notification when°dONLNd=Px[‘*Kthe connection is broken. This rule applies both when the connection closes°dONLNdâ^xix*7gracefully and when the connection terminates in error.°dONLNd¡sx~≠*FData arrival notification is given if a segment arrives and no receive°dONLNdÅxå«*Gcommands are outstanding. Even if more data arrives later, TCP does not°dONLNdPèxö¡*Hissue another data arrival notification until a receive command has been°dONLNdôùx®‘*Nissued and completed. In other words, a data arrival notification is not given°dONLNdË´x∂√*Iwith every segment that arrives, but instead is intended to prompt you to°dONLNd2πxƒÌ*issue a receive command.°dONLNdKŒxŸ‘*IUrgent notification is given only if no receive commands are pending when°dONLNdï‹xÁÀ*HTCP discovers outstanding urgent information on the connection. If there°dONLNdfiÍxı”*Iare outstanding receive commands, they are completed with the Urgent flag°dONLNd(¯xZ*3set, starting the reception of data in urgent mode.°dONLNd\
  8127. x”*IAn ICMP message reports an error in the processing of a datagram that was°dONLNd¶x&Ã*Hsent on a TCP stream. When an ICMP message is received, a data structure°dONLNdÔ)x4¿*His passed up by TCP to the client to describe the received message. This°dONLNd87xBö*@data structure, called an ICMP report, has the following format:°dONLNdyIxT~*0°dONLNd{I•Tº)-word°dONLNdÄI“T)-stream pointer°dONLNdè[xf~(Çñ2°dONLNdë[•f∫)-long°dONLNdñ[“fH)-local IP address of stream°dONLNd±mxx~(îñ6°dONLNd≥m•xº)-word°dONLNd∏m“xC)-local TCP port of stream°dONLNd—xä~(¶ñ8°dONLNd”•ä∫)-long°dONLNdÿ“ä√)-4remote IP address (destination of original datagram),N Helvetica Narrow
  8128. (Ÿ<38
  8129. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ ∏◊#ˇ ˇˇˇˇ#◊ 
  8130. d,Times
  8131. .°dONLNd!Æ,∫+ÃH12°dONLNd!€,Ú)-word°dONLNd!,U)-remote TCP port°dONLNd3Æ>∫(ZÃ14°dONLNd3€>Ú)-word°dONLNd 3>c)-ICMP message type°dONLNd2EÆP∫(lÃ16°dONLNd5E€PÚ)-word°dONLNd:EPô)-optional additional information°dONLNdZWÆb∫(~Ã18°dONLNd]W€b)-long°dONLNdbWbΩ)-'optional additional information pointer°dONLNdäsÆ~£(öÃ4The values for the ICMP message type are as follows:°dONLNdøÖÆê¥*0°dONLNd¡Ö€ê$)-net unreachable°dONLNd—óÆ¢¥(æÃ1°dONLNd”ó€¢))-host unreachable°dONLNd‰©Æ¥¥(–Ã2°dONLNdÊ©€¥=)-protocol unreachable°dONLNd˚ªÆΔ¥(‚Ã3°dONLNd˝ª€Δ))-port unreachable°dONLNdÕÆÿ¥(ÙÃ4°dONLNdÕ€ÿF)-fragmentation required°dONLNd'flÆÍ¥(Ã5°dONLNd)fl€Í1)-source route failed°dONLNd=ÒÆ¸¥(Ã6°dONLNd?Ò€¸)-
  8132. time exceeded°dONLNdMÆ¥(*Ã7°dONLNdO€3)-parameter problem°dONLNdaÆ ¥(<Ã8°dONLNdc€ I)-missing required option°dONLNd{1Æ<I(XÃ!Codes 0–3 are defined as follows:, p    AppleIconp
  8133. °dONLNdùEÆM≥*n
  8134. °dONLNdüCªN„)
  8135. ANet unreachable indicates that, according to the information in a°dONLNd·Qª\    *Kgateway routing table, the network specified in the IP destination field of°dONLNd-_ªjH*a TCP segment is unreachable.p
  8136. °dONLNdKsÆ{≥(òÃn
  8137. °dONLNdMqª|Ï)
  8138. BHost unreachable indicates that a gateway determined that the host°dONLNdêªä¯*Fspecified in the IP destination field of a TCP segment is unreachable.p
  8139. °dONLNd◊ìÆõ≥(∏Ãn
  8140. °dONLNdŸëªú)
  8141. FProtocol unreachable indicates that a TCP segment was delivered to the°dONLNd üª™˜*Fdestination host, but there was no process on that host to receive TCP°dONLNdg≠ª∏Ë*    segments.p
  8142. °dONLNdq¡Æ…≥(ÊÃn
  8143. °dONLNdsøª Ì)
  8144. BPort unreachable indicates that a TCP segment was delivered to the°dONLNd∂Õªÿ‡*Bdestination host, but there was no client of TCP listening on that°dONLNd˘€ªÊ*particular TCP port.°dONLNd˜Æ(ÃIIf the TCP stream is configured for the ULP abort timeout action, the TCP°dONLNdXÆÓ*Fclient need not take any action in response to destination unreachable°dONLNdüÆe*'messages (they are informational only).°dONLNd«(Æ3À*ATCP breaks the connection if there is data to send, but it is not°dONLNd    6ÆA*Hacknowledged within the ULP timeout period. If, however, this TCP stream°dONLNdRDÆO*Hhas been configured for the ULP report timeout action, then the TCP user°dONLNdõRÆ]Ú*Ghas taken responsibility for deciding when and if the remote host is no°dONLNd„`Æk´*6longer available, and the connection should be broken.,N Helvetica Narrow(Ÿÿ TCP routines
  8145. )E39 ÃpÃ)ˇ\◊#ˇ ˇˇˇˇ#◊ 
  8146. d,Times
  8147. .°dONLNd!x,”+ñHJA single destination unreachable message should not be taken too seriously°dONLNdK/x:—*Gbecause such messages may be received occasionally when the topology of°dONLNdì=xH¬*Ethe internet changes. But if several successive TCPSend commands each°dONLNdŸKxVœ*Kresult in an ICMP report indicating destination unreachable, the TCP client°dONLNd%Yxdµ*Eshould assume that the remote host has either crashed or is no longer°dONLNdkgxrB*+accessible and should break the connection.°dONLNdóÉxé*!Codes 4–8 are defined as follows:, p    AppleIconp
  8148. °dONLNdπóxü}*n
  8149. °dONLNdªïÖ†¿)
  8150. DFragmentation required indicates that the TCP user has set the Don’t°dONLNd£ÖÆπ*=Fragment flag in a TCPOpen command, yet a segment on that TCP°dONLNd>±Öºï*<connection could not be delivered to its destination without°dONLNd{øÖ π*Bfragmentation. To avoid this, don’t set the Don’t Fragment flag on°dONLNdæÕÖÿÍ*TCPOpen commands.p
  8151. °dONLNd–·xÈ}(ñn
  8152. °dONLNd“flÖ̓)
  8153. GSource route failed indicates that the TCP user has specified the route°dONLNdÌÖ¯Õ*Ithis datagram should take in the IP options but that particular route was°dONLNdd˚Ö¬*not available.p
  8154. °dONLNdsx}(4ñn
  8155. °dONLNdu
  8156. Ö…)
  8157. DTime exceeded indicates that the Time to Live specified in a TCPOpen°dONLNd∫Ö&«*Bcommand was too short to allow a TCP segment on this TCP stream to°dONLNd˝)Ö4≠*Abe delivered through all the necessary gateways on the way to its°dONLNd?7ÖB∏*Cdestination. A longer Time to Live value should be specified in the°dONLNdÉEÖPÊ*TCPOpen command.p
  8158. °dONLNdîYxa}(~ñn
  8159. °dONLNdñWÖbÀ)
  8160. DParameter problem indicates that the IP header used on a TCP segment°dONLNd€eÖpÆ*Awas not acceptable by either an intermediate gateway or the final°dONLNdsÖ~∏*Bdestination. The additional information pointer in the ICMP report°dONLNd`ÅÖå±*Cstructure points to a static copy of the IP header used for sending°dONLNd§èÖöº*Asegments on this TCP connection. The additional information value°dONLNdÊùÖ®ø*Dindicates a byte offset in the IP header where the parameter problem°dONLNd+´Ö∂Ω*Fexists. For example, an offset of 1 indicates that the Type of Service°dONLNdrπÖƒÕ*Mfield is invalid, and an offset of 20 indicates that the first option present°dONLNd¿«Ö“±* is invalid.p
  8161. °dONLNdÀx„}(ñn
  8162. °dONLNdŒŸÖ‰∑)
  8163. AMissing required option means that the remote TCP requires that a°dONLNdÁÖÚ *Gspecific IP option be present in the IP header. The IP option type code°dONLNdXıÖù*>that is required by the remote TCP is passed in the additional°dONLNdóÖ◊*information field.°dONLNd™x*‘(FñKMuch of the information that asynchronous notifications pass to you is also°dONLNdˆ-x8Ã*Javailable in other ways. For example, you can tell that the remote TCP has°dONLNdA;xF¥*Fclosed a connection either by waiting for a closing notification or by°dONLNdàIxTÑ*7submitting TCPRcv commands until one is returned with a°dONLNd¿WxbÎ*connectionClosing error.,N Helvetica Narrow
  8164. (Ÿ<40
  8165. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ¬◊#ˇ ˇˇˇˇ#◊ 
  8166. d,N Helvetica Narrow
  8167. .°dONLNdT-±+rITCPPassiveOpen,Times
  8168. °dONLNd8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd!8€CÁ)-26°dONLNd$8C)-word°dONLNd)85C∞)-csCode = TCPPassiveOpen°dONLNdAIÆUπ(qÃÆ°dONLNdCJ€UÁ)-28°dONLNdFJU)-long°dONLNdKJ5Uw)-stream pointer°dONLNdZ[Ægπ(ÉÃÆ°dONLNd\\€gÁ)-32°dONLNd_\g)-byte°dONLNdd\5g    )--ULP timeout value in seconds; 0 = use default°dONLNdímÆyπ(ïÃÆ°dONLNdîn€yÁ)-33°dONLNdóny)-byte°dONLNdún5yΔ)-ULP timeout action; 0 = report,°dONLNdΩ|5áÄ*nonzero = abort°dONLNdÕçÆôπ(µÃưdONLNdœé€ôÁ)-34°dONLNd“éô)-byte°dONLNd◊é5ôŸ)-%validity bits for optional parameters°dONLNd˝üÆ´π(«ÃưdONLNdˇ†€´Á)-35°dONLNd†´)-byte°dONLNd†5´˜)-(command timeout in seconds; 0 = infinity°dONLNd0±ÆΩπ(ŸÃ´°dONLNd2≤€ΩÁ)-36°dONLNd5≤Ω)-long°dONLNd:≤5Ω¥)-remote IP address; can be 0°dONLNdV√Æœπ(Îô°dONLNdXƒ€œÁ)-40°dONLNd[ƒœ)-word°dONLNd`ƒ5œØ)-remote TCP port; can be 0°dONLNdz’Æ·π(˝Ã¨°dONLNd|÷€·Á)-42°dONLNd÷·)-long°dONLNdÑ÷5·})-local IP address°dONLNdïÁÆÛπ(ô°dONLNdóË€ÛÁ)-46°dONLNdöËÛ)-word°dONLNdüË5Û¸)-+local TCP port; if 0, TCP assigns an unused°dONLNdÀˆ5H*port°dONLNd–Æπ(/ÃÆ°dONLNd“€Á)-48°dONLNd’)-byte°dONLNd⁄5x)-type of service°dONLNdÍÆ%π(AÃÆ°dONLNdÏ€%Á)-49°dONLNdÔ%)-byte°dONLNdÙ5%i)-
  8169. precedence°dONLNdˇ+Æ7π(SÃÆ°dONLNd,€7Á)-50°dONLNd,7)-byte°dONLNd    ,57ë)-don’t fragment flag°dONLNd=ÆIπ(eÃÆ°dONLNd>€IÁ)-51°dONLNd">I)-byte°dONLNd'>5Ih)- time to live°dONLNd4OÆ[π(wÃÆ°dONLNd6P€[Á)-52°dONLNd9P[)-byte°dONLNd>P5[n)-
  8170. security flag°dONLNdLaÆmπ(âÃÆ°dONLNdNb€mÁ)-53°dONLNdQbm)-byte°dONLNdVb5m})-IP option count°dONLNdfsÆπ(õÃÆ°dONLNdht€Á)-54°dONLNdkt)-var.°dONLNdpt5d)-
  8171. IP options°dONLNd{ÖÆëπ(≠ÃÆ°dONLNd}Ü€ëÁ)-94°dONLNdÄÜë)-long°dONLNdÖÜ5ëÇ)-user data pointer°dONLNdóõƶÒ(¬ÃATCPPassiveOpen listens for an incoming connection. The command is°dONLNdŸ©Æ¥Í*Ccompleted when a connection is established or when an error occurs.°dONLNdæÆ…˝*FSeveral fields in the TCPPassiveOpen command are optional. To indicate°dONLNddÃÆ◊*Owhether the user is including these optional parameters, a set of validity bits°dONLNd¥⁄ÆÂ*is defined as follows:°dONLNdÀÏÆ˜√*bit 4°dONLNd—Ϙê)Zprecedence parameter is valid°dONLNdÔ˛Æ    √(%Ãbit 5°dONLNdı˛    ü)Z"type of service parameter is valid°dONLNdÆ√(7Ãbit 6°dONLNd∂)Z%ULP timeout action parameter is valid°dONLNdD"Æ-√(IÃbit 7°dONLNdJ"-≤)Z$ULP timeout value parameter is valid°dONLNdo7ÆB(^ÃFFor example, a value of 0xC0 would mean that the ULP timeout value and°dONLNd∂EÆP*Oaction parameters are valid. If a validity bit is 0, TCP uses its default value°dONLNdSÆ^*for that parameter.(Ÿÿ TCP routines
  8172. )E41 ÃpÃ)ˇ Ñ◊#ˇ ˇˇˇˇ#◊ 
  8173. d,Times
  8174. .°dONLNd!x,Æ+ñHCIf the remote IP address and remote TCP port are 0, a connection is°dONLNdD/x:±*Baccepted from any remote TCP. If they are nonzero, a connection is°dONLNdá=xH…*Jaccepted only from that particular remote TCP. If the local TCP port is 0,°dONLNd“KxV*!TCP assigns an unused port value.°dONLNdÙ`xk¿*HIf a connection is partly established but cannot be completed within the°dONLNd=nxyŒ*JULP timeout period after the first connection opening segment arrives, the°dONLNdà|xáÃ*LULP action is taken. If the ULP timeout action is abort (the default value),°dONLNd’äxïÕ*Dthe connection is broken and the TCPPassiveOpen command is completed°dONLNdòx£Õ*Kin error. If the ULP timeout action is report, an ASR call informs the ULP,°dONLNdf¶x±”*Iand the ULP timer is restarted. The minimum value of the ULP timeout is 2°dONLNd∞¥xø≤*Dseconds; 0 means that TCP should use its default value of 2 minutes.°dONLNdı…x‘Ω*DIf no connection opening packet arrives within the specified command°dONLNd:◊x‚”*Ftimeout period after the TCPPassiveOpen command is issued, the command°dONLNdÅÂx√*Dis completed in error. The minimum value of the command timeout is 2°dONLNdΔÛx˛Ô*seconds; 0 means infinite.°dONLNd·xœ*JYou have control over many fields in the IP header of all segments sent on°dONLNd,x!≥*Ethis connection. You can set these fields only when the connection is°dONLNdr$x/T*.opened. They stay fixed during the connection.°dONLNd¢@xK*%The type of service is a 3-bit field:°dONLNd»Rx]ç*bit 0°dONLNdŒR“])Zset for low delay°dONLNd‡dxoç(ãñbit 1°dONLNdÊd“o>)Zset for high throughput°dONLNd˛vxÅç(ùñbit 2°dONLNdv“Å6)Zset for high reliability°dONLNdãxñƒ(≤ñEFor example, a value of 0x02 means high throughput. The default value°dONLNdcôx§ã*is 0.°dONLNdiµx¿ *$Precedence has the following values:°dONLNdé«x“~*0°dONLNdê«•“Δ)-routine°dONLNdòŸx‰~(ñ1°dONLNdöŸ•‰»)-priority°dONLNd£Îxˆ~(ñ2°dONLNd•Εˆ’)-    immediate°dONLNdØ˝x~($ñ3°dONLNd±˝•ª)-flash°dONLNd∑x~(6ñ4°dONLNdπ•Â)-flash-override°dONLNd»!x,~(Hñ5°dONLNd !•,fl)-
  8175. CRITIC/ECP°dONLNd’3x>~(Zñ6°dONLNd◊3•>)-internetwork control°dONLNdÏExP~(lñ7°dONLNdÓE•PÓ)-network control°dONLNd˛Zxe&(Åñ&The default value for precedence is 0.,N Helvetica Narrow
  8176. (Ÿ<42
  8177. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ
  8178. Z◊#ˇ ˇˇˇˇ#◊ 
  8179. d,Times
  8180. .°dONLNd!Æ,+ÃHKIf the Don’t Fragment flag is nonzero, all segments sent on this connection°dONLNdL/Æ:*Hare prohibited from being fragmented by the local IP or any intermediate°dONLNdï=ÆH*KIP. If a segment cannot be delivered without fragmentation, it’s discarded.°dONLNd·RÆ]Ê*AThe Time to Live indicates the maximum time that segments on this°dONLNd#`ÆkÎ*Fconnection are allowed to remain in the internet system. This value is°dONLNdjnÆy„*Ddecreased by every IP module that processes the segment; thus, it is°dONLNdØ|Æá*Geffectively a maximum hop count (the number of times a segment can pass°dONLNd˜äÆïˇ*Ethrough a module). The minimum value is 2; 0 means TCP should use its°dONLNd=òÆ£\*(default value (the default value is 60).°dONLNdf≠Æ∏‰*FIf the Security flag is nonzero, TCP inserts its configured default IP°dONLNd≠ªÆΔ
  8181. *Osecurity option into all segments sent on this connection. In addition, for all°dONLNd˝…Æ‘Í*Garriving segments that contain a security option, TCP verifies that the°dONLNdE◊Æ‚Ì*Hsecurity matches the configured default security. Note that this flag is°dONLNdéÂÆÊ*Grelevant only if no security option is present in the user-specified IP°dONLNd÷ÛÆ˛”*options.°dONLNdflƇ*DFinally, you can specify additional IP options to be sent with every°dONLNd$Æ!˙*Fsegment. The option count is the number of long words in the IP option°dONLNdk$Æ/Ï*Ffield. Pad bytes of 0 should be appended to the IP options so that the°dONLNd≤2Æ=*Foptions are an integral number of long words. The maximum value of the°dONLNd˘@ÆK¸*Koption count field is 10 unless the Security flag is also nonzero, in which°dONLNdENÆY5*case the maximum value is 9.°dONLNdbcÆn    *KTCP does not perform any verification on the user-specified IP options, but°dONLNdÆqÆ|„*Csimply inserts them into the IP header of every segment sent on the°dONLNdÚÆä*Nconnection. If you specify an invalid list of IP options, the result cannot be°dONLNdAçÆò˛*Epredicted. See Request for Comment (RFC) 894 for the proper format of°dONLNdáõƶ‡* IP options.°dONLNdì∞Tªç(◊r Result codes°dONLNd†∞ƪ…)ZnoErr°dONLNd¶∞5ª[)áno error°dONLNdجÆÕ˙(ÈÃinvalidStreamPtr°dONLNd¿¬5Õ›)á$the specified TCP stream is not open°dONLNd‘Æfl¸(˚ÃconnectionExists°dONLNdˆ‘5fl‹)á#this TCP stream already has an open°dONLNd‚5Ìh*
  8182. connection°dONLNd%ÙÆˇ˜(ÃduplicateSocket°dONLNd5Ù5ˇ)á.a connection already exists between this local°dONLNdd5
  8183. ¯**IP address and TCP port, and the specified°dONLNdè5»*remote IP address and TCP port°dONLNdÆ"Æ-(IÃcommandTimeout°dONLNdΩ"5-ı)á)no connection attempt was received in the°dONLNdÁ05;©*specified time-out period°dONLNdBÆM·(iÃ
  8184. openFailed°dONLNd B5Mı)á'the connection came halfway up and then°dONLNd4P5[O*failed,N Helvetica Narrow+Öb TCP routines
  8185. )D43 ÃpÃ)ˇà◊#ˇ ˇˇˇˇ#◊ 
  8186. d,N Helvetica Narrow
  8187. .°dONLNd-t+<I
  8188. TCPActiveOpen,Times
  8189. °dONLNd8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd 8•C±)-26°dONLNd#8“CÈ)-word°dONLNd(8ˇCw)-csCode = TCPActiveOpen°dONLNd?IxUÉ(qñưdONLNdAJ•U±)-28°dONLNdDJ“UÁ)-long°dONLNdIJˇUA)-stream pointer°dONLNdX[xgÉ(ÉñưdONLNdZ\•g±)-32°dONLNd]\“gÊ)-byte°dONLNdb\ˇg”)--ULP timeout value in seconds; 0 = use default°dONLNdêmxyÉ(ïñưdONLNdín•y±)-33°dONLNdïn“yÊ)-byte°dONLNdönˇyê)-ULP timeout action; 0 = report,°dONLNdª|ˇáJ*nonzero = abort°dONLNdÀçxôÉ(µñưdONLNdÕé•ô±)-34°dONLNd–é“ôÊ)-byte°dONLNd’éˇô4)-
  8190. validity bits°dONLNd„üx´É(«ñưdONLNd†•´±)-36°dONLNdˆ“´Á)-long°dONLNd̆ˇ´ç)-remote IP address; cannot be 0°dONLNd ±xΩÉ(ŸñưdONLNd≤•Ω±)-40°dONLNd≤“ΩÈ)-word°dONLNd≤ˇΩà)-remote TCP port; cannot be 0°dONLNd3√xœÉ(Îñ¨°dONLNd5ƒ•œ±)-42°dONLNd8ƒ“œÁ)-long°dONLNd=ƒˇœG)-local IP address°dONLNdN’x·É(˝ñ´°dONLNdP÷•·±)-46°dONLNdS÷“·È)-word°dONLNdX÷ˇ·Δ)-+local TCP port; if 0, TCP assigns an unused°dONLNdщˇÔ*port°dONLNdâıxÉ(ñưdONLNd㈕±)-48°dONLNd鈓Ê)-byte°dONLNdìˆˇB)-type of service°dONLNd£xÉ(/ñưdONLNd••±)-49°dONLNd®“Ê)-byte°dONLNd≠ˇ3)-
  8191. precedence°dONLNd∏x%É(AñưdONLNd∫•%±)-50°dONLNdΩ“%Ê)-byte°dONLNd¬ˇ%[)-don’t fragment flag°dONLNd÷+x7É(SñưdONLNdÿ,•7±)-51°dONLNd€,“7Ê)-byte°dONLNd‡,ˇ72)- time to live°dONLNdÌ=xIÉ(eñưdONLNdÔ>•I±)-52°dONLNdÚ>“IÊ)-byte°dONLNd˜>ˇI8)-
  8192. security flag°dONLNdOx[É(wñưdONLNdP•[±)-53°dONLNd
  8193. P“[Ê)-byte°dONLNdPˇ[G)-IP option count°dONLNdaxmÉ(âñưdONLNd!b•m±)-54°dONLNd$b“m˙)-byte[40]°dONLNd-bˇm.)-
  8194. IP options°dONLNd8sxÉ(õñưdONLNd:t•±)-94°dONLNd=t“Á)-long°dONLNdBtˇL)-user data pointer°dONLNdTâxîÕ(∞ñETCPActiveOpen initiates an outgoing call to a remote TCP. The command°dONLNdöóx¢æ*Fis completed when a connection is established or when an error occurs.°dONLNd‚¨x∑≈*CTCPActiveOpen accepts the same parameters as TCPPassiveOpen, except°dONLNd&∫x≈–*Jthat the remote IP address and remote TCP port must be specified. Further,°dONLNdq»x” *Gno command timeout is provided; if the connection cannot be established°dONLNdπ÷x·Æ*Awithin the ULP timeout period, the command is completed in error.°dONLNd˚Îxˆá*9See TCPPassiveOpen for a description of other parameters.°dONLNd5 W('< Result codes°dONLNdBx ì)ZnoErr°dONLNdHˇ %)áno error°dONLNdQxƒ(9ñinvalidStreamPtr°dONLNdbˇß)á$the specified TCP stream is not open°dONLNdá$x/Δ(KñconnectionExists°dONLNdò$ˇ/¶)á#this TCP stream already has an open°dONLNdº2ˇ=2*
  8195. connection°dONLNd«DxO¡(kñduplicateSocket°dONLNd◊DˇOœ)á.a connection already exists between this local°dONLNdRˇ]¬**IP address and TCP port, and the specified°dONLNd1`ˇkí*remote IP address and TCP port°dONLNdPrx}´(ôñ
  8196. openFailed°dONLNd[rˇ}ø)á'the connection came halfway up and then°dONLNdÉġã*failed
  8197. (Ÿ<44
  8198. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇå◊#ˇ ˇˇˇˇ#◊ 
  8199. d,N Helvetica Narrow
  8200. .°dONLNdT-Ü+rITCPSend,Times
  8201. °dONLNd8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd8€CÁ)-26°dONLNd8C)-word°dONLNd"85Cé)-csCode = TCPSend°dONLNd3IÆUπ(qÃÆ°dONLNd5J€UÁ)-28°dONLNd8JU)-long°dONLNd=J5Uw)-stream pointer°dONLNdL[Ægπ(ÉÃÆ°dONLNdN\€gÁ)-32°dONLNdQ\g)-byte°dONLNdV\5gæ)-ULP timeout value in seconds°dONLNdsmÆyπ(ïÃÆ°dONLNdun€yÁ)-33°dONLNdxny)-byte°dONLNd}n5y‚)-$ULP timeout action; nonzero = abort,°dONLNd£|5ád*
  8202. 0 = report°dONLNdÆçÆôπ(µÃưdONLNd∞é€ôÁ)-34°dONLNd≥éô)-byte°dONLNd∏é5ôj)-
  8203. validity bits°dONLNdΔüÆ´π(«ÃưdONLNd»†€´Á)-35°dONLNdÀ†´)-byte°dONLNd–†5´`)-    push flag°dONLNd⁄±ÆΩπ(ŸÃưdONLNd‹≤€ΩÁ)-36°dONLNdfl≤Ω)-byte°dONLNd‰≤5Ωh)- urgent flag°dONLNd√Æœπ(ÎÃÆ°dONLNdÚƒ€œÁ)-38°dONLNdıƒœ)-long°dONLNd˙ƒ5œp)- WDS pointer°dONLNd’Æ·π(˝ÃưdONLNd÷€·Á)-42°dONLNd ÷·)-long°dONLNd÷5·[)-reserved°dONLNdÁÆÛπ(ÃÆ°dONLNdË€ÛÁ)-46°dONLNdËÛ)-word°dONLNd#Ë5Û[)-reserved°dONLNd,˘Æπ(!ÃÆ°dONLNd.˙€Á)-48°dONLNd1˙)-long°dONLNd6˙5Ç)-user data pointer°dONLNdHÆ˘(6ÃDTCPSend sends the specified data over the connection. The command is°dONLNdçÆ(*Gcompleted when all data has been sent and acknowledged or when an error°dONLNd’+Æ6œ*occurs.°dONLNd›@ÆK    *JIf all data cannot be sent and acknowledged within the ULP timeout period,°dONLNd(NÆY˛*Kthen the ULP action is taken. If the ULP action is abort, the connection is°dONLNdt\Æg*Jbroken, all pending commands are returned, and a terminate notification is°dONLNdøjÆuÔ*Hgiven. If the ULP action is report, a ULP timeout notification is given.°dONLNdÆä˝*FSeveral fields in the TCPPassiveOpen command are optional. To indicate°dONLNdOçÆò*Owhether the user is including these optional parameters, a set of validity bits°dONLNdüõƶ*is defined as follows:°dONLNd∂≠Æ∏√*bit 6°dONLNdº≠∏∂)Z%ULP timeout action parameter is valid°dONLNd‚øÆ √(ÊÃbit 7°dONLNdËø ≤)Z$ULP timeout value parameter is valid°dONLNd
  8204. ‘Æfl    (˚ÃKIf the Push flag is nonzero, TCP sends the data immediately without waiting°dONLNdY‚ÆÌ*Hto see if more TCPSend commands are issued. If the Urgent flag is 2, TCP°dONLNd¢Æ˚¸*Esends the data using the noncompliant method described by RFC 793. If°dONLNdË˛Æ    ˙*Hthe Urgent flag is any other nonzero value, TCP sends the data using the°dONLNd1 ÆÒ*@method described by RFC 1122. For more information about the TCP°dONLNdrÆ%Ó*Durgent mechanism, refer to the section “Urgent Mode” earlier in this°dONLNd∑(Æ3”*chapter.°dONLNd¿=ÆH    *LThe WDS can be arbitrarily complex; that is, there is no limit to the number°dONLNd
  8205. KÆVÒ*Dof buffers that can be sent in a TCPSend command. However, the total°dONLNdRYÆd
  8206. *Gnumber of data bytes described by the WDS must be between 1 and 65,535,°dONLNdögÆr*Einclusive. You must not modify or relocate the WDS and the buffers it°dONLNd‡uÆÄ¡*7describes until the TCPSend command has been completed.(Ÿÿ TCP routines
  8207. )D45 ÃpÃ)ˇÃ◊#ˇ ˇˇˇˇ#◊ 
  8208. d,Times
  8209. .°dONLNd!,W+<H Result codes°dONLNd
  8210. !x,ì)ZnoErr°dONLNd!ˇ,%)áno error°dONLNd3x>ƒ(ZñinvalidStreamPtr°dONLNd-3ˇ>ß)á$the specified TCP stream is not open°dONLNdRExP∏(lñ
  8211. invalidLength°dONLNd`EˇPº)á)the total amount of data described by the°dONLNdäSˇ^‘*-WDS was either 0 or greater than 65,535 bytes°dONLNd∏expÆ(åñ
  8212. invalidWDS°dONLNd√eˇpg)áthe WDS pointer was 0°dONLNdŸwxÇ‚(ûñconnectionDoesntExist°dONLNdÔwˇÇ∏)á'there is no open connection on this TCP°dONLNdÖˇê*stream°dONLNdóx¢Œ(æñconnectionClosing°dONLNd0óˇ¢À)á)a TCPClose command was already issued, so°dONLNdZ•ˇ∞¶*%there is no more data to send on this°dONLNdÄ≥ˇæ2*
  8213. connection°dONLNdã≈x–‡(ÏñconnectionTerminated°dONLNd†≈ˇ––)á-the connection was broken; the reason will be°dONLNdŒ”ˇfir*given in a terminate ASR,N Helvetica Narrow
  8214. (Ÿ<46
  8215. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇT◊#ˇ ˇˇˇˇ#◊ 
  8216. d,N Helvetica Narrow
  8217. .°dONLNdT-™+rI TCPNoCopyRcv,Times
  8218. °dONLNd
  8219. 8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd8€CÁ)-26°dONLNd"8C)-word°dONLNd'85CØ)-csCode = TCPNoCopyRcv°dONLNd=IÆUπ(qÃÆ°dONLNd?J€UÁ)-28°dONLNdBJU)-long°dONLNdGJ5Uw)-stream pointer°dONLNdV[Ægπ(ÉÃÆ°dONLNdX\€gÁ)-32°dONLNd[\g)-byte°dONLNd`\5gº)-command timeout in seconds°dONLNd{mÆyπ(ïè°dONLNd}n€yÁ)-34°dONLNdÄny)-byte°dONLNdÖn5yb)-    mark flag°dONLNdèÆãπ(ßè°dONLNdëÄ€ãÁ)-35°dONLNdîÄã)-byte°dONLNdôÄ5ãh)- urgent flag°dONLNd•ëÆùπ(πÃÆ°dONLNdßí€ùÁ)-42°dONLNd™íù)-long°dONLNdØí5ùÊ)-#RDS pointer; RDS is modified by TCP°dONLNd”£ÆØπ(ÀÃÆ°dONLNd’§€ØÁ)-46°dONLNdÿ§Ø)-word°dONLNd›§5Ø‹)-"number of entries in RDS excluding°dONLNd≤5Ω€*"terminating 0; not modified by TCP°dONLNd#√Æœπ(ÎÃÆ°dONLNd%ƒ€œÁ)-48°dONLNd(ƒœ)-word°dONLNd-ƒ5œ[)-reserved°dONLNd6’Æ·π(˝ÃưdONLNd8÷€·Á)-50°dONLNd;÷·)-long°dONLNd@÷5·Ç)-user data pointer°dONLNdRÎÆˆ    (ÃHTCPNoCopyRcv retrieves data that has been received on a connection. Data°dONLNdõ˘Æ
  8220. *Mis not copied out of the internal buffers of TCP; rather, an RDS is formatted°dONLNdÈÆÚ*Fto allow the user access to the TCP data in place. This command offers°dONLNd0Æ ◊*:significant performance improvements over TCPRcv commands.°dONLNdk1Æ<I*The command is completed when, p    AppleIconp
  8221. °dONLNdâEÆM≥*n
  8222. °dONLNdãCªN)
  8223. pushed data arrivesp
  8224. °dONLNdüWÆ_≥(|Ãn
  8225. °dONLNd°Uª`2)
  8226. urgent data is outstandingp
  8227. °dONLNdºiÆq≥(éÃn
  8228. °dONLNdægªr)
  8229. Ga reasonable period passes after the arrival of nonpush, nonurgent datap
  8230. °dONLNd{ÆÉ≥(†Ãn
  8231. °dONLNdyªÑÍ)
  8232. Dthe RDS is full; that is, the received data is in more noncontiguous°dONLNdMáªíX* chunks than the RDS can describep
  8233. °dONLNdnõÆ£≥(¿Ãn
  8234. °dONLNdpôª§)
  8235. Ithe amount of data received is greater than or equal to 25 percent of the°dONLNd∫ߪ≤f*'total receive buffering for this streamp
  8236. °dONLNd‚ªÆ√≥(‡Ãn
  8237. °dONLNd‰πªƒD)
  8238. the command timeout expires°dONLNdŒÆŸ˘(ıÃDYou must allocate memory for the RDS, which can contain an unlimited°dONLNdE‹ÆÁ*Gnumber of elements. The specified number of entries in the RDS does not°dONLNdçÍÆı*Iinclude the terminating 0. For example, the simplest possible RDS has one°dONLNd◊¯Æ˝*Lelement and is 8 bytes in length: a word length field, a long pointer field,°dONLNd$Æj*)and a terminating word length field of 0.°dONLNdNÆ&*FTCP formats the RDS to point to the received TCP data. The RDS may not°dONLNdï)Æ4
  8239. *Kbe completely filled by TCP. For example, if you pass an RDS three entries,°dONLNd·7ÆB    *ATCP may complete the TCPNoCopyRcv command with the RDS describing°dONLNd#EÆPı*Bonly one buffer. TCP does not modify the field in the TCPNoCopyRcv°dONLNdfSÆ^    *Lcommand that indicates the number of entries in the RDS; rather, it places a°dONLNd≥aÆlK*#terminating zero in the RDS itself.(Ÿÿ TCP routines
  8240. )D47 ÃpÃ)ˇ
  8241.  ◊#ˇ ˇˇˇˇ#◊ 
  8242. d,Times
  8243. .°dONLNd!x,«+ñHEThe command timeout period starts when the receive command is issued,°dONLNdF/x:œ*Onot when the first byte of data arrives. If no data arrives within this timeout°dONLNdñ=xHÀ*Dperiod, the TCPNoCopyRcv command is completed in error. If some data°dONLNd€KxV≥*>has arrived when the command timeout expires, the TCPNoCopyRcv°dONLNdYxd *Icommand is completed successfully, returning the data that has arrived so°dONLNddgxr«*Ifar. A command timeout of 0 indicates an infinite timeout period. In this°dONLNdÆuxÄ»*Ccase, the TCPNoCopyRcv command is not completed until some data has°dONLNdÚÉxéõ*arrived.°dONLNd˚òx£Ω*GIf the Urgent flag is nonzero, the data returned by this command is the°dONLNdC¶x±¢*Abeginning of the outstanding urgent data. This flag is one of two°dONLNdÖ¥xøº*Bmechanisms that puts you in urgent mode. The other mechanism is by°dONLNd»¬xÕ∏*Dmeans of an urgent ASR notification, which is used when there are no°dONLNd
  8244. –x€j*,outstanding TCPNoCopyRcv or TCPRcv commands.°dONLNd:Âxƒ*GIf the Mark flag is nonzero, the data returned by this command ends the°dONLNdÇÛx˛¨*Aurgent data. Since TCP does not deliver urgent and nonurgent data°dONLNdƒx µ*Htogether, the last byte of data described by the RDS is the last byte of°dONLNd
  8245. xƒ*Furgent data. The Mark flag is the only mechanism for taking you out of°dONLNdTx(∂* urgent mode.°dONLNda2x=Ø*@The Urgent flag is set only on the first TCPNoCopy Rcv or TCPRcv°dONLNd¢@xKÀ*Hcommand that contains urgent data. The Mark flag will be set only on the°dONLNdÎNxYΔ*Blast TCPNoCopyRcv or TCPRcv command that contains urgent data. For°dONLNd.\xg≈*Aexample, if three TCPNoCopyRcv or TCPRcv commands are required to°dONLNdpjxuÀ*Mdeliver all urgent data, the settings of the Urgent and Mark flags will be as°dONLNdæxxÉú*follows:°dONLNd»êHõ~+– Urgent flag°dONLNd‘êëõ¡)I    Mark flag°dONLNdfi•x∞3(Ãñ!First TCPNoCopyRcv/TCPRcv command°dONLNd•c∞i)Î1°dONLNd•©∞Ø)F0°dONLNd∫x≈A(·ñ"Second TCPNoCopyRcv/TCPRcv command°dONLNd'∫c≈i)Î0°dONLNd)∫©≈Ø)F0°dONLNd+œx⁄9(ˆñ!Third TCPNoCopyRcv/TCPRcv command°dONLNdMœc⁄i)Î0°dONLNdOœ©⁄Ø)F1°dONLNdQÎxˆè(ñ=Both the Urgent flag and the Mark flag can be set in a single°dONLNdè˘x”*DTCPNoCopyRcv or TCPRcv command if all outstanding urgent data can be°dONLNd‘x*delivered in a single command.°dONLNdÛx'Œ*EYou are responsible for calling TCPBfrReturn after every TCPNoCopyRcv°dONLNd9*x5∫*Fcommand that is completed successfully, in order to return the receive°dONLNdÄ8xC…*Dbuffers owned by the TCP driver. The RDS must be returned unmodified°dONLNd≈FxQ”*Mso that the TCP driver can correctly recover the appropriate receive buffers.,N Helvetica Narrow
  8246. (Ÿ<48
  8247. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ .◊#ˇ ˇˇˇˇ#◊ 
  8248. d,Times
  8249. .°dONLNd!T,ç+rH Result codes°dONLNd
  8250. !Æ,…)ZnoErr°dONLNd!5,[)áno error°dONLNd3Æ>˙(ZÃinvalidStreamPtr°dONLNd-35>›)á$the specified TCP stream is not open°dONLNdREÆP(lÃconnectionDoesntExist°dONLNdhE5PÓ)á&this TCP stream has no open connection°dONLNdèWÆbÓ(~Ã
  8251. invalidLength°dONLNdùW5bó)áthe RDS has 0 entries°dONLNd≥iÆtÎ(êÃ
  8252. invalidBufPtr°dONLNd¡i5tõ)áthe RDS pointer was 0°dONLNd◊{ÆÜ(¢ÃcommandTimeout°dONLNdÊ{5ܸ)á,no data arrived within the specified timeout°dONLNdâ5îS*period°dONLNdõƶ(¬ÃconnectionClosing°dONLNd,õ5¶˛)á,all data on this connection has already been°dONLNdY©5¥_*    delivered°dONLNdcªÆΔ(‚ÃconnectionTerminated°dONLNdxª5Δ)á-the connection was broken; the reason will be°dONLNd¶…5‘®*given in a terminate ASR,N Helvetica Narrow
  8253. °dONLNdøÔT˝ü(r TCPBfrReturn
  8254. °dONLNdÃT†*Parameter block,    Symbol°dONLNd‹Æπ)ZưdONLNdfi€Á)-26°dONLNd·)-word°dONLNdÊ5∂)-csCode = TCPRcvBfrReturn°dONLNdˇÆ%π(AÃÆ°dONLNd€%Á)-28°dONLNd%)-long°dONLNd    5%w)-stream pointer°dONLNd+Æ7π(SÃÆ°dONLNd,€7Á)-42°dONLNd,7)-long°dONLNd",57n)- RDS pointer°dONLNd.=ÆIπ(eÃÆ°dONLNd0>€IÁ)-50°dONLNd3>I)-long°dONLNd8>5IÇ)-user data pointer°dONLNdJSÆ^Ï(zÃFTCPBfrReturn returns to the TCP driver a set of receive buffers that a°dONLNdëaÆl¸*Bsuccessfully completed TCPNoCopyRcv command passed directly to the°dONLNd‘oÆzÚ*Euser. The RDS must be identical to the RDS given to the user when the°dONLNd}Æà*CTCPNoCopyRcv command is completed. TCPBfrReturn returns an error if°dONLNd^ãÆñ¶*6you attempt to return a set of buffers more than once.°dONLNdï†T´ç(«r Result codes°dONLNd¢†Æ´…)ZnoErr°dONLNd®†5´[)áno error°dONLNd±≤ÆΩ˙(ŸÃinvalidStreamPtr°dONLNd¬≤5Ω›)á$the specified TCP stream is not open°dONLNdÁƒÆœ(ÎÃconnectionDoesntExist°dONLNd˝ƒ5œÓ)á&this TCP stream has no open connection°dONLNd$÷Æ·Î(˝Ã
  8255. invalidBufPtr°dONLNd2÷5·õ)áthe RDS pointer was 0°dONLNdHËÆÛ‚(Ã
  8256. invalidRDS°dONLNdSË5Û˛)á+the RDS refers to receive buffers not owned°dONLNdˆ5h* by the user+Öº TCP routines
  8257. )D49 ÃpÃ)ˇÍ◊#ˇ ˇˇˇˇ#◊ 
  8258. d,N Helvetica Narrow
  8259. .°dONLNd-J+<ITCPRcv,Times
  8260. °dONLNd8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd!8ˇCR)-csCode = TCPRcv°dONLNd1IxUÉ(qñưdONLNd3J•U±)-28°dONLNd6J“UÁ)-long°dONLNd;JˇUA)-stream pointer°dONLNdJ[xgÉ(ÉñưdONLNdL\•g±)-32°dONLNdO\“gÊ)-byte°dONLNdT\ˇgÜ)-command timeout in seconds°dONLNdomxyÉ(ïñ¨°dONLNdqn•y±)-34°dONLNdtn“yÊ)-byte°dONLNdynˇy,)-    mark flag°dONLNdÉxãÉ(ßñ¨°dONLNdÖÄ•ã±)-35°dONLNdàÄ“ãÊ)-byte°dONLNdçġã2)- urgent flag°dONLNdôëxùÉ(πñưdONLNdõí•ù±)-36°dONLNdûí“ùÁ)-long°dONLNd£íˇùc)-receive buffer pointer°dONLNd∫£xØÉ(Àñ´°dONLNdº§•ر)-40°dONLNdø§“ØÈ)-word°dONLNdƒ§ˇØ_)-receive buffer length°dONLNd⁄µx¡É(›ñưdONLNd‹∂•¡±)-48°dONLNdfl∂“¡È)-word°dONLNd‰∂ˇ¡%)-reserved°dONLNdÌ«x”É(ÔñưdONLNdÔ»•”±)-50°dONLNdÚ»“”Á)-long°dONLNd˜»ˇ”L)-user data pointer°dONLNd    ›xË∂(ñETCPRcv retrieves data that has been received on a connection. Data is°dONLNdOÎxˆ•*Bcopied out of the TCP internal buffers into the user’s buffer. The°dONLNdí˘x˛*command is completed when, p    AppleIconp
  8261. °dONLNd¨
  8262. x}*n
  8263. °dONLNdÆ Öc)
  8264. 2enough data has arrived to fill the receive bufferp
  8265. °dONLNd·x'}(Dñn
  8266. °dONLNd„Ö(›)
  8267. pushed data arrivesp
  8268. °dONLNd˜1x9}(Vñn
  8269. °dONLNd˘/Ö:¸)
  8270. urgent data is outstandingp
  8271. °dONLNdCxK}(hñn
  8272. °dONLNdAÖLø)
  8273. Da reasonable period passes after the arrival of nonpushed, nonurgent°dONLNd[OÖZò*datap
  8274. °dONLNd`cxk}(àñn
  8275. °dONLNdbaÖl–)
  8276. Ithe amount of data received is greater than or equal to 25 percent of the°dONLNd¨oÖz0*'total receive buffering for this streamp
  8277. °dONLNd‘Éxã}(®ñn
  8278. °dONLNd÷ÅÖå)
  8279. the command timeout expires°dONLNdÚñx°«(ΩñEThe command timeout period starts when the receive command is issued,°dONLNd8§xØ©*Gnot when the first byte of data arrives. If no data arrives within this°dONLNdÄ≤xΩ *Dcommand timeout period, the TCPRcv command is completed in error. If°dONLNd≈¿xÀΩ*Bsome data has arrived when the command timeout expires, the TCPRcv°dONLNdŒxŸ∏*?command is completed successfully. A command timeout of 0 means°dONLNdH‹xÁ«*Finfinite; the TCPRcv command will not be completed until some data has°dONLNdèÍxıõ*arrived.°dONLNdòˇx
  8280. Ω*GIf the Urgent flag is nonzero, the data returned by this command is the°dONLNd‡
  8281. x¢*Abeginning of the outstanding urgent data. This flag is one of two°dONLNd"x&º*Bmechanisms that puts you in urgent mode. The other mechanism is by°dONLNde)x4∏*Dmeans of an urgent ASR notification, which is used when there are no°dONLNd™7xBj*,outstanding TCPNoCopyRcv or TCPRcv commands.°dONLNd◊LxWƒ*GIf the Mark flag is nonzero, the data returned by this command ends the°dONLNdZxe¨*Aurgent data. Since TCP does not deliver urgent and nonurgent data°dONLNdahxsœ*Ptogether, the last byte of data in the receive buffer is the last byte of urgent°dONLNd≤vxŃ*Fdata. The Mark flag is the only mechanism for taking you out of urgent°dONLNd˘Ñxèï*mode.
  8282. (Ÿ<50
  8283. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ
  8284. b◊#ˇ ˇˇˇˇ#◊ 
  8285. d,Times
  8286. .°dONLNd!Æ,‚+ÃH?The Urgent flag is set only on the first TCPNoCopyRcv or TCPRcv°dONLNd@/Æ:¸*Hcommand that contains urgent data. The Mark flag is set only on the last°dONLNdâ=ÆHÍ*=TCPNoCopyRcv or TCPRcv command that contains urgent data. For°dONLNd«KÆV˚*Aexample, if three TCPNoCopyRcv or TCPRcv commands are required to°dONLNd    YÆd*Mdeliver all urgent data, the settings of the Urgent and Mark flags will be as°dONLNdWgÆr“*follows:°dONLNda~ä¥+– Urgent flag°dONLNdm«ä˜)I    Mark flag°dONLNdwîÆüi(ªÃ!First TCPNoCopyRcv/TCPRcv command°dONLNdôîôüü)Î1°dONLNdõîflüÂ)F0°dONLNdù©Æ¥w(–Ã"Second TCPNoCopyRcv/TCPRcv command°dONLNd¿©ô¥ü)Î0°dONLNd¬©fl¥Â)F0°dONLNdƒæÆ…o(ÂÃ!Third TCPNoCopyRcv/TCPRcv command°dONLNdÊæô…ü)Î0°dONLNdËæfl…Â)F1°dONLNdÍ⁄ÆÂ≈(Ã=Both the Urgent flag and the Mark flag can be set in a single°dONLNd(ËÆÛ    *DTCPNoCopyRcv or TCPRcv command if all outstanding urgent data can be°dONLNdmˆÆ>*delivered in a single command.°dONLNdå Æ*JThe amount of data actually received is found in the receive buffer length°dONLNd◊Æ$Δ*field.°dONLNdfi.Æ9*IIf the TCPRcv command is completed in error, the receive buffer length is°dONLNd(<ÆGÄ*-not modified by TCP, but no data is returned.°dONLNdVQT\ç(xr Result codes°dONLNdcQÆ\…)ZnoErr°dONLNdiQ5\[)áno error°dONLNdrcÆn˙(äÃinvalidStreamPtr°dONLNdÉc5n›)á$the specified TCP stream is not open°dONLNd®uÆÄÓ(úÃ
  8287. invalidLength°dONLNd∂u5Ĭ)áthe receive buffer length was 0°dONLNd÷áÆíÎ(ÆÃ
  8288. invalidBufPtr°dONLNd‰á5íΔ)á the receive buffer pointer was 0°dONLNdôƧ(¿ÃcommandTimeout°dONLNdô5§¸)á,no data arrived within the specified timeout°dONLNdAß5≤S*period°dONLNdHπƃ(‡ÃconnectionDoesntExist°dONLNd^π5ƒÓ)á&this TCP stream has no open connection°dONLNdÖÀÆ÷(ÚÃconnectionClosing°dONLNdóÀ5÷˛)á,all data on this connection has already been°dONLNdƒŸ5‰_*    delivered°dONLNdŒÎƈ(ÃconnectionTerminated°dONLNd„Î5ˆ)á-the connection was broken; the reason will be°dONLNd˘5®*given in a terminate ASR,N Helvetica Narrow+Öπ TCP routines
  8289. )F51 ÃpÃ)ˇ
  8290. ®◊#ˇ ˇˇˇˇ#◊ 
  8291. d,N Helvetica Narrow
  8292. .°dONLNd-S+<ITCPClose,Times
  8293. °dONLNd    8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd#8ˇCZ)-csCode = TCPClose°dONLNd5IxUÉ(qñưdONLNd7J•U±)-28°dONLNd:J“UÁ)-long°dONLNd?JˇUA)-stream pointer°dONLNdN[xgÉ(ÉñưdONLNdP\•g±)-32°dONLNdS\“gÊ)-byte°dONLNdX\ˇgà)-ULP timeout value in seconds°dONLNdumxyÉ(ïñưdONLNdwn•y±)-33°dONLNdzn“yÊ)-byte°dONLNdnˇyê)-ULP timeout action; 0 = report,°dONLNd†|ˇáJ*nonzero = abort°dONLNd∞çxôÉ(µñưdONLNd≤é•ô±)-34°dONLNdµé“ôÊ)-byte°dONLNd∫éˇô4)-
  8294. validity bits°dONLNd»üx´É(«ñưdONLNd †•´±)-35°dONLNdÕ†“´Á)-long°dONLNd“†ˇ´L)-user data pointer°dONLNd‰µx¿—(‹ñJTCPClose signals that the user has no more data to send on the connection.°dONLNd/√xŒΔ*EIt does not mean that the connection should be broken. The remote TCP°dONLNdu—x‹–*Lmust also issue a close before the connection can be gracefully closed, so a°dONLNd¬flxÍ‘*Iconnection may remain an arbitrary amount of time after you have issued a°dONLNd Ìx¯Δ*GTCPClose. To break a connection without ensuring that all data has been°dONLNdT˚xπ*Asent and acknowledged, use the TCPAbort command. (See the section°dONLNdñ    xN*.“Connection Closing” earlier in this chapter.)°dONLNd≈x)¢*<The command is completed when the FIN flag has been sent and°dONLNd,x7Ω*Cacknowledged. If the FIN is not acknowledged within the ULP timeout°dONLNdF:xE∫*Hperiod, the ULP timeout action is taken. If the ULP action is abort, the°dONLNdèHxSŒ*Hconnection is broken, all pending commands are returned, and a terminate°dONLNdÿVxa“*Nnotification is given. If the ULP action is report, a ULP timeout notification°dONLNd'dxoû*    is given.°dONLNd1yxÑ«*FSeveral fields in the TCPPassiveOpen command are optional. To indicate°dONLNdxáxí“*Owhether the user is including these optional parameters, a set of validity bits°dONLNd»ïx†ÿ*is defined as follows:°dONLNdflßx≤ç*bit 6°dONLNdÂß“≤Ä)Z%ULP timeout action parameter is valid°dONLNd πxƒç(‡ñbit 7°dONLNdπ“ƒ|)Z$ULP timeout value parameter is valid°dONLNd6ŒŸW(ı< Result codes°dONLNdCŒxŸì)ZnoErr°dONLNdIŒˇŸ%)áno error°dONLNdR‡x΃(ñinvalidStreamPtr°dONLNdc‡ˇÎß)á$the specified TCP stream is not open°dONLNdàÚx˝‚(ñconnectionDoesntExist°dONLNdûÚˇ˝∏)á&this TCP stream has no open connection°dONLNd≈xŒ(+ñconnectionClosing°dONLNd◊ˇ»)á'one TCPClose command was already issued°dONLNdˇˇV*for this connection°dONLNd$x/‡(KñconnectionTerminated°dONLNd($ˇ/–)á-the connection was broken; the reason will be°dONLNdV2ˇ=r*given in a terminate ASR
  8295. (Ÿ<52
  8296. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ&◊#ˇ ˇˇˇˇ#◊ 
  8297. d,N Helvetica Narrow
  8298. .°dONLNdT-ä+rITCPAbort,Times
  8299. °dONLNd    8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd8€CÁ)-26°dONLNd8C)-word°dONLNd#85Cí)-csCode = TCPAbort°dONLNd5IÆUπ(qÃÆ°dONLNd7J€UÁ)-28°dONLNd:JU)-long°dONLNd?J5Uw)-stream pointer°dONLNdN[Ægπ(ÉÃÆ°dONLNdP\€gÁ)-32°dONLNdS\g)-long°dONLNdX\5gÇ)-user data pointer°dONLNdjqÆ|·(òÃATCPAbort terminates the connection without attempting to send all°dONLNd¨Æä*Joutstanding data or to deliver all received data. TCPAbort returns the TCP°dONLNd˜çÆòÂ*Istream to its initial state. You are also given a terminate notification.°dONLNdA¢T≠ç(…r Result codes°dONLNdN¢Æ≠…)ZnoErr°dONLNdT¢5≠[)áno error°dONLNd]¥Æø˙(€ÃinvalidStreamPtr°dONLNdn¥5ø›)á$the specified TCP stream is not open°dONLNdìΔÆ—(ÌÃconnectionDoesntExist°dONLNd©Δ5—Ó)á&this TCP stream has no open connection(Ÿÿ TCP routines
  8300. )E53 ÃpÃ)ˇ¥◊#ˇ ˇˇˇˇ#◊ 
  8301. d,N Helvetica Narrow
  8302. .°dONLNd-[+<I    TCPStatus,Times
  8303. °dONLNd
  8304. 8Cj*Parameter block,    Symbol°dONLNd7xCÉ)ZưdONLNd8•C±)-26°dONLNd8“CÈ)-word°dONLNd$8ˇC\)-csCode = TCPStatus°dONLNd7IxUÉ(qñưdONLNd9J•U±)-28°dONLNd<J“UÁ)-long°dONLNdAJˇUA)-stream pointer°dONLNdP[xgÉ(Éñ¨°dONLNdR\•g±)-32°dONLNdU\“gÊ)-byte°dONLNdZ\ˇgà)-ULP timeout value in seconds°dONLNdwmxyÉ(ïñ¨°dONLNdyn•y±)-33°dONLNd|n“yÊ)-byte°dONLNdÅnˇyê)-ULP timeout action; 0 = report,°dONLNd¢|ˇáJ*nonzero = abort°dONLNd≤çxôÉ(µñ¨°dONLNd¥é•ô±)-38°dONLNd∑é“ôÁ)-long°dONLNdºéˇôQ)-remote IP address°dONLNdŒüx´É(«ñ¨°dONLNd–†•´±)-42°dONLNd”†“´È)-word°dONLNdÿ†ˇ´L)-remote TCP port°dONLNd˱xΩÉ(Ÿñ¨°dONLNdÍ≤•Ω±)-44°dONLNdÌ≤“ΩÁ)-long°dONLNdÚ≤ˇΩG)-local IP address°dONLNd√xœÉ(Îñ¨°dONLNdƒ•œ±)-48°dONLNdƒ“œÈ)-word°dONLNd
  8305. ƒˇœB)-local TCP port°dONLNd’x·É(˝ñ¨°dONLNd÷•·±)-50°dONLNd!÷“·Ê)-byte°dONLNd&÷ˇ·B)-type of service°dONLNd6ÁxÛÉ(ñ¨°dONLNd8˕۱)-51°dONLNd;Ë“ÛÊ)-byte°dONLNd@ˡÛ3)-
  8306. precedence°dONLNdK˘xÉ(!ñ¨°dONLNdM˙•±)-52°dONLNdP˙“Ê)-byte°dONLNdU˙ˇ`)-TCP connection state°dONLNdj xÉ(3ñ¨°dONLNdl •±)-54°dONLNdo “È)-word°dONLNdt ˇ:)- send window°dONLNdÄx)É(Eñ¨°dONLNdÇ•)±)-56°dONLNdÖ“)È)-word°dONLNdäˇ)E)-receive window°dONLNdô/x;É(Wñ¨°dONLNdõ0•;±)-58°dONLNdû0“;È)-word°dONLNd£0ˇ;ñ)-amount of unacknowledged data°dONLNd¡AxMÉ(iñ¨°dONLNd√B•M±)-60°dONLNdΔB“MÈ)-word°dONLNdÀBˇMh)-amount of unread data°dONLNd·Sx_É({ñ¨°dONLNd„T•_±)-62°dONLNdÊT“_Á)-long°dONLNdÎTˇ_h)-security option pointer°dONLNdexqÉ(çñ¨°dONLNdf•q±)-66°dONLNdf“qÁ)-long°dONLNd
  8307. fˇqe)-send unacknowledged°dONLNd!wxÉÉ(üñ¨°dONLNd#x•ɱ)-70°dONLNd&x“ÉÁ)-long°dONLNd+xˇÉ+)-    send next°dONLNd5âxïÉ(±ñ¨°dONLNd7ä•ï±)-74°dONLNd:ä“ïÁ)-long°dONLNd?äˇïW)-congestion window°dONLNdQõxßÉ(√ñ¨°dONLNdSú•ß±)-78°dONLNdVú“ßÁ)-long°dONLNd[úˇß6)- receive next°dONLNdh≠xπÉ(’ñ¨°dONLNdjÆ•π±)-82°dONLNdmÆ“πÁ)-long°dONLNdrÆˇπæ)-(smoothed round-trip time in milliseconds°dONLNdõøxÀÉ(Áñ¨°dONLNdù¿•À±)-86°dONLNd†¿“ÀÁ)-long°dONLNd•¿ˇÀ†)-$last round-trip time in milliseconds°dONLNd —x›É(˘ñ¨°dONLNdÓ•›±)-90°dONLNdœ““›Á)-long°dONLNd‘“ˇ›µ)-%maximum segment size that can be sent°dONLNd˙„xÔÉ( ñ¨°dONLNd¸‰•Ô±)-94°dONLNdˇ‰“ÔÁ)-long°dONLNd‰ˇÔq)-pointer to statistics block°dONLNd ıxÉ(ñưdONLNd"ˆ•±)-98°dONLNd%ˆ“Á)-long°dONLNd*ˆˇL)-user data pointer°dONLNd< x¨(2ñ@TCPStatus allows you to extract information from TCP regarding a°dONLNd}x$›*particular connection.°dONLNdî.x9º*BSee the TCPPassiveOpen command for a description of the usual open°dONLNd◊<xGÒ*parameters (bytes 32–51).°dONLNdÒXxcb*2The TCP connection state has the following values:°dONLNd$jxu~*0°dONLNd&j•uƒ)-Closed°dONLNd-jˇu†)Z#no connection exists on this stream°dONLNdQ|xá~(£ñ2°dONLNdS|•á¡)-Listen°dONLNdZ|ˇá™)Z$listening for an incoming connection
  8308. (Ÿ<54
  8309. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇÜ◊#ˇ ˇˇˇˇ#◊ 
  8310. d,Times
  8311. .°dONLNd!Æ,¥+ÃH4°dONLNd!€,)- SYN received°dONLNd!5,Û)Z(incoming connection is being established°dONLNd83Æ>¥(ZÃ6°dONLNd:3€>)-SYN sent°dONLNdC35>Ò)Z(outgoing connection is being established°dONLNdlEÆP¥(lÃ8°dONLNdnE€P)- Established°dONLNdzE5PÅ)Zconnection is up°dONLNdãWÆb∫(~Ã10°dONLNdéW€b
  8312. )-
  8313. FIN Wait 1°dONLNdôW5bË)Z'connection is up; close has been issued°dONLNd¡iÆt∫(êÃ12°dONLNdƒi€t
  8314. )-
  8315. FIN Wait 2°dONLNdœi5t¸)Z*connection is up; close has been completed°dONLNd˙{ÆÜ∫(¢Ã14°dONLNd˝{€Ü )-
  8316. Close Wait°dONLNd{5ÜÚ)Z)connection is up; close has been received°dONLNd2çÆò∫(¥Ã16°dONLNd5ç€ò˛)-Closing°dONLNd=ç5òˇ)Z,connection is up; close has been issued and °dONLNdkõ5¶[*received°dONLNdt≠Æ∏∫(‘Ã18°dONLNdw≠€∏)-Last Ack°dONLNdÄ≠5∏ˇ)Z,connection is up; close has been issued and °dONLNdƪ5Δ[*received°dONLNd∑ÕÆÿ∫(ÙÃ20°dONLNd∫Õ€ÿ
  8317. )-    Time Wait°dONLNdƒÕ5ÿ≥)Zconnection is being broken°dONLNdfl‚ÆÌ(    ÃIThe send window is the amount of data the remote TCP is currently willing°dONLNd)Æ˚*Jto accept from the local TCP. The receive window is the amount of data the°dONLNdt˛Æ    »*=local TCP is currently willing to accept from the remote TCP.°dONLNd≤Æ%Ö*1The statistics block has the following structure:°dONLNd‰,Æ7¥*0°dONLNdÊ,€7)-long°dONLNdÎ,57“)Z number of data segments received°dONLNd >ÆI¥(eÃ4°dONLNd>€I)-long°dONLNd>5Iæ)Znumber of data segments sent°dONLNd0PÆ[¥(wÃ8°dONLNd2P€[)-long°dONLNd7P5[Ë)Z%number of data segments retransmitted°dONLNd]bÆm∫(âÃ12°dONLNd`b€m)-long°dONLNdeb5m¿)Znumber of data bytes received°dONLNdÉtÆ∫(õÃ16°dONLNdÜt€)-long°dONLNdãt5Ì)Z'number of duplicate data bytes received°dONLNd≥ÜÆë∫(≠Ã20°dONLNd∂Ü€ë)-long°dONLNdªÜ5ë    )Z,number of data bytes received beyond receive°dONLNdËî5üX*window°dONLNdԶƱ∫(ÕÃ24°dONLNdÚ¶€±)-long°dONLNd˜¶5±¨)Znumber of data bytes sent°dONLNd∏Æ√∫(flÃ28°dONLNd∏€√)-long°dONLNd∏5√÷)Z"number of data bytes retransmitted°dONLNd< Æ’∫(ÒÃ32°dONLNd? €’Ù)-struct°dONLNdF 5’Δ)Zsize histogram of sent segments°dONLNdfÊÆÒË(
  8318. ÃEThe histogram is a variable-length structure of the following format:°dONLNd¨¯Æ¥*0°dONLNdƯ€Ú)-word°dONLNd≥¯5†)Znumber of size buckets°dONLNd 
  8319. Æ¥(1Ã2°dONLNdÃ
  8320. €Ú)-word°dONLNd—
  8321. 5¥)Zvalue: smallest segment size°dONLNdÓÆ'¥(CÃ4°dONLNd€')-long°dONLNdı5'¯)Z'counter number: number of segments sent°dONLNd*55Ô**between this size and the next larger size°dONLNdH<ÆG¥(cÃ8°dONLNdJ<€GÚ)-word°dONLNdO<5G◊)Z#value: second smallest segment size°dONLNdsNÆY∫(uÃ10°dONLNdvN€Y)-long°dONLNd{N5Y¯)Z'counter number: number of segments sent°dONLNd£\5gÔ**between this size and the next larger size,N Helvetica Narrow+ÖV TCP routines
  8322. )E55 ÃpÃ)ˇ    ◊#ˇ ˇˇˇˇ#◊ 
  8323. d,Times
  8324. .°dONLNd!x,™+ñHEYou are free to update the statistics block. Only the counters in the°dONLNdF/x:«*Esegment-size histogram should be modified. The number of size buckets°dONLNdå=xHõ*=and the segment-size value for each bucket cannot be changed.°dONLNd R]W(y< Result codes°dONLNd◊Rx]ì)ZnoErr°dONLNd›Rˇ]%)áno error°dONLNdÊdxoƒ(ãñinvalidStreamPtr°dONLNd˜dˇoß)á$the specified TCP stream is not open°dONLNdvxÅ‚(ùñconnectionDoesntExist°dONLNd2vˇÅ∏)á&this TCP stream has no open connection,N Helvetica Narrow
  8325. °dONLNdYú™_(Δ<
  8326. TCPRelease
  8327. °dONLNddµ¿j*Parameter block,    Symbol°dONLNdt¥x¿É)ZưdONLNdvµ•¿±)-26°dONLNdyµ“¿È)-word°dONLNd~µˇ¿c)-csCode = TCPRelease°dONLNdíΔx“É(ÓñưdONLNdî«•“±)-28°dONLNdó«““Á)-long°dONLNdú«ˇ“A)-stream pointer°dONLNd´ÿx‰É(ñ¨°dONLNd≠Ÿ•‰±)-32°dONLNd∞Ÿ“‰Á)-long°dONLNdµŸˇ‰Ö)-pointer to receive buffer area°dONLNd‘ÍxˆÉ(ñ¨°dONLNd÷Εˆ±)-36°dONLNdŸÎ“ˆÁ)-long°dONLNdfiΡˆÇ)-length of receive buffer area°dONLNd¸¸xÉ($ñưdONLNd˛˝•±)-44°dONLNd˝“Á)-long°dONLNd˝ˇL)-user data pointer°dONLNdxº(9ñETCPRelease closes a TCP stream. If there is an open connection on the°dONLNd^ x+—*Gstream, the connection is first broken as though a TCPAbort command had°dONLNd¶.x9∞* been issued.°dONLNd≥CxNŒ*IThe receive buffer area passed to the MacTCP driver in the TCPCreate call°dONLNd˝Qx\”*Ois returned to the user. You are now free to reuse or release this buffer area.°dONLNdMfqW(ç< Result codes°dONLNdZfxqì)ZnoErr°dONLNd`fˇq%)áno error°dONLNdixxɃ(üñinvalidStreamPtr°dONLNdzxˇÉß)á$the specified TCP stream is not open
  8328. (Ÿ<56
  8329. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ◊#ˇ ˇˇˇˇ#◊ 
  8330. d,N Helvetica Narrow
  8331. .°dONLNdT-ü+rI
  8332. TCPGlobalInfo,Times
  8333. °dONLNd8TC†*Parameter block,    Symbol°dONLNd7ÆCπ)ZưdONLNd 8€CÁ)-26°dONLNd#8C)-word°dONLNd(85C™)-csCode = TCPGlobalInfo°dONLNd?IÆUπ(qè°dONLNdAJ€UÁ)-32°dONLNdDJU)-long°dONLNdIJ5UÆ)-pointer to TCP parameters°dONLNdc[Ægπ(Éè°dONLNde\€gÁ)-36°dONLNdh\g)-long°dONLNdm\5g°)-pointer to TCP statistics°dONLNdámÆyπ(ïè°dONLNdân€yÁ)-40°dONLNdåny)-long°dONLNdën5yî)-pointer to CDB table°dONLNd¶Æãπ(ßÃÆ°dONLNd®Ä€ãÁ)-44°dONLNd´Äã)-long°dONLNd∞Ä5ãÇ)-user data pointer°dONLNd¬úÆßö(√Ã.The TCPGlobalInfo command allows you access to, p    AppleIconp
  8334. °dONLNdÒ∞Æ∏≥*n
  8335. °dONLNdÛÆªπÇ)
  8336. +parameters that affect the operation of TCPp
  8337. °dONLNd¬Æ ≥(ÁÃn
  8338. °dONLNd!¿ªÀR)
  8339. "global statistics collected by TCP°dONLNdD‹ÆÁ›(Ã?You should not modify the TCP parameters. The structure has the°dONLNdÑÍÆıˇ*following format:°dONLNdñ¸Æ¥*0°dONLNdò¸€)-long°dONLNdù¸È)-2pointer to Pascal string describing retransmission°dONLNd–
  8340. [*timeout algorithm°dONLNd‚Æ'¥(CÃ4°dONLNd‰€')-long°dONLNdÈ'ÿ)-+minimum value of retransmission timeout (in°dONLNd*5E*
  8341. milliseconds)°dONLNd#<ÆG¥(cÃ8°dONLNd%<€G)-long°dONLNd*<G⁄)-+maximum value of retransmission timeout (in°dONLNdVJUE*
  8342. milliseconds)°dONLNdd\Æg∫(ÉÃ12°dONLNdg\€g)-long°dONLNdl\g‘)-)maximum segment size this TCP can receive°dONLNdñnÆy∫(ïÃ16°dONLNdôn€y)-long°dONLNdûny˝)-/maximum number of streams the MacTCP driver can°dONLNdŒ|á+*support°dONLNd÷éÆô∫(µÃ20°dONLNdŸé€ô)-long°dONLNdfiéô)-1maximum value of receive window the MacTCP driver°dONLNdúß2*    can offer°dONLNd±Æºı(ÿÃJThe TCP statistics are the sum of traffic information for all streams that°dONLNdeøÆ *Ihave been opened since system startup time. The counters will wrap around°dONLNdØÕÆÿ¸*Dto 0 when incremented past their maximum value. You can modify these°dONLNdÙ€ÆÊ÷* statistics.°dONLNd˜Æ°*6The TCP statistics structure has the following format:°dONLNd8    Æ¥*0°dONLNd:    €)-long°dONLNd?    –)-(number of outgoing connections attempted°dONLNdhÆ&¥(BÃ4°dONLNdj€&)-long°dONLNdo&≈)-%number of outgoing connections opened°dONLNdï-Æ8¥(TÃ8°dONLNdó-€8)-long°dONLNdú-8Õ)-'number of incoming connections accepted°dONLNdƒ?ÆJ∫(fÃ12°dONLNd«?€J)-long°dONLNdÃ?JŸ)-,number of connections that closed gracefully°dONLNd˘QÆ\∫(xÃ16°dONLNd¸Q€\)-long°dONLNdQ\≈)-'number of connections that were aborted°dONLNd)cÆn∫(äÃ20°dONLNd,c€n)-long°dONLNd1cnì)-number of data bytes received°dONLNdOuÆÄ∫(úÃ24°dONLNdRu€Ä)-long°dONLNdWuÄ)-number of data bytes sent°dONLNdqáÆí∫(ÆÃ28°dONLNdtá€í)-long°dONLNdyáí¿)-'number of duplicate data bytes received+≤+ TCP routines
  8343. )E57 ÃpÃ)ˇ4◊#ˇ ˇˇˇˇ#◊ 
  8344. d,Times
  8345. .°dONLNd!x,Ñ+ñH32°dONLNd!•,∫)-long°dONLNd!“,s)-"number of data bytes retransmitted°dONLNd+3x>Ñ(Zñ36°dONLNd.3•>∫)-long°dONLNd33“>ù)-+total number of segments received (includes°dONLNd_A“L(*acknowledgments)°dONLNdpSx^Ñ(zñ40°dONLNdsS•^∫)-long°dONLNdxS“^â)-'total number of segments sent (includes°dONLNd†a“l(*acknowledgments)°dONLNd±sx~Ñ(öñ44°dONLNd¥s•~∫)-long°dONLNdπs“~´)-.number of segments received that contained all°dONLNdËÅ“å*duplicate data°dONLNd˜ìxûÑ(∫ñ48°dONLNd˙ì•û∫)-long°dONLNdˇì“ûo)- number of segments retransmitted°dONLNd!®≥W(œ< Result codes°dONLNd.®x≥ì)ZnoErr°dONLNd4®“≥¯)Zno error,N Helvetica Narrow
  8346. (Ÿ<58
  8347. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ
  8348. x◊#ˇ ˇˇˇˇ#◊ 
  8349. d,N Helvetica Narrow
  8350. .°dONLNdT-Ï+rIC parameter-block definitions,Times
  8351. °dONLNd8ÆCÙ+ZEThe following C type definitions are used with parameter-block Device°dONLNddFÆQ*Manager calls to TCP:,
  8352. Courier
  8353. °dONLNdzWÆc*#define TCPCreate°dONLNdåWDcP)ñ30°dONLNdèeÆq2(çÃ#define TCPPassiveOpen°dONLNd¶eDqP)ñ31°dONLNd©sÆ,(õÃ#define TCPActiveOpen°dONLNdøsDP)ñ32°dONLNd¬ÅÆç(©Ã#define TCPSend°dONLNd“ÅDçP)ñ34°dONLNd’èÆõ&(∑Ã#define TCPNoCopyRcv°dONLNdÍèDõP)ñ35°dONLNdÌùÆ©8(≈Ã#define TCPRcvBfrReturn°dONLNdùD©P)ñ36°dONLNd´Æ∑(”Ã#define TCPRcv°dONLNd´D∑P)ñ37°dONLNdπÆ≈(·Ã#define TCPClose°dONLNd+πD≈P)ñ38°dONLNd.«Æ”(ÔÃ#define TCPAbort°dONLNd?«D”P)ñ39°dONLNdB’Æ·(˝Ã#define TCPStatus°dONLNdT’D·P)ñ40°dONLNdW„ÆÔ8( Ã#define TCPExtendedStat°dONLNdo„DÔP)ñ41°dONLNdrÒÆ˝(Ã#define TCPRelease°dONLNdÖÒD˝P)ñ42°dONLNdàˇÆ ,('Ã#define TCPGlobalInfo°dONLNdûˇD P)ñ43°dONLNd°ÆP(9Ãtypedef enum TCPEventCode {°dONLNdæÃ+&+TCPClosing = 1,°dONLNdœ-Ã9 *TCPULPTimeout,°dONLNdfl;ÃG*
  8354. TCPTerminate,°dONLNdÓIÃU&*TCPDataArrival,°dONLNdˇWÃc*
  8355. TCPUrgent,°dONLNd eÃq,*TCPICMPReceived,°dONLNdsÃ2*lastEvent = 32767°dONLNd/ÅÆç(©Ã} TCPEventCode;°dONLNd?ìÆüÄ*#typedef enum TCPTerminationReason {°dONLNdd°Ã≠>+TCPRemoteAbort = 2,°dONLNdyØÃª8*TCPNetworkFailure,°dONLNdçΩÃ…>*TCPSecPrecMismatch,°dONLNd¢ÀÃ◊V*TCPULPTimeoutTerminate,°dONLNdªŸÃÂ* TCPULPAbort,°dONLNd…ÁÃÛ* TCPULPClose,°dONLNd◊ıÃ,*TCPServiceError,°dONLNdÈÃ8*lastReason = 32767°dONLNd¸Æ8(9Ã} TCPTerminationReason;°dONLNd#Æ/í*&typedef pascal void (*TCPNotifyProc) (°dONLNd=1Ã=D+StreamPtr tcpStream,°dONLNdS?ÃKb*unsigned short eventCode,°dONLNdnMÃY,*Ptr userDataPtr,°dONLNdÄ[Ãgt*unsigned short terminReason,°dONLNdûiÃut*struct ICMPReport *icmpMsg);
  8356. °dONLNdªãä+øContinued on following page , p    AppleIconp°dONLNd◊~â
  8357. )x.(ŸïC parameter-block definitions
  8358. )à59 ÃpÃ)ˇv◊#ˇ ˇˇˇˇ#◊ 
  8359. d,
  8360. Courier
  8361. .°dONLNd x,™+ñH3typedef void (*TCPIOCompletionProc) (struct TCPiopb°dONLNd4.x:¢**iopb);°dONLNd<@xL8* typedef unsigned short tcp_port;°dONLNd]Rx^*typedef unsigned char byte;°dONLNdydxp*enum {  /* ValidityFlags */°dONLNdñrñ~+timeoutValue = 0x80,°dONLNd¨Äñå*timeoutAction = 0x40,°dONLNd√éñö*typeOfService = 0x20,°dONLNd⁄úñ®¸*precedence = 0x10°dONLNdÏ™x∂Ñ(“ñ};°dONLNdÔºx»¸*enum {  /* TOSFlags */°dONLNd ñ÷ˆ+lowDelay = 0x01,°dONLNdÿñ‰*throughPut = 0x02,°dONLNd-ÊñÚ*reliability = 0x04°dONLNd@ÙxÑ(ñ};°dONLNdCx *typedef struct TCPCreatePB {°dONLNdañ fi+ Ptr rcvBuff;°dONLNdo"ñ.,*unsigned long rcvBuffLen;°dONLNdä0ñ<,*TCPNotifyProc notifyProc;°dONLNd•>ñJˆ*Ptr userDataPtr;°dONLNd∂LxXΔ(tñ
  8362. }TCPCreatePB;,Times
  8363. °dONLNdƒixt¥*AThe following parameter block is used with the TCPPassiveOpen and°dONLNdwxÇ˙*TCPActiveOpen commands:
  8364. °dONLNdàxî*typedef struct TCPOpenPB {°dONLNd:ññ¢+byte ulpTimeoutValue;°dONLNdQ§ñ∞*byte ulpTimeoutAction;°dONLNdi≤ñæ*byte validityFlags;°dONLNd~¿ñÃ,*byte commandTimeoutValue;°dONLNdôŒñ⁄*ip_addr remoteHost;°dONLNdÆ‹ñË*tcp_port remotePort;°dONLNdƒÍñˆ*ip_addr localHost;°dONLNdÿ¯ñ*tcp_port localPort;°dONLNdÌñÍ*byte tosFlags;°dONLNd˝ñ ˆ*byte precedence;°dONLNd"ñ.¸*Boolean dontFrag;°dONLNd"0ñ<ˆ*byte timeToLive;°dONLNd4>ñJÍ*byte security;°dONLNdDLñX*byte optionCnt;°dONLNdUZñf¸*byte options[40];°dONLNdhhñtˆ*Ptr userDataPtr;°dONLNdyvxÇ∫(ûñ }TCPOpenPB;,N Helvetica Narrow(Ÿ<60
  8365. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ◊#ˇ ˇˇˇˇ#◊ 
  8366. d,
  8367. Courier
  8368. .°dONLNd Æ,J+ÃHtypedef struct TCPSendPB {°dONLNd.Ã:J+byte ulpTimeoutValue;°dONLNd3<ÃHP*byte ulpTimeoutAction;°dONLNdKJÃV>*byte validityFlags;°dONLNd`XÃd2*Boolean pushFlag;°dONLNdsfÃr>*Boolean urgentFlag;°dONLNdàtÃÄ* Ptr wdsPtr;°dONLNdïÇÃéV*unsigned long sendFree;°dONLNdÆêÃúh*unsigned short sendLength;°dONLNd ûÙ,*Ptr userDataPtr;°dONLNd€¨Æ∏(‘à }TCPSendPB;,Times
  8369. °dONLNdÁ…Æ‘˜*DThe following parameter block is used with the TCPRcv, TCPBfrReturn,°dONLNd,◊Æ‚F*and TCPNoCopyRcv commands:
  8370. °dONLNdGËÆÙ\*typedef struct TCPReceivePB {°dONLNdfˆÃb+byte commandTimeoutValue;°dONLNdÅÃ* byte filler;°dONLNdèÃ2*Boolean markFlag;°dONLNd¢ Ã,>*Boolean urgentFlag;°dONLNd∑.Ã:* Ptr rcvBuff;°dONLNd≈<ÃHh*unsigned short rcvBuffLen;°dONLNd·JÃV* Ptr rdsPtr;°dONLNdÓXÃdb*unsigned short rdsLength;°dONLNd    fÃrÜ*unsigned short secondTimeStamp;°dONLNd*tÃÄ,*Ptr userDataPtr;°dONLNd;ÇÆé(™Ã}TCPReceivePB;°dONLNdJîÆ†P*typedef struct TCPClosePB {°dONLNdg¢ÃÆJ+byte ulpTimeoutValue;°dONLNd~∞úP*byte ulpTimeoutAction;°dONLNdñæÃ >*byte validityFlags;°dONLNd´ÃÃÿ,*Ptr userDataPtr;°dONLNdº⁄Æʈ(à }TCPClosePB;°dONLNd…ÏÆ¯V*typedef struct HistoBucket {°dONLNdÁ˙ÃJ+unsigned short value;°dONLNd˛ÃP*unsigned long counter;°dONLNdÆ"∫(>Ã};°dONLNd(Æ4D*#define NumOfHistoBuckets°dONLNd2(b4h)¥7,N Helvetica Narrow
  8371. °dONLNd4>ãI+)Continued on following page , p    AppleIconp°dONLNdP=H
  8372. )x.(ŸïC parameter-block definitions
  8373. )â61 ÃpÃ)ˇ    ä◊#ˇ ˇˇˇˇ#◊ 
  8374. d,
  8375. Courier
  8376. .°dONLNd x,J+ñH#typedef struct TCPConnectionStats {°dONLNd%.ñ:8+unsigned long dataPktsRcvd;°dONLNdB<ñH8*unsigned long dataPktsSent;°dONLNd_JñVD*unsigned long dataPktsResent;°dONLNd~Xñd&*unsigned long bytesRcvd;°dONLNdòfñr8*unsigned long bytesRcvdDup;°dONLNdµtñÄb*"unsigned long bytesRcvdPastWindow;°dONLNdŸÇñé&*unsigned long bytesSent;°dONLNdÛêñú2*unsigned long bytesResent;°dONLNdûñ™P*unsigned short numHistoBuckets;°dONLNd0¨ñ∏Œ*4struct HistoBucket sentSizeHisto[NumOfHistoBuckets];°dONLNdf∫ñΔ *unsigned short lastRTT;°dONLNd»ñ‘ *unsigned short tmrSRTT;°dONLNdò÷ñ‚8*unsigned short rttVariance;°dONLNdµ‰ñ*unsigned short tmrRTO;°dONLNdÕÚñ˛*byte sendTries;°dONLNdfiñ *byte sourchQuenchRcvd;°dONLNdıx(6ñ}TCPConnectionStats;°dONLNd
  8377.  x, *typedef struct TCPStatusPB {°dONLNd(.ñ:+byte ulpTimeoutValue;°dONLNd?<ñH*byte ulpTimeoutAction;°dONLNdWJñVfi* long unused;°dONLNdeXñd*ip_addr remoteHost;°dONLNdzfñr*tcp_port remotePort;°dONLNdêtñÄ*ip_addr localHost;°dONLNd§Çñé*tcp_port localPort;°dONLNdπêñúÍ*byte tosFlags;°dONLNd…ûñ™ˆ*byte precedence;°dONLNd€¨ñ∏*byte connectionState;°dONLNdÚ∫ñΔ2*unsigned short sendWindow;°dONLNd»ñ‘,*unsigned short rcvWindow;°dONLNd)÷ñ‚J*unsigned short amtUnackedData;°dONLNdI‰ñD*unsigned short amtUnreadData;°dONLNdhÚñ˛*Ptr securityLevelPtr;°dONLNdñ 2*unsigned long sendUnacked;°dONLNdõñ *unsigned long sendNext;°dONLNd¥ñ(P*unsigned long congestionWindow;°dONLNd’*ñ6*unsigned long rcvNext;°dONLNdÌ8ñD*unsigned long srtt;°dONLNdFñR*unsigned long lastRTT;°dONLNdTñ`D*unsigned long sendMaxSegSize;°dONLNd9bñnÄ*'struct TCPConnectionStats *connStatPtr;°dONLNdbpñ|ˆ*Ptr userDataPtr;°dONLNds~xäΔ(¶ñ
  8378. }TCPStatusPB;,N Helvetica Narrow(Ÿ<62
  8379. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇ‹◊#ˇ ˇˇˇˇ#◊ 
  8380. d,
  8381. Courier
  8382. .°dONLNd Æ,P+ÃHtypedef struct TCPAbortPB {°dONLNd.Ã:,+Ptr userDataPtr;°dONLNd.<ÆHˆ(dà }TCPAbortPB;°dONLNd;NÆZD*typedef struct TCPParam {°dONLNdV\ÃhP+unsigned long tcpRtoA;°dONLNdnjÃv\*unsigned long tcpRtoMin;°dONLNdàxÃÑ\*unsigned long tcpRtoMax;°dONLNd¢ÜÃít*unsigned long tcpMaxSegSize;°dONLNd¿îÆb*unsigned long tcpMaxConn;°dONLNd€¢ÃÆn*unsigned long tcpMaxWindow;°dONLNd˜∞ƺÍ(ÿÃ
  8383. }TCPParam;°dONLNd¬ÆŒD*typedef struct TCPStats {°dONLNd–ËÄ+unsigned long tcpConnAttempts;°dONLNd=fiÃÍt*unsigned long tcpConnOpened;°dONLNd[ÏïÄ*unsigned long tcpConnAccepted;°dONLNd{˙Ãt*unsigned long tcpConnClosed;°dONLNdôÃz*unsigned long tcpConnAborted;°dONLNd∏Ã"h*unsigned long tcpOctetsIn;°dONLNd‘$Ã0n*unsigned long tcpOctetsOut;°dONLNdÒ2Ã>z*unsigned long tcpOctetsInDup;°dONLNd@ÃLÜ*unsigned long tcpOctetsRetrans;°dONLNd1NÃZn*unsigned long tcpInputPkts;°dONLNdN\Ãht*unsigned long tcpOutputPkts;°dONLNdljÃvb*unsigned long tcpDupPkts;°dONLNdáxÃÑz*unsigned long tcpRetransPkts;°dONLNd•ÜÆíÍ(ÆÃ
  8384. }TCPStats;°dONLNd∞òƧn* typedef struct TCPGlobalInfoPB {°dONLNd“¶Ã≤z+struct TCPParam *tcpParamPtr;°dONLNdҥÿz*struct TCPStats *tcpStatsPtr;°dONLNd¬ÃŒb*StreamPtr *tcpCDBTable[];°dONLNd+–Ë,*Ptr userDataPtr;°dONLNd=fiÃÍí*!unsigned short maxTCPConnections;°dONLNd_ÏÆ¯(Ã}TCPGlobalInfoPB;,N Helvetica Narrow
  8385. °dONLNdqã
  8386. +›Continued on following page , p    AppleIconp°dONLNdç 
  8387. )x.(ŸïC parameter-block definitions
  8388. )à63 ÃpÃ)ˇ<◊#ˇ ˇˇˇˇ#◊ 
  8389. d,
  8390. Courier
  8391. .°dONLNd x,+ñHtypedef struct TCPiopb {°dONLNd.ñ:¥+char °dONLNd .J:å)¥ fill12[12];°dONLNd-<ñH(d¥TCPIOCompletionProc°dONLNdA<JHò)¥
  8392. ioCompletion;°dONLNdPJñV∫(r¥short °dONLNdWJJVÄ)¥    ioResult;°dONLNdbXñd¥(Ä¥char °dONLNdhXJdå)¥ *ioNamePtr;°dONLNdufñr∫(é¥short °dONLNd|fJrÜ)¥
  8393. ioVRefNum;°dONLNdàtñÄ¥(ú¥short°dONLNdétJÄÜ)¥
  8394. ioCRefNum;°dONLNdöÇñé¥(™¥short°dONLNd†ÇJét)¥csCode;°dONLNd©êñúÃ(∏¥    StreamPtr°dONLNd≥êJúÜ)¥
  8395. tcpStream;°dONLNdøûñ™¿(Δ¥union {°dONLNd»¨ñ∏*struct TCPCreatePB°dONLNd€¨J∏t)¥create;°dONLNdÂ∫¥Δ(‚“struct TCPOpenPB°dONLNdˆ∫JΔh)ñopen;°dONLNd˛»¥‘(“struct TCPSendPB°dONLNd»J‘h)ñsend;°dONLNd÷¥‚&(˛“struct TCPReceivePB°dONLNd+÷J‚z)ñreceive;°dONLNd6‰¥( “struct TCPClosePB°dONLNdH‰Jn)ñclose;°dONLNdQÚ¥˛(“struct TCPAbortPB°dONLNdcÚJ˛n)ñabort;°dONLNdl¥  ((“struct TCPStatusPB°dONLNdJ t)ñstatus;°dONLNdâ¥8(6“struct TCPGlobalInfoPB°dONLNd†Jå)ñ globalInfo;°dONLNdÆ¥((D“
  8396. } csParam;°dONLNdπ*x6Æ(Rñ    }TCPiopb;,N Helvetica Narrow(Ÿ<64
  8397. ))Chapter 4 / Transmission Control Protocol Ã:ÃÛˇÆ◊#ˇ ˇˇˇˇ#◊ 
  8398. d,N Helvetica Narrow
  8399. 0.°dONLNd*TZj+rn5
  8400. °dONLNdAÆTå)ZName-to-Address Resolution,Times
  8401. °dONLNd™Æµ˙*cHTextual names are resolved to IP addresses using internal caches and the°dONLNdf∏Æ√*Gdomain name server. The AddressXlation interface accomplishes this task°dONLNdÆΔÆ—*Mby searching an internal table originally derived from the static file Hosts,°dONLNd¸‘Æfl˜*Emaking queries to domain name servers, and finding information in the°dONLNdB‚ÆÌç*/internal cache of domain name server responses.ˇÄ◊#ˇ ˇˇˇˇ#◊ 
  8402. d,N Helvetica Narrow
  8403. .°dONLNd-ƒ+<I The AddressXlation.h header file,Times
  8404. °dONLNd!8xCŒ+ZFThe AddressXlation.h interface supports the domain name resolver (DNR)°dONLNdhFxQÃ*Kfunction using the procedure calls listed in Table 5-1 and described in the°dONLNd¥Tx_Œ*following sections.
  8405. °dONLNd»px{ú*    Table 5-1°dONLNd—pú{)$  AddressXlation.h routines
  8406. °dONLNdÌÑxåë(©ñRoutine°dONLNdıÑ“åÓ)ZFunction ùîùÛ ØîØÛ
  8407. °dONLNd˛ñx°´(Ωñ OpenResolver°dONLNd ñ“°å)Z3Opens the resolver and allocates internal resources°dONLNd?•x∞§(Ãñ    StrToAddr°dONLNdI•“∞ú)Z6Converts an ASCII text string to the corresponding IP °dONLNdı“º* address°dONLNdà¿xÀ§(Áñ    AddrToStr°dONLNdí¿“Àë)Z4Converts an IP address into its text dotted decimal °dONLNd«Ã“◊* notation (W.X.Y.Z)°dONLNd⁄€xʰ(ñ    EnumCache°dONLNd‰€“ʧ)Z6Enumerates all the name-to-address mappings cached by °dONLNdÁ“Ú˛* the resolver°dONLNd(ˆx™(ñ
  8408. AddrToName°dONLNd3ˆ“ß)Z9Converts an IP address to its corresponding textual name °dONLNdm“
  8409. * using the resolver°dONLNdÄxå(8ñHInfo°dONLNdÜ“ò)Z5Returns details about the system whose name is being °dONLNdº“(Ó* queried°dONLNdƒ,x7í(SñMXInfo°dONLNdÀ,“7°)Z7Returns mail box information for the system whose name °dONLNd8“C * is being queried°dONLNdGxR¨(nñ
  8410. CloseResolver°dONLNd"G“Rñ)Z6Closes the resolver and deallocates internal resources zîzÛ(Ÿ<66
  8411. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇí◊#ˇ ˇˇˇˇ#◊ 
  8412. d,N Helvetica Narrow
  8413. .°dONLNdT-Δ+rIThe OpenResolver call,
  8414. Courier
  8415. °dONLNd4Æ@™+Z*extern OSErr OpenResolver(char *fileName);,Times
  8416. °dONLNdAJÆUÍ*BThe OpenResolver call must be made before any resolver queries are°dONLNdÑXÆc
  8417. *Lattempted. The full pathname of the default Hosts file must be passed in the
  8418. °dONLNd—eÆqfi*fileName
  8419. °dONLNdŸffiq˝)0B field. If the value NIL is passed, the resolver uses the filename°dONLNdtƈ(õÃJHosts in the default startup folder, which is typically the System Folder.°dONLNdgÇÆçÏ*FThe Hosts file is used to load the internal cache with name-to-address°dONLNdÆêÆõ„*Bmappings and domain name server values. The syntax of this file is°dONLNdÒûÆ©¡*7outlined on page 33 of Request for Comments (RFC) 1035.°dONLNd)≥Tæç(⁄r Result codes°dONLNd6≥Ææ©)Z4Resource Manager error result codes may be returned.(Ÿà The AddressXlation.h header file
  8420. )ï67 ÃpÃ)ˇ◊#ˇ ˇˇˇˇ#◊ 
  8421. d,N Helvetica Narrow
  8422. .°dONLNd-+<IThe StrToAddr call,
  8423. Courier
  8424. °dONLNd4x@+Z#define NUM_ALT_ADDRS 4°dONLNd+FxR*typedef struct hostInfo {°dONLNdFTñ`fi+ int rtnCode;°dONLNdTbñnˆ*char cname[255];°dONLNdfpñ|b*"unsigned long addr[NUM_ALT_ADDRS];°dONLNdâ~xäÑ(¶ñ};°dONLNdåêxúV*%typedef pascal void (*ResultProcPtr)(°dONLNd≥ûñ™D+struct hostInfo *hostInfoPtr,°dONLNd“¨ñ∏*char *userDataPtr);°dONLNdÊæx (Êñextern OSErr StrToAddr(°dONLNdˇÃñÿ+char *hostName,°dONLNd⁄ñÊD*struct hostInfo *hostInfoPtr,°dONLNd/ËñÙ,*ResultProcPtr ResultProc,°dONLNdJˆñ*char *userDataPtr);,Times
  8425. °dONLNd^ xç(3ñThe 
  8426. °dONLNdb çΩ)hostInfo
  8427. °dONLNdj Ω»)0= record is passed into the address translation routine in the
  8428. °dONLNd®x%Æ(Añ    StrToAddr
  8429. °dONLNd±Æ%‹)6  call. The 
  8430. °dONLNdº‹%).rtnCode
  8431. °dONLNd√%À)*. indicates whether the result fields are valid°dONLNdÚ(x3‚(Oñfor this call; a value of 
  8432. °dONLNd '‚3)jnoErr
  8433. °dONLNd(3ø), indicates that the call was successful. The
  8434. °dONLNd>5xAñ(]ñcname
  8435. °dONLNdC6ñA) is the official name of the 
  8436. °dONLNd`5AB)|hostName
  8437. °dONLNdh6BA∞)0 that was specified. The 
  8438. °dONLNdÅ5∞A»)naddr
  8439. °dONLNdÜDxO(kñ%array is a list of addresses for the 
  8440. °dONLNd´COB)öhostName
  8441. °dONLNd≥DBO¬)0 that was specified. Multiple°dONLNd—Rx]l(yñ5addresses are returned for hosts that are multihomed.
  8442. °dONLNdfxrÆ*    StrToAddr
  8443. °dONLNdgÆr—)6C takes a string in one of two forms and translates it into a 32-bit°dONLNdTuxÄ≈(úñKIP address. The string can be in IP dot notation (that is, W.X.Y.Z) or in a°dONLNd†ÉxéÕ*Hvalid domain name syntax. The translated address is returned immediately°dONLNdÈëxú∂*Iif the passed in host is in IP dot notation or if the matching address is°dONLNd3üx™æ*Jcontained in the local cache. If the address is not contained in the local°dONLNd~≠x∏®* cache, the 
  8444. °dONLNd⨮∏“)0rtnCode
  8445. °dONLNdê≠“∏fl)* is 
  8446. °dONLNdî¨fl∏)
  8447. cacheFault
  8448. °dONLNdû≠∏™)< and the domain name server is°dONLNdΩªxΔ‘(‚ñJcontacted to resolve the address. When the response has been returned from°dONLNd…x‘°*<the domain name server or the domain name query has not been°dONLNdE◊x‚¯*successfully completed, the 
  8449. °dONLNda÷¯‚4)Ä
  8450. ResultProc
  8451. °dONLNdk◊4‚ª)< is called with the appropriate
  8452. °dONLNdã‰x¢( ñrtnCode
  8453. °dONLNdí¢*)* and return information. The 
  8454. °dONLNd؉*`)à    StrToAddr
  8455. °dONLNd∏Â`—)6 procedure can be called°dONLNd—Ûx˛ñ(ñwith a 
  8456. °dONLNdÿÚñ˛ÿ) userDataPtr
  8457. °dONLNd„Ûÿ˛≤)B/, which is user-defined and not modified by the°dONLNdx ∑((ñresolver. The 
  8458. °dONLNd!∑ ˘)? userDataPtr
  8459. °dONLNd,˘ \)B is returned when the 
  8460. °dONLNdB\ ò)c
  8461. ResultProc
  8462. °dONLNdLò √)<  is called.°dONLNdXxŒ(6ñJDomain names that contain no domain name delimiters, that is, no dots (.),°dONLNd£x(≤*Dare terminated with the domain name suffix specified for the default°dONLNdË+x6—*Jdomain name server in the Control Panel. They are terminated with a dot if°dONLNd39xD‡*no default is specified.
  8463. (Ÿ<68
  8464. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇ ◊#ˇ ˇˇˇˇ#◊ 
  8465. d,Times
  8466. .°dONLNd!T,ç+rH Result codes°dONLNd
  8467. !Æ,ˆ)Z
  8468. nameSyntaxErr°dONLNd!5,F)áthe ,
  8469. Courier
  8470. °dONLNd F,v)hostName
  8471. °dONLNd'!v,Â)0 field had a syntax error°dONLNdA3Æ>fl(ZÃ
  8472. cacheFault°dONLNdL35>˜)á)the name specified cannot be found in the°dONLNdvA5LO*cache°dONLNd|SÆ^Î(zà noResultProc°dONLNdâS5^¸)á,no result procedure is passed to the address°dONLNd∂a5l
  8473. */translation call when the resolver must be used°dONLNdÊo5zä*to find the address°dONLNd˙ÅÆåÚ(®Ã noNameServer°dONLNdÅ5å    )á-no name server can be found for the specified°dONLNd5è5ök* name string°dONLNdA°Æ¨Ï(»Ã authNameErr°dONLNdM°5¨…)áthis domain name does not exist°dONLNdm≥Ææ€(⁄ÃnoAnsErr°dONLNdv≥5æ€)á"none of the known name servers are°dONLNdô¡5Ãi*
  8474. responding°dONLNd§”ÆfiÕ(˙ÃdnrErr°dONLNd´”5fi)á,the domain name server has returned an error°dONLNdÿÂÆÒ( à outOfMemory°dONLNd‰Â5ˇ)á+not enough memory is available to issue the°dONLNdÛ5˛ˇ*'needed domain name resolver (DNR) query°dONLNd85 Æ*or to build the DNR cache°dONLNdRÆÂ(:Ã
  8475. notOpenErr°dONLNd]5ì)áthe driver isn’t open,N Helvetica Narrow
  8476. °dONLNds9TGµ(crThe AddrToStr call
  8477. °dONLNdÜNÆZ
  8478. +Z:extern OSErr AddrToStr(unsigned long addr, char *addrStr);
  8479. °dONLNd¡dÆo*JThe AddrToStr call takes an IP address and returns a string with the ASCII°dONLNd rÆ}    *Hequivalent of the form W.X.Y.Z where W, X, Y, and Z are decimal numbers.°dONLNdUÄÆã˝*JThe application must provide the storage for the return string. The string°dONLNd†éÆôj*&can have a maximum length of 16 bytes.°dONLNd«£TÆç( r Result codes°dONLNd‘£ÆÆÂ)Z
  8480. notOpenErr°dONLNdfl£5Æì)áthe driver isn’t open(Ÿà The AddressXlation.h header file
  8481. )ï69 ÃpÃ)ˇ ö◊#ˇ ˇˇˇˇ#◊ 
  8482. d,N Helvetica Narrow
  8483. .°dONLNd-á+<IThe EnumCache call,
  8484. Courier
  8485. °dONLNd4x@+Ztypedef enum AddrClasses {°dONLNd/BñN∫+A = 1,°dONLNd7Pñ\®*NS,°dONLNd<^ñj“*
  8486. CNAME = 5,°dONLNdHlñxÿ* HINFO = 13,°dONLNdUzñÜΔ*MX = 15,°dONLNd_àñî¸*lastClass = 32767°dONLNdqñx¢Δ(æñ
  8487. }AddrClasses;°dONLNd®x¥>*!typedef struct cacheEntryRecord {°dONLNd¢∂ñ¬fi+ char *cname;°dONLNd∞ƒñ–*unsigned short type;°dONLNdΔ“ñfi2*unsigned short cacheClass;°dONLNd‚‡ñÏ*unsigned long ttl;°dONLNdˆÓñ˙¿*union {°dONLNd¸¥ˆ+ char *name;°dONLNd
  8488. ¥*ip_addr *addr;°dONLNdñ$Δ(@¥} rdata;°dONLNd'&x2Ñ(Nñ};°dONLNd*8xDn*)typedef pascal void (*EnumResultProcPtr)(°dONLNdUFñR§+-struct cacheEntryRecord *cacheEntryRecordPtr,°dONLNdÑTñ`*char *userDataPtr);°dONLNdòfxr(éñextern OSErr EnumCache(°dONLNd±tñÄ\+!EnumResultProcPtr enumResultProc,°dONLNd‘Çñé*char *userDataPtr);,Times
  8489. °dONLNdËóx¢Ø(æñGIf the application wants to enumerate all the entries in the cache, the°dONLNd0•x∞Ã*FEnumCache procedure should be called. This procedure returns no errors°dONLNdw≥xæÕ*Hand has completed enumerating the cache when it returns. For every entry°dONLNd¿¡xÃ¥*in the cache, 
  8490. °dONLNdŒ¿¥Ã)<enumResultProc
  8491. °dONLNd‹¡Ã¡)T+ is called with a pointer to a cache entry.°dONLNdœx⁄#(ˆñ&The fields and values returned in the 
  8492. °dONLNd.Œ#⁄É)´CacheEntryRecord
  8493. °dONLNd>œÉ⁄«)` are as follows:°dONLNdO‰xÔë( ñname°dONLNdT‰“Ô<)ZThe name of the entry.°dONLNdk˘xå( ñtype°dONLNdp˘“T)ZThe type of the entry, where°dONLNdç‘fl+—°dONLNdéflÊ) A°dONLNdèÊú)) (value = 1) is an address. The value of 
  8494. °dONLNd∏ú∫)∂rdata
  8495. °dONLNdΩ∫“) is an
  8496. °dONLNdƒ‡ ¯(<˛addr
  8497. °dONLNd»¯ ˚).°dONLNd #‘.fl(JÚ—°dONLNdÀ#fl.Ï) NS°dONLNdÕ#Ï.±)
  8498. , (value = 2) is a name server. The value of 
  8499. °dONLNd˘"±.œ)≈rdata
  8500. °dONLNdˇ1‡<Ú(X˛is a °dONLNd1Ú<)name°dONLNd1<).°dONLNd
  8501. ?‘Jfl(fÚ—°dONLNd ?flJ) CNAME°dONLNd?J∫)%* (value = 5) is an alias for the canonical°dONLNd;M‡X(t˛name (
  8502. °dONLNdALX) cname
  8503. °dONLNdFMXa)) found in the 
  8504. °dONLNdULaX)Crdata
  8505. °dONLNdZMXö) field.°dONLNdbbxm©(âñ
  8506. cacheClass°dONLNdmb“mº)Z4The class of the entry. The only class allowed is IN°dONLNd¢p“{˛*
  8507. (value 1).
  8508. (Ÿ<70
  8509. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇË◊#ˇ ˇˇˇˇ#◊ 
  8510. d,Times
  8511. .°dONLNd!Æ,∑+ÃHttl°dONLNd!,)Z9The time that the entry has to live in the cache relative°dONLNd>/:û*!to the current time (GetCurrent).°dONLNd`DÆO≈(kÃrdata°dONLNdfDO)ZThe ,
  8512. Courier
  8513. °dONLNdjCO;)rdata
  8514. °dONLNdoD;Oı)) field as determined by the type of entry°dONLNdôR]Ä(y&specified in the type field.°dONLNd∂gTrç(ér Result codes°dONLNd√gÆrÂ)Z
  8515. notOpenErr°dONLNdŒgrf)Zthe driver isn’t open,N Helvetica Narrow(Ÿà The AddressXlation.h header file
  8516. )ñ71 ÃpÃ)ˇ ◊#ˇ ˇˇˇˇ#◊ 
  8517. d,N Helvetica Narrow
  8518. .°dONLNd-é+<IThe AddrToName call,
  8519. Courier
  8520. °dONLNd4x@+Zextern OSErr AddrToName(°dONLNd.BñN‰+
  8521. ip_addr addr,°dONLNd=Pñ\D*struct hostInfo *hostInfoPtr,°dONLNd\^ñj,*ResultProcPtr ResultProc,°dONLNdwlñx*char *userDataPtr);,Times
  8522. °dONLNdãÇxç∫(©ñCThe AddrToName call is used to acquire the canonical name of a host°dONLNdœêxõ‘*Hgiven its IP address. The domain name server is queried using an IN-ADDR°dONLNdûx©‘*Jquery. The application passes to the AddrToName call the IP address of the°dONLNdc¨x∑*!host in question, a pointer to a 
  8523. °dONLNdÑ´∑6)éhostInfo
  8524. °dONLNdå¨6∑“)0# record, the result procedure to be°dONLNd∞∫x≈î(·ñ@notified with the result, and an optional user data pointer. The°dONLNdÒ»x”™*?AddrToName call always returns immediately with the return code
  8525. °dONLNd1’x·¥*
  8526. cacheFault
  8527. °dONLNd;÷¥·
  8528. )< or the return code 
  8529. °dONLNdO’
  8530. ·U)Y noNameServer
  8531. °dONLNd[÷U·…)H if no name server can be°dONLNdu‰xÔ–( ñKfound in the internal name server lists that can resolve the DNR query. The°dONLNd¡Úx˝Ã*Mpassed-in result procedure is called with the appropriate result code. If the°dONLNdx ∑*result code is 
  8532. °dONLNdˇ∑ ’)?noErr
  8533. °dONLNd#’ Î), the 
  8534. °dONLNd)ˇÎ     )cname
  8535. °dONLNd.     »)* field contains the canonical name for the°dONLNdYx>(5ñ)IP address passed to the AddrToName call.°dONLNdÉ#.W(J< Result codes°dONLNdê#x.©)Z
  8536. cacheFault°dONLNdõ#ˇ.¡)á)the name specified cannot be found in the°dONLNd«1ˇ<*cache°dONLNdÕCxNº(jñ noNameServer°dONLNd⁄CˇN”)á-no name server can be found for the specified°dONLNdQˇ\5* name string°dONLNdcxn∂(äñ authNameErr°dONLNd cˇnì)áthis domain name does not exist°dONLNd@uxÄ•(úñnoAnsErr°dONLNdIuˇÄ•)á"none of the known name servers are°dONLNdlɡé3*
  8537. responding°dONLNdwïx†ó(ºñdnrErr°dONLNd~ïˇ†—)á,the domain name server has returned an error°dONLNd´ßx≤ª(Œñ outOfMemory°dONLNd∑ߡ≤…)á+not enough memory is available to issue the°dONLNd„µˇ¿‘**needed DNR query or to build the DNR cache°dONLNd«x“Ø(Óñ
  8538. notOpenErr°dONLNd«ˇ“])áthe driver isn’t open
  8539. (Ÿ<72
  8540. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇ
  8541. é◊#ˇ ˇˇˇˇ#◊ 
  8542. d,N Helvetica Narrow
  8543. .°dONLNdT-ô+rIThe HInfo call,
  8544. Courier
  8545. °dONLNd4Æ@D+Ztypedef struct HinfoRec {°dONLNd*BÃN2+char cpuType[30];°dONLNd=PÃ\,*char osType[30];°dONLNdN^Æj∫(ÜÃ};°dONLNdRpÆ|J*typedef struct returnRec {°dONLNdn~Ãä+ int rtnCode;°dONLNd|åÃò,*char cname[255];°dONLNdéööˆ*union {°dONLNdò®Í¥∂+"unsigned long addr[NUM_ALT_ADDRS];°dONLNdΩ∂ͬn*struct HInfoRec hinfo;°dONLNd÷ƒÍ–J*struct MXRec mx;°dONLNdË“Ãfi¸(˙Í} rdata;°dONLNdÒ‡ÆÏ∫(Ã};°dONLNdÙÚÆ˛í*&typedef pascal void (*ResultProc2Ptr)(°dONLNdà Ü+struct returnRec *returnRecPtr,°dONLNd>Ã>*char *userDataPtr);°dONLNdR Æ, (HÃextern OSErr HInfo(°dONLNdg.Ã:&+char *hostName,°dONLNdx<ÃHÜ*struct returnRec *returnRecPtr,°dONLNdôJÃVh*ResultProc2Ptr resultProc,°dONLNdµXÃd>*char *userDataPtr);,Times
  8546. °dONLNd…nÆyÁ(ïÃCThe HInfo call returns details about the system whose name is being°dONLNd
  8547. |ÆáX*'queried. The call returns two strings, 
  8548. °dONLNd4{XáÇ)™cpuType
  8549. °dONLNd;|Çáô)* and 
  8550. °dONLNd@{ôáΩ)osType
  8551. °dONLNdF|Ωá)$, that specify in°dONLNdXäÆï∞(±Ã6ASCII the values of the CPU and operating system type.°dONLNdèüÆ™*KThe HInfo call follows the calling conventions for queries described in the°dONLNd€≠Æ∏á*.section “DNR Operation” later in this chapter.°dONLNd
  8552. ¬TÕç(Èr Result codes°dONLNd¬ÆÕˆ)Z
  8553. nameSyntaxErr°dONLNd%¬5ÕF)áthe 
  8554. °dONLNd)¡FÕv)hostName
  8555. °dONLNd1¬vÕ„)0 field has a syntax error°dONLNdK‘ÆflÚ(˚à noNameServer°dONLNdX‘5fl    )á-no name server can be found for the specified°dONLNdÜ‚5Ìk* name string°dONLNdíÙÆˇ€(ÃnoAnsErr°dONLNdõÙ5ˇ€)á"none of the known name servers are°dONLNdæ5
  8556. i*
  8557. responding°dONLNd…ÆÕ(;ÃdnrErr°dONLNd–5)á,the domain name server has returned an error°dONLNd˝&Æ1Ò(MÃ outOfMemory°dONLNd    &51ˇ)á+not enough memory is available to issue the°dONLNd545?
  8558. **needed DNR query or to build the DNR cache°dONLNd`FÆQÂ(mÃ
  8559. notOpenErr°dONLNdkF5Qì)áthe driver isn’t open+5l The AddressXlation.h header file
  8560. )ï73 ÃpÃ)ˇ t◊#ˇ ˇˇˇˇ#◊ 
  8561. d,N Helvetica Narrow
  8562. .°dONLNd-o+<IThe MXInfo call,
  8563. Courier
  8564. °dONLNd4x@¸+Ztypedef struct MXRec {°dONLNd(BñN2+unsigned short preference;°dONLNdDPñ\*char exchange[255];°dONLNdY^ñj¢*};°dONLNd\px|(òñtypedef struct returnRec {°dONLNdx~ñäfi+ int rtnCode;°dONLNdÜåñòˆ*char cname[255];°dONLNdòöñ¶¿*union {°dONLNd¢®¥¥Ä+"unsigned long addr[NUM_ALT_ADDRS];°dONLNd«∂¥¬8*struct HInfoRec hinfo;°dONLNd‡ƒ¥–*struct MXRec mx;°dONLNdÚ“ñfiΔ(˙¥} rdata;°dONLNd˚‡xÏÑ(ñ};°dONLNd˛Úx˛\*&typedef pascal void (*ResultProc2Ptr)(°dONLNd&ñ P+struct returnRec *returnRecPtr,°dONLNdHñ*char *userDataPtr);°dONLNd\ x,Í(Hñextern OSerr MXInfo°dONLNdq.ñ:ˆ+(char *hostName,°dONLNdÉ<ñHP*struct returnRec *returnRecPtr,°dONLNd§JñV2*ResultProc2Ptr resultProc,°dONLNd¿Xñd*char *userDataPtr);,Times
  8565. °dONLNd‘nxyŒ(ïñFThe MXInfo call returns mail box information for the system whose name°dONLNd|xáE*.is being queried. The call returns two values:, p    AppleIconp
  8566. °dONLNdJêxò}*n
  8567. °dONLNdLéÖô‘)
  8568. Jpreference, an unsigned integer specifying the preference that is given to°dONLNdóúÖß˚*the returned system namep
  8569. °dONLNd∞∞x∏}(’ñn
  8570. °dONLNd≤ÆÖπŒ)
  8571. Gexchange, the domain name for the system that is receiving mail for the°dONLNd˙ºÖ«ƒ*specified host°dONLNd    —x‹«(¯ñHThe MXInfo call follows the calling conventions for queries described in°dONLNdRflxÍb*2the section “DNR Operation” later in this chapter.°dONLNdÖÙˇW(< Result codes°dONLNdíÙxˇ¿)Z
  8572. nameSyntaxErr°dONLNd†Ùˇˇ)áthe 
  8573. °dONLNd§Ûˇ@)hostName
  8574. °dONLNd¨Ù@ˇ≠)0 field has a syntax error°dONLNdΔxº(-ñ noNameServer°dONLNd”ˇ”)á-no name server can be found for the specified°dONLNdˇ5* name string°dONLNd
  8575. &x1•(MñnoAnsErr°dONLNd&ˇ1•)á"none of the known name servers are°dONLNd94ˇ?3*
  8576. responding°dONLNdDFxQó(mñdnrErr°dONLNdKFˇQ—)á,the domain name server has returned an error°dONLNdxXxcª(ñ outOfMemory°dONLNdÑXˇc…)á+not enough memory is available to issue the°dONLNd∞fˇq…*'needed domain name resolver (DNR) query°dONLNdÿtˇx*or to build the DNR cache°dONLNdÛÜxëØ(≠ñ
  8577. notOpenErr°dONLNd˛ܡë])áthe driver isn’t open
  8578. (Ÿ<74
  8579. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇ
  8580. º◊#ˇ ˇˇˇˇ#◊ 
  8581. d,N Helvetica Narrow
  8582. .°dONLNdT-«+rIThe CloseResolver call,
  8583. Courier
  8584. °dONLNd4Æ@b+Zextern OSerr CloseResolver ();,Times
  8585. °dONLNd6JÆU*LBefore the application exits, the CloseResolver call must be made to release°dONLNdÉXÆc*Imemory structures and terminate all outstanding domain name server calls.°dONLNdÕfÆq˙*JCloseResolver must not be called until all outstanding resolver calls have°dONLNdtÆ˙*been completed.°dONLNd(âTîç(∞r Result codes°dONLNd5âÆîÂ)Z
  8586. notOpenErr°dONLNd@â5îì)áthe driver isn’t open
  8587. °dONLNdVØTΩ(Ÿr"Binding the DNR to the application
  8588. °dONLNdy»Æ”+ZEThe domain name resolver (DNR) in the MacTCP driver is implemented as°dONLNdø÷Æ·q**a code resource in the MacTCP driver file.°dONLNdÍÎÆˆÛ*FA file called DNR.c in the Libraries Folder of the MacTCP release disk°dONLNd1˘Æ˙*Cprovides a working example of how to open the DNR. Compile and link°dONLNduÆ*Kthis file to your application. MPW version 3.2 produces a file called DNR.o°dONLNd¡Æ     *Kin the Libraries Folder of the MacTCP release disk that provides procedural°dONLNd
  8589. #Æ.*Jaccess to the DNR. Sources have also been provided if you need to port the°dONLNdX1Æ<~*,functionality to another development system.°dONLNdÖFÆQ*KTo use the DNR, the application must first find the procedure pointers that°dONLNd—TÆ_˙*Gare part of the DNR resource. In Macintosh system software version 6.0.°dONLNdT˙_ˇ({x°dONLNdTˇ_),°dONLNdbÆm'(âÃthe DNR resource, named °dONLNd3b'm@)ydnrp,°dONLNd8b@m)0 is attached to the driver file, which is in the°dONLNdipÆ{˘(óÃKSystem Folder of the startup disk. The driver file is of type cdev, creator°dONLNdµ~ÆâÔ*Iztcp. In Macintosh system software version 7.0, the driver file is in the°dONLNdˇåÆó‹*AControl Panels folder (see the chapter “The Finder Interface” in °dONLNd@å‹ó¯(≥˙Inside°dONLNdGöÆ•fi(¡Ã    Macintosh°dONLNdPöfi•˝)0;, Volume VI). The resource can be opened using the Resource°dONLNd宯≥J(œÃ Manager routines in the Toolbox.°dONLNdÆΩÆ»*MOnce the resource is opened, the first long word of the resource is a pointer°dONLNd¸ÀÆ÷*Gto a procedure that jumps to the correct DNR procedure. You should make°dONLNdDŸÆ‰‹*Dcalls to this procedure using the procedure index value as the first°dONLNdâÁÆÚ*Iargument of the call, followed by the arguments for the procedure as they°dONLNd”ıÆ*Jare specified in the AddressXlation.h interface. The procedure assignments°dONLNdÆÔ*are as follows:°dONLNd.Æ#Ó* OpenResolver°dONLNd;#)Z1°dONLNd=-Æ8Ó(TÃ
  8590. CloseResolver°dONLNdK-8)Z2°dONLNdMBÆM‡(ià   StrToAddr°dONLNdWBM)Z3°dONLNdYWÆb‡(~à   AddrToStr°dONLNdcWb)Z4°dONLNdelÆwÊ(ìà   EnumCache°dONLNdolw)Z5°dONLNdqÅÆåÓ(®Ã
  8591. AddrToName°dONLNd|Åå)Z6+[1"Binding the DNR to the application
  8592. )ú75 ÃpÃ)ˇ
  8593. t◊#ˇ ˇˇˇˇ#◊ 
  8594. d,Times
  8595. .°dONLNd!x,î+ñHHInfo°dONLNd!“,ÿ)Z7°dONLNd6xAû(]ñMXInfo°dONLNd6“Aÿ)Z8,N Helvetica Narrow
  8596. °dONLNd\jk(Ü<
  8597. DNR operation
  8598. °dONLNduxÄ—+ZIThis section describes how the domain name server (DNS) list is used when°dONLNdiÉxé€*making DNS queries.°dONLNd}òx£…*KIf a default name extension and server are identified in the Control Panel,°dONLNd…¶x±∂*Fthey are used for all nonqualified requests. For example, if the name ,
  8599. Courier
  8600. °dONLNd•∂±‘(Õ‘homer
  8601. °dONLNd¥xø[(€ñ2is passed to the DNR and the default extension is 
  8602. °dONLNdG≥[øó)„
  8603. pundit.edu
  8604. °dONLNdQ¥óøΔ)<
  8605. , the name
  8606. °dONLNd\¡xÕÿ(Èñhomer.pundit.edu
  8607. °dONLNdl¬ÿÕö)`+ is used in the query; however, if the name
  8608. °dONLNdòœx€¸(˜ñhomer.drama.pundit.edu
  8609. °dONLNdÆ–¸€º)Ñ+ is passed to the DNR, the extension is not°dONLNd⁄fixÈ®(ñ    appended.°dONLNd‰Ûx˛∫*AThe extension of the name passed to the DNR determines which name°dONLNd&x ø*Jservers are chosen. Servers that match the full extension are found first,°dONLNdqxÆ*Ffollowed by servers that serve the ancestor of the full extension (for°dONLNd∏x(‚*example, for the name 
  8610. °dONLNdŒ‚(f)jhomer.drama.pundit.edu
  8611. °dONLNd‰f(…)Ñ, the server that serves
  8612. °dONLNd˝*x6ÿ(Rñdrama.pundit.edu
  8613. °dONLNd
  8614. +ÿ6‘)`8 would be found first followed by the server that serves
  8615. °dONLNdF8xD¥(`ñ
  8616. pundit.edu
  8617. °dONLNdP9¥D“)<B). If no servers are found, the default server is used. If you did°dONLNdìGxR(nñ#not set a default, the DNR returns 
  8618. °dONLNd∂FR\)ú noNameServer
  8619. °dONLNd¬G\RŒ)H. In the MacTCP Control°dONLNd⁄Ux`ø(|ñGPanel, you should enter a default domain and select the Default button.°dONLNd"jxu¡*JOnce a list of servers that support the domain is found, those servers are°dONLNdmxxÉÀ*Lqueried in the order of their distance from the querying host. First servers°dONLNd∫Üxëƒ*Hon the local network are queried, followed by servers on other networks.°dONLNdîxü√*DWhen you use the AddrToName query, you must select a default server.
  8620. (Ÿ<76
  8621. )&Chapter 5 / Name-to-Address Resolution Ã:ÃÛˇà◊#ˇ ˇˇˇˇ#◊ 
  8622. d,N Helvetica Narrow
  8623. 0.°dONLNd*TZj+rn6
  8624. °dONLNdAÆTq)ZMiscellaneous Interfaces,Times
  8625. °dONLNd™Æµˇ*cGThis chapter describes types that are found throughout the programmatic°dONLNdc∏Æ√w*+interfaces supplied with the MacTCP driver. ÃpÃ)ˇ
  8626. ◊#ˇ ˇˇˇˇ#◊ 
  8627. d,N Helvetica Narrow
  8628. .°dONLNd-ö+<IMacTCPCommontypes,Times
  8629. °dONLNd8xC√+ZFThis file defines result code name-to-number mapping, Internet Control°dONLNdYFxQó*<Message Protocol (ICMP) message report structures, and other°dONLNdñTx_g*1miscellaneous types throughout the MacTCP driver.
  8630. °dONLNd»ox|º* Result codes
  8631. °dONLNd’áxí∞*?The result codes in MacTCPCommontypes are described as follows.°dONLNdïx†Ø*EChapters 3, 4, and 5 contain specific occurrences of the result codes°dONLNd[£xÆÈ*described in this section.,
  8632. Courier
  8633. °dONLNdv¥x¿‰*#define inProgress
  8634. °dONLNdâµ,¿2)¥1°dONLNdãµY¿∫)-When an IOPB is still°dONLNd°√YŒÑ*    pending, 
  8635. °dONLNd™¬ÑŒ¥)+ioResult
  8636. °dONLNd≤√¥ŒÕ)0 is set°dONLNd∫—Y‹e(¯wto 
  8637. °dONLNdΩ–e‹°)
  8638. inProgress
  8639. °dONLNd«—°‹§)<.
  8640. °dONLNd…‚xÓÍ(
  8641. ñ#define ipBadLapErr
  8642. °dONLNd›„,ÓN)¥-23000°dONLNd‰„YÓ¡)-Unable to initialize the°dONLNd˝ÒY¸¿*local network handler.
  8643. °dONLNdx(*ñ#define ipBadCnfgErr
  8644. °dONLNd),N)¥-23001°dONLNd0YÕ)-The manually set address°dONLNdIY–*is configured improperly.
  8645. °dONLNdc"x.Í(Jñ#define ipNoCnfgErr
  8646. °dONLNdw#,.N)¥-23002°dONLNd~#Y.Õ)-A configuration resource°dONLNdó1Y<â* is missing.
  8647. °dONLNd£BxNfi(jñ#define ipLoadErr
  8648. °dONLNdµC,NN)¥-23003°dONLNdºCYN…)-Not enough room in the°dONLNd”QY\•*application heap°dONLNd‰_Yj™*(Macintosh 512K°dONLNdÙmYx§*enhanced only).
  8649. °dONLNd~xäfi(¶ñ#define ipBadAddr
  8650. °dONLNd,äN)¥-23004°dONLNdYä‘)-Error in getting an address°dONLNd9çYò¥*from a server or the°dONLNdNõY¶»*address is already in use°dONLNdh©Y¥∏*by another machine.
  8651. °dONLNd|∫xΔ(‚ñ#define connectionClosing
  8652. °dONLNdñª,ΔN)¥-23005°dONLNdùªYΔ¬)-A TCPClose command°dONLNd∞…Y‘‘*was already issued so there°dONLNdÃ◊Y‚”*is no more data to send on°dONLNdÁÂY¢*this connection.
  8653. °dONLNd¯ˆxˆ(ñ#define invalidLength
  8654. °dONLNd˜,N)¥-23006°dONLNd˜YÀ)-The total amount of data°dONLNd.Y“*described by the WDS was°dONLNdGY√*either 0 or greater than°dONLNd`!Y,ó*
  8655. 65,535 bytes.
  8656. °dONLNdn2x>(Zñ#define connectionExists
  8657. °dONLNdá3,>N)¥-23007°dONLNdé3Y>…)-The TCP or UDP stream°dONLNd§AYLµ*already has an open°dONLNd∏OYZè* connection.
  8658. °dONLNdƒ`xl&(àñ#define connectionDoesntExist
  8659. °dONLNd‚a,lN)¥-23008°dONLNdÈaYlΔ)-This TCP stream has no°dONLNdoYz©*open connection.
  8660. (Ÿ<78
  8661. )$Chapter 6 / Miscellaneous Interfaces Ã:ÃÛˇ
  8662. H◊#ˇ ˇˇˇˇ#◊ 
  8663. d,
  8664. Courier
  8665. .°dONLNd Æ,\+ÃH#define insufficientResources,Times
  8666. °dONLNd!b,Ñ)¥-23009°dONLNd%!è,˝)-64 TCP or UDP streams°dONLNd;/è:fl*are already open.
  8667. °dONLNdM@ÆL>(hÃ#define invalidStreamPtr
  8668. °dONLNdfAbLÑ)¥-23010°dONLNdmAèL
  8669. )-The specified TCP or UDP°dONLNdÜOèZÊ*stream is not open.
  8670. °dONLNdö`ÆlD(àÃ#define streamAlreadyOpen
  8671. °dONLNd¥ablÑ)¥-23011°dONLNdªaèl)-An open stream is already°dONLNd’oèz˛*using this receive buffer°dONLNdÔ}èà•*area.
  8672. °dONLNdıéÆöV(∂Ã#define connectionTerminated
  8673. °dONLNdèböÑ)¥-23012°dONLNdèèö)-The TCP connection was°dONLNd0ùè®*broken; the reason will be°dONLNdK´è∂*given in a terminate ASR.
  8674. °dONLNdeºÆ»,(‰Ã#define invalidBufPtr
  8675. °dONLNd{Ωb»Ñ)¥-23013°dONLNdÇΩè»˙)-The receive buffer area°dONLNdöÀè÷Δ*
  8676. pointer is 0.
  8677. °dONLNd®‹ÆË(Ã#define invalidRDS
  8678. °dONLNdª›bËÑ)¥-23014°dONLNd¬›èË)-The RDS refers to receive°dONLNd‹Îèˆ*buffers not owned by the°dONLNdı˘è•*user.
  8679. °dONLNd˚
  8680. Æ(2Ã#define invalidWDS
  8681. °dONLNd bÑ)¥-23014°dONLNd è˛)-The WDS pointer was 0.
  8682. °dONLNd,Æ((DÃ#define openFailed
  8683. °dONLNd?b(Ñ)¥-23015°dONLNdFè(Ú)-The connection came°dONLNdZ+è6Ì*halfway up and then°dONLNdn9èD¨*failed.
  8684. °dONLNdvJÆV2(rÃ#define commandTimeout
  8685. °dONLNdçKbVÑ)¥-23016°dONLNdîKèV˛)-The specified command°dONLNd™Yèd*action was not completed°dONLNd√gèrÏ*in the specified time°dONLNdŸuèÄ∞*period.
  8686. °dONLNd·ÜÆí8(ÆÃ#define duplicateSocket
  8687. °dONLNd˘ábíÑ)¥-23017°dONLNdáèí)-A stream is already open°dONLNdïè†*using this local UDP port°dONLNd3£èÆÓ*or a TCP connection°dONLNdG±èº*already exists between this°dONLNdcøè *local IP address and TCP°dONLNd|Õèÿı*port, and the specified°dONLNdî€èÊı*remote IP address and°dONLNd™ÈèÙº*    TCP port.
  8688. °dONLNd¥˙Æ,("Ã#define ipDontFragErr
  8689. °dONLNd ˚bÑ)¥-23032°dONLNd—˚è)-The packet is too large to°dONLNdÏ    è*send without fragmenting°dONLNdè"ˇ*and the Don’t Fragment°dONLNd%è0Ω* flag is set.
  8690. °dONLNd)6ÆB,(^Ã#define ipDestDeadErr
  8691. °dONLNd?7bBÑ)¥-23033°dONLNdF7èB)-The destination host is not°dONLNdbEèPÙ*responding to address°dONLNdxSè^Ë*resolution requests.
  8692. °dONLNdçdÆpJ(åÃ#define icmpEchoTimeoutErr
  8693. °dONLNd®ebpÑ)¥-23035°dONLNdØeèp)-The icmp echo packet was°dONLNd»sè~˙*not responded to in the°dONLNd‡Åèå*indicated timeout period.,N Helvetica Narrow*1MacTCPCommontypes
  8694. )p79 ÃpÃ)ˇ
  8695. ◊#ˇ ˇˇˇˇ#◊ 
  8696. d,
  8697. Courier
  8698. .°dONLNd x,¸+ñH#define ipNoFragMemErr,Times
  8699. °dONLNd!,,N)¥-23036°dONLNd!Y,“)-Insufficient internal driver°dONLNd;/Y:±*buffers available to°dONLNdP=YHΔ*fragment this packet on°dONLNdhKYVq*send.
  8700. °dONLNdn\xh‰(Ññ#define ipRouteErr
  8701. °dONLNdÅ],hN)¥-23037°dONLNdà]YhΔ)-No gateway available to°dONLNd†kYv‘*manage routing of packets°dONLNd∫yYÑú*to off-network°dONLNd…áYíí*
  8702. destinations.
  8703. °dONLNd◊òx§ˆ(¿ñ#define nameSyntaxErr
  8704. °dONLNdÌô,§N)¥-23041°dONLNdÙôY§n)-The 
  8705. °dONLNd¯òn§û)hostName
  8706. °dONLNdôû§“)0  field had a°dONLNd
  8707. ßY≤Œ(Œwsyntax error. The address°dONLNd'µY¿Ã*was given in dot notation°dONLNdA√YŒœ*(that is, W.X.Y.Z) and did°dONLNd\—Y‹—*not conform to the syntax°dONLNdvflYÍ™*for an IP address.
  8708. °dONLNdâx¸‰(ñ#define cacheFault
  8709. °dONLNdúÒ,¸N)¥-23042°dONLNd£ÒY¸≥)-The name specified°dONLNd∂ˇY
  8710. ¬*cannot be found in the°dONLNdÕ
  8711. YÕ*cache. The domain name°dONLNd‰Y&ƒ*resolver will now query°dONLNd¸)Y4«*the domain name server°dONLNd7YB»*and return the answer in°dONLNd,EYP…*the call-back procedure.
  8712. °dONLNdEVxb(~ñ#define noResultProc
  8713. °dONLNdZW,bN)¥-23043°dONLNdaWYbø)-No result procedure is°dONLNdxeYpπ*passed to the address°dONLNdésY~»*translation call when the°dONLNd®ÅYå»*resolver must be used to°dONLNd¡èYö•*find the address.
  8714. °dONLNd”†x¨(»ñ#define noNameServer
  8715. °dONLNd˰,¨N)¥-23044°dONLNdÔ°Y¨¬)-No name server can be°dONLNdØY∫√*found for the specified°dONLNdΩY»í* name string.
  8716. °dONLNd*Œx⁄Í(ˆñ#define authNameErr
  8717. °dONLNd>œ,⁄N)¥-23045°dONLNdEœY⁄«)-This domain name does°dONLNd[›YËÉ*
  8718. not exist.
  8719. °dONLNdfÓx˙ÿ(ñ#define noAnsErr
  8720. °dONLNdwÔ,˙N)¥-23046°dONLNd~ÔY˙Œ)-None of the known name°dONLNdï˝Y√*servers are responding.
  8721. °dONLNd≠xÃ(6ñ#define dnrErr
  8722. °dONLNdº,N)¥-23047°dONLNd√YÀ)-The domain name server°dONLNd⁄Y(Ω*has returned an error.
  8723. °dONLNdÒ.x:Í(Vñ#define outOfMemory
  8724. °dONLNd/,:N)¥-23048°dONLNd /Y:ƒ)-Not enough memory is°dONLNd!=YH∑*available to issue the°dONLNd8KYVÀ*needed DNR query or to°dONLNdOYYdº*build the DNR cache.,N Helvetica Narrow
  8725. (Ÿ<80
  8726. )$Chapter 6 / Miscellaneous Interfaces Ã:ÃÛˇ
  8727. ◊#ˇ ˇˇˇˇ#◊ 
  8728. d,N Helvetica Narrow
  8729. .°dONLNdÆ,+ÃHMiscellaneous types,Times
  8730. °dONLNd7ÆBÌ*DThis section describes types that are common to all the programmatic°dONLNdYEÆPC* interfaces in the MacTCP driver.,
  8731. Courier
  8732. °dONLNdzVÆb8*#define BYTES_16WORD  2°dONLNdíVDb¯)ñ/* bytes per 16 bit ip word */°dONLNd±dÆp8(åÃ#define BYTES_32WORD  4°dONLNd…dDp¯)ñ/* bytes per 32 bit ip word */°dONLNdËrÆ~8(öÃ#define BYTES_64WORD  8°dONLNdrD~¯)ñ/* bytes per 64 bit ip word */°dONLNdÑÆêJ(¨Ãtypedef unsigned char b_8;°dONLNd:Ñbê⁄)¥/* 8-bit quantity */°dONLNdOíÆûV(∫Ãtypedef unsigned short b_16;°dONLNdlíbû‡)¥/* 16-bit quantity */°dONLNddžƨP(»Ãtypedef unsigned long b_32;°dONLNdû†b¨‡)¥/* 32-bit quantity */°dONLNd¥≤Ææ,(⁄Ãtypedef b_32 ip_addr;°dONLNdÀ≤bæ)¥/* IP address is 32-bits */°dONLNdÁ¿ÆÃ&(ËÃtypedef b_16 ip_port°dONLNd¸“Æfi\*typedef struct ip_addrbytes {°dONLNd‡Ãψ+union {°dONLNd%ÓÍ˙&+
  8733. b_32 addr;°dONLNd2¸Í8*
  8734. char byte[4];°dONLNdB
  8735. Í*} a;°dONLNdHÃ$&(@Í} ip_addrbytes;°dONLNdX*Æ6D(RÃtypedef struct wdsEntry {°dONLNds8ÃDP+unsigned short length;°dONLNdä8bDÊ)ñ/* length of buffer */°dONLNd¢FÃR(nÍ char * ptr;°dONLNd∞FbRÏ)ñ/* pointer to buffer */°dONLNd…TÃ`(|Í } wdsEntry;°dONLNd’fÆrD(éÃtypedef struct rdsEntry {°dONLNdtÃÄP+unsigned short length;°dONLNdtbÄÊ)ñ/* length of buffer */°dONLNdÇÃé(™Í char * ptr;°dONLNd-ÇbéÏ)ñ/* pointer to buffer */°dONLNdFêÃú(∏Í } rdsEntry;°dONLNdR¢ÆÆn( Ã typedef unsigned long BufferPtr;°dONLNds¥Æ¿n* typedef unsigned long StreamPtr;
  8736. °dONLNdî–Æ›∏*3Internet Control Message Protocol report structures
  8737. °dONLNd»ËÆÛ˚*FIn TCP and UDP, the ASR routine can be called with an Internet Control°dONLNdˆÆ¯*EMessage Protocol (ICMP) message. This section describes the types and°dONLNdUÆF* structures of the ICMP messages.
  8738. °dONLNdvÆ!J*typedef enum ICMPMsgType {°dONLNdí#Ã/¬+)netUnreach, hostUnreach, protocolUnreach,°dONLNdΩ1Ã=¬*)portUnreach, fragReqd, sourceRouteFailed,°dONLNdÈ?ÃK¬*)timeExceeded, parmProblem, missingOption,°dONLNdMÃYV*lastICMPMsgType = 65535°dONLNd.[Ãg *} ICMPMsgType;
  8739. +√VMacTCPCommontypes
  8740. )q81 ÃpÃ)ˇ D◊#ˇ ˇˇˇˇ#◊ 
  8741. d,
  8742. Courier
  8743. .°dONLNd x,+ñHtypedef struct ICMPReport {°dONLNd.ñ:+StreamPtr streamPtr;°dONLNd3<ñH*ip_addr localHost;°dONLNdGJñV*ip_port localPort;°dONLNd[Xñd*ip_addr remoteHost;°dONLNdpfñr*ip_port remotePort;°dONLNdÖtñĸ*short reportType;°dONLNdòÇñéV* unsigned short optionalAddlInfo;°dONLNd∫êñúb*"unsigned long optionalAddlInfoPtr;°dONLNdfiûñ™‰*
  8744. } ICMPReport;,Times
  8745. °dONLNdÏ¥xø≠(€ñ?Refer to the section “UDP Asynchronous Notification Routine” in°dONLNd,¬xÕ‘*FChapter 3 and “TCP Asynchronous Notification Routine” in Chapter 4 for°dONLNds–x€X*1details on how the ICMP report structure is used.,N Helvetica Narrow
  8746. °dONLNd•ˆg( < GetMyIPAddr
  8747. °dONLNd±xª+ZGThis section describes how an application obtains the IP address of the°dONLNd˘x(æ*Cmachine on which it is running. GetMyIPAddr describes the parameter°dONLNd=+x6Ã*Jblock that makes the PBControl call that returns the IP address and subnet°dONLNdà9xDÆ*Fmask of the local host. The csCode for this call is 15, and the driver°dONLNdœGxR{*7reference number is returned from the Open Driver call.
  8748. °dONLNdXxd*#define ipctlGetAddr°dONLNdXd)ñ15°dONLNdX,d∂)/* csCode to get our IP°dONLNd>f,rh*
  8749. address */°dONLNdIxxÑ(†ñ#define IPParamBlockHeader°dONLNddx,Ñ2)¥\°dONLNdgÜñí(Æ¥struct QElem *qLink;°dONLNd|Ü,í2)ñ\°dONLNdîñ†fi(º¥ short qType;°dONLNdéî,†2)ñ\°dONLNdë¢ñƉ( ¥
  8750. short ioTrap;°dONLNd°¢,Æ2)ñ\°dONLNd§∞ñºÍ(ÿ¥Ptr ioCmdAddr;°dONLNdµ∞,º2)ñ\°dONLNd∏æñ (Ê¥ProcPtr ioCompletion;°dONLNdŒæ, 2)ñ\°dONLNd—Ãñÿ(Ù¥OSErr ioResult;°dONLNd‚Ã,ÿ2)ñ\°dONLNdÂ⁄ñÊ(¥StringPtr ioNamePtr;°dONLNd˙⁄,Ê2)ñ\°dONLNd˝ËñÙˆ(¥short ioVRefNum;°dONLNdË,Ù2)ñ\°dONLNdˆñˆ(¥short ioCRefNum;°dONLNd$ˆ,2)ñ\°dONLNd'ñfi(,¥ short csCode°dONLNd4x"ˆ(>ñstruct IPParamBlock {°dONLNdK$ñ0+IPParamBlockHeader;°dONLNd`$,0¬)ñ/* standard I/O header */°dONLNd{2ñ>(Z¥ip_addr ourAddress;°dONLNdê2,>§)ñ/* our IP address */°dONLNd¶@ñLˆ(h¥long ourNetMask;°dONLNd∏@,L™)ñ/* our IP net mask */°dONLNdœNñZ¢(v¥};
  8751. °dONLNd”dxo(ãñ"The IP address is returned in the 
  8752. °dONLNdıcoL)ò
  8753. ourAddress
  8754. °dONLNdˇdLoœ)< field and the subnet mask is°dONLNdrx}ø(ôñreturned in the 
  8755. °dONLNd-qø}˚)G
  8756. ourNetMask
  8757. °dONLNd7r˚})< field.
  8758. (Ÿ<82
  8759. )$Chapter 6 / Miscellaneous Interfaces Ã:ÃÛˇ
  8760. X◊#ˇ ˇˇˇˇ#◊ 
  8761. d,N Helvetica Narrow
  8762. .°dONLNdT-é+rI    ICMP echo,Times
  8763. °dONLNd
  8764. 8ÆCÌ+ZBThe ICMP echo request message allows a host to determine whether a°dONLNdMFÆQ
  8765. *Jremote host is operational without bringing up a protocol like TCP or UDP.°dONLNdòTÆ_*HICMP echo can also be used to determine the responsiveness of a network.°dONLNd·bÆmñ*1The following interface to ICMP echo is provided:,
  8766. Courier
  8767. °dONLNdsÆ,*#define ipctlEchoICMP°dONLNd)sDP)ñ17°dONLNd,ÖÆëP(≠Ã#define ipmplEchoTimeoutErr°dONLNdHÖbëÜ)¥-23035°dONLNdOóÆ£z(øÃ"typedef void (*ICMPEchoNotifyProc)°dONLNds•ñÄ+(struct ICMPParamBlock *iopb);
  8768. °dONLNdíªÆΔ    (‚ÃKThe following structure is used to make the PBControl call initiate an ICMP°dONLNdfi…Æ‘Ñ*0echo request. The destination address is in the 
  8769. °dONLNd»Ñ‘ú)÷dest
  8770. °dONLNd…ú‘˝) field, and the data to°dONLNd*◊Æ‚((˛Ãbe echoed is described by 
  8771. °dONLNdD÷(‚X)zwdsEntry
  8772. °dONLNdL◊X‚Á)0! in the data field. The specified°dONLNdnÂÆ    ( ÃItimeout indicates how long to wait for the echo reply. The icmpCompletion°dONLNd∏ÛÆ˛ı*Iroutine is called either at timeout or when a packet is returned from the°dONLNdÆ ¥*:remote site. When a timeout occurs, the result code in the
  8773. °dONLNd=Æ*ICMPParamBlock
  8774. °dONLNdK¸)T1 is icmpEchoTimeoutErr. When an ICMP echo returns°dONLNd}Æ(¸(DÃKsuccessfully, the time in ticks when the reply was received is contained in°dONLNd…+Æ6ø*the 
  8775. °dONLNdÕ*ø6) echoReplyIn
  8776. °dONLNdÿ+6)B9 field. The time in ticks when the request was dispatched°dONLNd9ÆD(`Ãis contained in the 
  8777. °dONLNd&8DY)WechoRequestOut
  8778. °dONLNd49YD˝)T$ field. The echoed data contains the°dONLNdYGÆRV(nÃ%data received in the response packet.°dONLNd\Æg‰*DYou can send options in an echo packet by filling the options field.°dONLNdƒjÆu
  8779. *GOptions must be well-formed (see RFC 791) and terminated on a long word°dONLNd xÆÉÌ*Gboundary. The length field specifies the length of the options field in°dONLNdTÜÆë˜*Ibytes. The icmpCompletion routine is called with the options field set if°dONLNdûîÆü*Joptions are found in the echo response packet. The userdata pointer can be°dONLNdÈ¢Æ≠º*;passed into the echo call and is returned unmodified in the°dONLNd%∞ƪ"*icmpCompletion routine.
  8780. °dONLNd=¡ÆÕ,*struct IPParamBlock {°dONLNdTœÃ€>+IPParamBlockHeader;°dONLNdi›Ãȸ*struct {°dONLNdtÎ͘8+
  8781. ip_addr dest;°dONLNdÑ˘Í>*wdsEntry data;°dONLNdïÍ>*short timeout;°dONLNd¶Í!2* Ptr options;°dONLNdµ#Í/Ä*unsigned short optLength;°dONLNd—1Í=∂*"ICMPEchoNotifyProc icmpCompletion;°dONLNdˆ?ÍKÜ*unsigned long userDataPtr;°dONLNdMÍY,* } IPEchoPB;°dONLNd [Ãgÿ(ÉÍ};
  8782. +ˆV    ICMP echo
  8783. )=83 ÃpÃ)ˇ∂◊#ˇ ˇˇˇˇ#◊ 
  8784. d,
  8785. Courier
  8786. .°dONLNd x,+ñHstruct ICMPParamBlock {°dONLNd.ñ:+IPParamBlockHeader;°dONLNd.<ñH*short params [11];°dONLNdBJñVΔ*struct {°dONLNdMX¥d\+unsigned long echoRequstOut;°dONLNdlf¥rP*unsigned long echoReplyIn;°dONLNdât¥ÄV*struct rdsEntry echoedData;°dONLNdßÇ¥é¸* Ptr options;°dONLNd∂ê¥úP*unsigned long userDataPtr;°dONLNd”û¥™*} icmpEchoInfo;°dONLNd‰¨ñ∏¢(‘¥};,N Helvetica Narrow(Ÿ<84
  8787. )$Chapter 6 / Miscellaneous Interfaces Ã:ÃÛˇÇ◊#ˇ ˇˇˇˇ#◊ 
  8788. d,N Helvetica Narrow
  8789. .°dONLNdATTù+rnAppendix°dONLNd    AÆT˝)Z    Constants,Times
  8790. °dONLNd™Æµ˛*cCThis appendix presents command codes, UDP asynchronous event codes,°dONLNdW∏Æ√€*>TCP asynchronous event codes, and reasons for TCP termination.
  8791. °dONLNdñ”Ƈ*
  8792. Command codes
  8793. °dONLNd§Îƈ·*    UDPCreate°dONLNdÆÎbˆn)¥20°dONLNd±˘Æ€( ÃUDPRead°dONLNdπ˘bn)¥21°dONLNdºÆÚ(.à UDPBfrReturn°dONLNd…bn)¥22°dONLNdÃÆ ‹(<ÃUDPWrite°dONLNd’b n)¥23°dONLNdÿ#Æ.Ê(JÃ
  8794. UDPRelease°dONLNd„#b.n)¥24°dONLNdÊ1Æ<(XÃ
  8795. UDPMaxMTUSize°dONLNdÙ1b<n)¥25°dONLNd˜?ÆJfl(fà   UDPStatus°dONLNd?bJn)¥26°dONLNdMÆX˙(tÃUDPMultiCreate°dONLNdMbXn)¥27°dONLNd[ÆfÙ(Çà UDPMultiSend°dONLNd#[bfn)¥28°dONLNd&iÆtÙ(êà UDPMultiRead°dONLNd3ibtn)¥29°dONLNd6wÆÇfl(ûà   TCPCreate°dONLNd@wbÇn)¥30°dONLNdCÖÆê˚(¨ÃTCPPassiveOpen°dONLNdRÖbên)¥31°dONLNdUìÆû¯(∫Ã
  8796. TCPActiveOpen°dONLNdcìbûn)¥32°dONLNdf°Æ¨Ÿ(»ÃTCPSend°dONLNdn°b¨n)¥34°dONLNdqØÆ∫˙(÷à TCPNoCopyRcv°dONLNd~Øb∫n)¥35°dONLNdÅΩÆ»(‰Ã TCPBfrReturn°dONLNdéΩb»n)¥36°dONLNdëÀÆ÷”(ÚÃTCPRcv°dONLNdòÀb÷n)¥37°dONLNdõŸÆ‰€(ÃTCPClose°dONLNd§Ÿb‰n)¥38°dONLNdßÁÆÚ›(ÃTCPAbort°dONLNd∞ÁbÚn)¥39°dONLNd≥ıÆ›(à   TCPStatus°dONLNdΩıbn)¥40°dONLNd¿Æ‰(*Ã
  8797. TCPRelease°dONLNdÀbn)¥42°dONLNdŒÆı(8Ã
  8798. TCPGlobalInfo°dONLNd‹bn)¥43
  8799. °dONLNdfl,Æ9V(UÃUDP asynchronous event codes
  8800. °dONLNd¸DÆO·* data arrival°dONLNd    DbOh)¥1°dONLNd RÆ](yÃICMP message received°dONLNd!Rb]h)¥2 ÃpÃ)ˇ‰◊#ˇ ˇˇˇˇ#◊ 
  8801. d,N Helvetica Narrow
  8802. .°dONLNdx,+ñHTCP asynchronous event codes,Times
  8803. °dONLNd7xBô*closing°dONLNd%7,B2)¥1°dONLNd'ExP≥(lñ ULP timeout°dONLNd3E,P2)¥2°dONLNd5Sx^£(zñ    terminate°dONLNd?S,^2)¥3°dONLNdAaxl´(àñ data arrival°dONLNdNa,l2)¥4°dONLNdPoxzÂ(ññurgent data outstanding°dONLNdho,z2)¥5°dONLNdj}xàÂ(§ñICMP message received°dONLNdÄ},à2)¥6
  8804. °dONLNdÇòx•
  8805. (¡ñReasons for TCP termination
  8806. °dONLNdû∞xª≥* remote abort°dONLNd´∞,ª2)¥2°dONLNd≠æx…æ(Âñnetwork failure°dONLNdΩæ,…2)¥3°dONLNdøÃx◊(Ûñsecurity/precedence mismatch°dONLNd‹Ã,◊2)¥4°dONLNdfi⁄xÂ≥(ñ ULP timeout°dONLNdÍ⁄,Â2)¥5°dONLNdÏËxÛ®(ñ    ULP abort°dONLNdˆË,Û2)¥6°dONLNd¯ˆxß(ñ    ULP close°dONLNdˆ,2)¥7°dONLNdx∏(+ñservice failure°dONLNd,2)¥8
  8807. (Ÿ<86
  8808. )Appendix / Constants Ã:ÃÛˇ