Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images ›...

36

Transcript of Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images ›...

Page 1: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming
Page 2: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Many of the designations used by manufacturers and sellers to distinguish their products are claimedas trademarks. Where those designations appear in this book, and Addison-Wesley, Inc. was aware ofa trademark claim, the designations have been printed with initial capital letters or in all capitals.

The authors and publisher have taken care in the preparation of this book, but make no expressed orimplied warranty of any kind and assume no responsibility for errors or omissions. No liability isassumed for incidental or consequential damages in connection with or arising out of the use of theinformation or programs contained herein.

The publisher offers discounts on this book when ordered in quantity for special sales. For moreinformation, please contact:

U.S. Corporate and Government Sales(800) [email protected]

Visit Addison-Wesley on the Web: www.awprofessional.com

Library of Congress Cataloging-in-Publication Data

Schmidt, Douglas C.C++ network programming / Douglas C. Schmidt, Stephen D. Huston.

p. cm.Includes bibliographical references and index.Contents: Vol. 1. Mastering complexity with ACE and patterns.ISBN 0-201-60464-7 (v. 1 : pbk.)1. C++ (Computer program language) 2. Object-oriented programming (Computer

science) 3. Computer networks. I. Huston, Stephen D. II. Title.

QA 76.73.C153 S368 2002005.2’762—dc21

2001053345

Copyright c© 2002 by Addison-Wesley

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, ortransmitted, in any form, or by any means, electronic, mechanical, photocopying, recording, orotherwise, without the prior consent of the publisher. Printed in the United States of America.Published simultaneously in Canada.

For information on obtaining permission for use of material from this work, please submit a writtenrequest to:

Pearson Education, Inc.Rights and Contracts Department75 Arlington Street, Suite 300Boston, MA 02116Fax: (617) 848-7047

ISBN 0-201-60464-7

Text printed in the United States at Offset Paperback Manufacturers in Laflin, Pennsylvania.

Printing 10th September 2009

Page 3: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Foreword

As I write this foreword I’m traveling through Europe, relying on the excel-lent European public transportation infrastructure. Being an American,I’m fascinated and amazed by this infrastructure. Wherever I land at anairport I have easy access to trains and buses that are fast, clean, reliable,on time, and perhaps most importantly, going directly to my destination.Departure and arrival announcements are available in multiple languages.Signs and directions are easy to follow, even for non-native speakers likeme.

I live and work in the Boston area, and like most Americans I rely almostentirely on my automobile to get from one place to the next. Except for anoccasional use of the Boston subway system, I use my car to get aroundbecause the public transportation infrastructure is too limited to get me tomy destination. Since millions of others in Boston and elsewhere are in thesame predicament, our highway infrastructure is now well past the pointof coping with the traffic volume. I know I’d be appalled if I knew exactlyhow much of my life I’ve wasted sitting in traffic jams.

There are some interesting similarities between networked computingsystems and transportation systems, the most significant of these be-ing that the success of both depends on scalable infrastructure. Scal-able transportation systems comprise not just obvious infrastructure ele-ments, such as trains and rails or airplanes and airports. They also requirescheduling, routing, maintenance, ticketing, and monitoring, for example,all of which must scale along with the physical transportation system it-self. Similarly, networked computing requires not only host machines andnetworks—the physical computing and communication infrastructure—

xi

Page 4: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

xii Foreword

but also software-based scheduling, routing, dispatching, configuration,versioning, authentication, authorization, and monitoring that allows thenetworked system to scale as necessary.

An ironic fact about infrastructure is that it’s extremely difficult to dowell, and yet the more transparent to the user it is, the more success-ful we consider it to be. Despite the rugged terrain of the Swiss Alps, forexample, a few architects, engineers, and builders have applied their ex-pertise to provide an efficient transportation system that millions of peoplein Switzerland use daily with ease. In fact, the system is so reliable andeasy to use that you quickly take it for granted, and it becomes transparentto you. For example, when boarding the Swiss railway your focus is simplyon getting from one point to another, not on the machinery used to getyou there. Unless you’re a tourist, you probably miss the fact that you’retraversing a tunnel that took years to design and build, or ascending anincline so steep that the railway includes a cog rail to help the train climb.The rail infrastructure does flawlessly what it’s supposed to do, and as aresult, you don’t even notice it.

This book is about infrastructure software, normally called middleware,for networked computing systems. It’s called middleware because it’s the“waist in the hourglass” that resides above the operating system and net-works, but underneath the application. Middleware comes in a wide va-riety of shapes, sizes, and capabilities, ranging from J2EE applicationservers, asynchronous messaging systems, and CORBA ORBs to softwarethat monitors sockets for small embedded systems. Middleware must sup-port an ever-wider variety of applications, operating systems, networkingprotocols, programming languages, and data formats. Without middle-ware, taming the ever-increasing diversity and heterogeneity in networkedcomputing systems would be tedious, error prone, and expensive.

Despite the variety of types of middleware, and the variety of issues thatmiddleware addresses, different types of middleware tend to use the samepatterns and common abstractions to master complexity. If you were topeek inside a scalable and flexible application server, messaging system,or CORBA ORB, for example, you would likely find that they employ sim-ilar techniques for tasks such as connection management, concurrency,synchronization, event demultiplexing, event handler dispatching, errorlogging, and monitoring. Just as the users of the Swiss railways far out-number those who designed and built it, the number of users of successfulmiddleware far exceeds the number of people who designed and built it. If

Page 5: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Foreword xiii

you design, build, or use middleware, your success depends on knowing,understanding, and applying these common patterns and abstractions.

While many understand the need for scalability and flexibility in mid-dleware, few can provide it as effectively as the ADAPTIVE Communica-tion Environment (ACE) that Doug Schmidt and Steve Huston describe inthis book. ACE is a widely used C++ toolkit that captures common pat-terns and abstractions used in a variety of highly successful middlewareand networked applications. ACE has become the basis for many net-worked computing systems, ranging from real-time avionics applicationsto CORBA ORBs to mainframe peer-to-peer communication support.

Like all good middleware, ACE hides the complexity of the diverse andheterogeneous environments beneath it. What sets ACE apart from mostother infrastructure middleware, however, is that even though it allows formaximum flexibility wherever needed by the application, it doesn’t degradethe performance or scalability of the system. Being a long-time middlewarearchitect myself, I know all too well that achieving both performance andflexibility in the same package is hard.

In a way, though, the flexibility and performance aspects of ACE don’tsurprise me. Due to my long-time association with Doug, I’m well awarethat he is a pioneer in this area. The wide variety of scalable, high-performing, and flexible middleware that exists today clearly bears hismark and influence. His teaming with Steve, who’s a gifted C++ devel-oper and author whose work on ACE has led to many improvements overthe years, has yielded a work that’s a “must read” for anyone involvedin designing, building, or even using middleware. The increasing perva-siveness of the World Wide Web and of interconnected embedded systemsmeans that the number, scale, and importance of networked computingsystems will continue to grow. It’s only through understanding the keypatterns, techniques, classes, and lessons that Doug and Steve describein this book that we can hope to supply the middleware infrastructure tomake it all transparent, efficient, and reliable.

Steve VinoskiChief Architect & Vice President, Platform TechnologiesIONA TechnologiesSeptember 2001

Page 6: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

CHAPTER 0

Design Challenges, MiddlewareSolutions, and ACE

CHAPTER SYNOPSIS

This chapter describes the paradigm shift that occurs when transitioningfrom stand-alone application architectures to networked application archi-tectures. This shift yields new challenges in two categories: those in theproblem space that are oriented to software architecture and design andthose in the solution space that are related to software tools and techniquesused to implement networked applications. This chapter first presents adomain analysis of design dimensions affecting the former category, andthe middleware that is motivated by and applied to the latter category.The chapter then introduces the ACE toolkit and the example networkedapplication that’s used to illustrate the solutions throughout this book.

0.1 Challenges of Networked Applications

Most software developers are familiar with stand-alone application archi-tectures, in which a single computer contains all the software componentsrelated to the graphical user interface (GUI), application service processing,and persistent data resources. For example, the stand-alone applicationarchitecture illustrated in Figure 0.1 consolidates the GUI, service process-ing, and persistent data resources within a single computer, with all pe-ripherals attached directly. The flow of control in a stand-alone applicationresides solely on the computer where execution begins.

1

Page 7: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

2 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

CD-ROM

PRINTER

FILESYSTEM

COMPUTER

Figure 0.1: A Stand-alone Application Architecture

In contrast, networked application architectures divide the applicationsystem into services that can be shared and reused by multiple applica-tions. To maximize effectiveness and usefulness, services are distributedamong multiple computing devices connected by a network, as shown inFigure 0.2. Common network services provided to clients in such envi-ronments include distributed naming, network file systems, routing tablemanagement, logging, printing, e-mail, remote login, file transfer, Web-based e-commerce services, payment processing, customer relationshipmanagement, help desk systems, MP3 exchange, streaming media, instantmessaging, and community chat rooms.

The networked application architecture shown in Figure 0.2 partitionsthe interactive GUI, instruction processing, and persistent data resourcesamong a number of independent hosts in a network. At run time, theflow of control in a networked application resides on one or more of thehosts. All the system components communicate cooperatively, transfer-ring data and execution control between them as needed. Interoperabil-ity between separate components can be achieved as long as compati-ble communication protocols are used, even if the underlying networks,operating systems, hardware, and programming languages are heteroge-neous [HV99]. This delegation of networked application service responsi-bilities across multiple hosts can yield the following benefits:

Page 8: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.1 Challenges of Networked Applications 3C

LIE

NT

S

REQUESTS

REPLIES

SERVICESNAMING

NFSLOGGINGPRINTING

E-COMMERCECHAT ROOMS

NETWORK

Figure 0.2: A Common Networked Application Environment

1. Enhanced connectivity and collaboration disseminates informa-tion rapidly to more potential users. This connectivity avoids the needfor manual information transfer and duplicate entry.

2. Improved performance and scalability allows system configurationsto be changed readily and robustly to align computing resources withcurrent and forecasted system demand.

3. Reduced costs by allowing users and applications to share expensiveperipherals and software, such as sophisticated database manage-ment systems.

Your job as a developer of networked applications is to understand the ser-vices that your applications will provide and the environment(s) availableto provide them, and then

1. Design mechanisms that services will use to communicate, both be-tween themselves and with clients.

Page 9: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

4 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

2. Decide which architectures and service arrangements will make themost effective use of available environments.

3. Implement these solutions using techniques and tools that eliminatecomplexity and yield correct, extensible, high-performance, low-main-tenance software to achieve your business’s goals.

This book provides the information and tools you need to excel at thesetasks.

Your job will not be easy. Networked applications are often much harderto design, implement, debug, optimize, and monitor than their stand-alonecounterparts. You must learn how to resolve the inherent and accidentalcomplexities [Bro87] associated with developing and configuring networkedapplications. Inherent complexities arise from key domain challenges thatcomplicate networked application development, including

Selecting suitable communication mechanisms and designing proto-cols to use them effectivelyDesigning network services that utilize the available computing re-sources efficiently and reduce future maintenance costsUsing concurrency effectively to achieve predictable, reliable, high per-formance in your systemArranging and configuring services to maximize system availabilityand flexibility.

Dealing with inherent complexity requires experience and a thorough un-derstanding of the domain itself. There are many design tradeoffs relatedto these inherent complexity issues that we will investigate in Chapters 1and 5.

Accidental complexities arise from limitations with tools and techniquesused to develop networked application software, including

The lack of type-safe, portable, and extensible native OS APIsThe widespread use of algorithmic decomposition, which makes it un-necessarily hard to maintain and extend networked applicationsThe continual rediscovery and reinvention of core networked applica-tion concepts and capabilities, which keeps software life-cycle costsunnecessarily high

Networked application developers must understand these challenges andapply techniques to deal with them effectively. Throughout this book weillustrate by example how ACE uses object-oriented techniques and C++language features to address the accidental complexities outlined above.

Page 10: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.2 Networked Application Design Dimensions 5

0.2 Networked Application Design Dimensions

It’s possible to learn programming APIs and interfaces without appreciat-ing the key design dimensions in a domain. In our experience, however,developers with deeper knowledge of networked application domain fun-damentals are much better prepared to solve key design, implementation,and performance challenges effectively. We therefore explore the core ar-chitectural design dimensions for networked application development first.We focus on servers that support multiple services, or multiple instancesof a service, and that collaborate with many clients simultaneously, similarto the networked application environment shown in Figure 0.2.

The design dimensions discussed in this book were identified by a thor-ough domain analysis based on hands-on design and implementation ex-perience with hundreds of production networked applications and sys-tems developed over the past decade. A domain analysis is an inductive,feedback-driven process that examines an application domain systemati-cally to identify its core challenges and design dimensions in order to mapthem onto effective solution techniques. This process yields the followingbenefits:

It defines a common vocabulary of domain abstractions, which en-ables developers to communicate more effectively with each other [Fow97].In turn, clarifying the vocabulary of the problem space simplifies the map-ping onto a suitable set of patterns and software abstractions in the solu-tion space. For example, a common understanding of network protocols,event demultiplexing strategies, and concurrency architectures allows usto apply these concepts to our discussions of wrapper facades, as well asto our discussions of ACE frameworks in [SH].

It enhances reuse by separating design considerations into two cat-egories:

1. Those that are specific to particular types of applications and2. Those that are common to all applications in the domain.

By focusing on common design concerns in a domain, application andmiddleware developers can recognize opportunities for adapting or build-ing reusable software class libraries. When the canonical control flowsbetween these class libraries are factored out and reintegrated, they canform middleware frameworks, such as those in ACE, that can reduce sub-sequent application development effort significantly. In a mature domain,

Page 11: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

6 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

SERVICE SERVICE

COMMUNICATION

CONCURRENCY

CONFIGURATION

Figure 0.3: Networked Application Design Dimensions

application-specific design considerations can be addressed systematicallyby extending and customizing existing middleware frameworks via object-oriented language features, such as inheritance, dynamic binding, param-eterized types, and exceptions.

Within the domain of networked applications, developers are faced withdesign decisions in each of the four dimensions depicted in Figure 0.3.These design dimensions are concerned mainly with managing inherentcomplexities. They are therefore largely independent of particular life-cycleprocesses, design methods and notations, programming languages, oper-ating system platforms, and networking hardware. Each of these designdimensions is composed of a set of relatively independent alternatives. Al-though mostly orthogonal to each other, changes to one or more dimen-sions of your networked application can change its “shape” accordingly.Design changes therefore don’t occur in isolation. Keep this in mind asyou consider the following design dimensions:

1. Communication dimensions address the rules, form, and level ofabstraction that networked applications use to interact.

2. Concurrency dimensions address the policies and mechanisms gov-erning the proper use of processes and threads to represent multipleservice instances, as well as how each service instance may use mul-tiple threads internally.

3. Service dimensions address key properties of a networked applica-tion service, such as the duration and structure of each service in-stance.

Page 12: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.3 Object-Oriented Middleware Solutions 7

4. Configuration dimensions address how networked services are iden-tified and the time at which they are bound together to form completeapplications. Configuration dimensions often affect more than oneservice, as well as the relationships between services.

We examine the first two dimensions in more depth in Chapters 1 and 5,respectively, while the third and fourth are discussed in [SH]. We illustratethe key vocabulary, design trade-offs, and solution abstractions first, fol-lowed by the platform capabilities related to each dimension, its associatedaccidental complexities, and the solutions provided by ACE, which evolvedover the past decade in response to these design dimensions. As you’ll see,the ACE toolkit uses time-proven object-oriented partitioning, interface de-sign, data encapsulation patterns, and C++ features to enable the designdimensions of your networked applications to vary as independently andportably as possible.

0.3 Object-Oriented Middleware Solutions

Some of the most successful techniques and tools devised to address acci-dental and inherent complexities of networked applications have centeredon object-oriented middleware, which helps manage the complexity andheterogeneity in networked applications. Object-oriented middleware pro-vides reusable service/protocol component and framework software thatfunctionally bridges the gap between

1. End-to-end application functional requirements and2. The lower-level operating systems, networking protocol stacks, and

hardware devices.

Object-oriented middleware provides capabilities whose qualities are crit-ical to help simplify and coordinate how networked applications are con-nected and how they interoperate.

0.3.1 Object-Oriented Middleware Layers

Networking protocol stacks, such as TCP/IP [Ste93], can be decomposedinto multiple layers, such as the physical, data-link, network, transport,session, presentation, and application layers defined in the OSI referencemodel [Bla91]. Likewise, object-oriented middleware can be decomposed

Page 13: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

8 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

APPLICATIONS

DOMAIN-SPECIFIC MIDDLEWARE SERVICES

COMMON MIDDLEWARE SERVICES

DISTRIBUTION MIDDLEWARE

HOST INFRASTRUCTURE MIDDLEWARE

OPERATING SYSTEMS & PROTOCOLS

HARDWARE DEVICES

HUD

Nav

WTSAVIONICS

REPLICATIONSERVICE

Cons

Cons

EVENTCHANNEL

Cons

Figure 0.4: Object-Oriented Middleware Layers in Context

into multiple layers [SS01], as shown in Figure 0.4. A common hierarchyof object-oriented middleware includes the layers described below:

Host infrastructure middleware encapsulates OS concurrency and inter-process communication (IPC) mechanisms to create object-oriented net-work programming capabilities. These capabilities eliminate many tedious,error-prone, and nonportable activities associated with developing net-worked applications via native OS APIs, such as Sockets or POSIX threads(Pthreads). Widely used examples of host infrastructure middleware in-clude Java Packages [AGH00] and ACE.

Distribution middleware uses and extends host infrastructure middlewarein order to automate common network programming tasks, such as con-

Page 14: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.3 Object-Oriented Middleware Solutions 9

nection and memory management, marshaling and demarshaling, end-point and request demultiplexing, synchronization, and multithreading.Developers who use distribution middleware can program distributed ap-plications much like stand-alone applications, that is, by invoking oper-ations on target objects without concern for their location, language, OS,or hardware [HV99]. At the heart of distribution middleware are ObjectRequest Brokers (ORBs), such as COM+ [Box97], Java RMI [Sun98], andCORBA [Obj01].

Common middleware services augment distribution middleware by defin-ing higher-level domain-independent services, such as event notification,logging, persistence, security, and recoverable transactions. Whereas dis-tribution middleware focuses largely on managing end-system resourcesin support of an object-oriented distributed programming model, commonmiddleware services focus on allocating, scheduling, and coordinating var-ious resources throughout a distributed system. Without common middle-ware services, these end-to-end capabilities would have to be implementedad hoc by each networked application.

Domain-specific middleware services satisfy specific requirements of par-ticular domains, such as telecommunications, e-commerce, health care,process automation, or avionics. Whereas the other object-oriented mid-dleware layers provide broadly reusable “horizontal” mechanisms and ser-vices, domain-specific services target vertical markets. From a “commer-cial off-the-shelf” (COTS) perspective, domain-specific services are the leastmature of the middleware layers today. This is due in part to the historicallack of middleware standards needed to provide a stable base upon whichto create domain-specific services.

Object-oriented middleware is an important tool for developing net-worked applications. It provides the following three broad areas of im-provement for developing and evolving networked applications:

1. Strategic focus, which elevates application developer focus beyonda preoccupation with low-level OS concurrency and networking APIs.A solid grasp of the concepts and capabilities underlying these APIsis foundational to all networked application development. However,middleware helps abstract the details away into higher-level, moreeasily used artifacts. Without needing to worry as much about low-

Page 15: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

10 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

level details, developers can focus on more strategic, application-centric concerns.

2. Effective reuse, which amortizes software life-cycle effort by lever-aging previous development expertise and reifying implementationsof key patterns [SSRB00, GHJV95] into reusable middleware frame-works. In the future, most networked applications will be assembledby integrating and scripting domain-specific and common “pluggable”middleware service components, rather than being programmed en-tirely from scratch [Joh97].

3. Open standards, which provide a portable and interoperable set ofsoftware artifacts. These artifacts help to direct the focus of develop-ers toward higher-level software application architecture and designconcerns, such as interoperable security, layered distributed resourcemanagement, and fault tolerance services. An increasingly importantrole is being played by open and/or standard COTS object-orientedmiddleware, such as CORBA, Java virtual machines, and ACE, whichcan be purchased or acquired via open-source means. COTS middle-ware is particularly important for organizations facing time-to-marketpressures and limited software development resources.

Although distribution middleware, common middleware services, anddomain-specific middleware services are important topics, they are nottreated further in this book for the reasons we explore in the next sec-tion. For further coverage of these topics, please see either http://ace.ece.uci.edu/middleware.html or Advanced CORBA Programming withC++ [HV99].

0.3.2 The Benefits of Host Infrastructure Middleware

Host infrastructure middleware is preferred over the higher middlewarelayers when developers are driven by stringent quality of service (QoS) re-quirements and/or cost containment. It’s also a foundational area for ad-vancing the state-of-the-art of middleware. These areas and their rationaleare discussed below.

Meeting stringent QoS requirements. Certain types of applicationsneed access to native OS IPC mechanisms and protocols to meet stringentefficiency and predictability QoS requirements. For example, multimedia

Page 16: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.3 Object-Oriented Middleware Solutions 11

applications that require long-duration, bidirectional bytestream commu-nication services are poorly suited to the synchronous request/responseparadigm provided by some distribution middleware [NGSY00]. Despitemajor advances [GS99, POS 00] in optimization technology, many con-ventional distribution middleware implementations still incur significantthroughput and latency overhead and lack sufficient hooks to manipulateother QoS-related properties, such as jitter and dependability.

In contrast, host infrastructure middleware is often better suited to en-sure end-to-end QoS because it allows applications to

Omit functionality that may not be necessary, such as omitting mar-shaling and demarshaling in homogeneous environmentsExert fine-grained control over communication behavior, such as sup-porting IP multicast transmission and asynchronous I/O andCustomize networking protocols to optimize network bandwidth us-age or to substitute shared memory communication in place of loop-back network communication

By the end of the decade, we expect research and development (R&D)on distribution middleware and common services will reach a point whereits QoS levels rival or exceed that of handwritten host infrastructure mid-dleware and networked applications. In the meantime, however, muchproduction software must be written and deployed. It’s within this con-text that host infrastructure middleware plays such an important role byelevating the level of abstraction at which networked applications are de-veloped without unduly affecting their QoS.

Cost containment. To survive in a globally competitive environment,many organizations are transitioning to object-oriented development pro-cesses and methods. In this context, host infrastructure middleware offerspowerful and time-proven solutions to help contain the costs of the inher-ent and accidental complexities outlined in Section 0.1, page 4.

For example, adopting new compilers, development environments, de-buggers, and toolkits can be expensive. Training software engineers can beeven more expensive due to steep learning curves needed to become profi-cient with new technologies. Containing these costs is important when em-barking on software projects in which new technologies are being evaluatedor employed. Host infrastructure middleware can be an effective tool forleveraging existing OS and networking experience, knowledge, and skills

Page 17: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

12 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

while expanding development to new platforms and climbing the learningcurve toward more advanced, cost-saving software technologies.

Advancing the state-of-the-practice by improving core knowledge. Asolid understanding of host infrastructure middleware helps developersidentify higher-level patterns and services so they can become more pro-ductive in their own application domains. There are many new technologychallenges to be conquered beyond today’s method- and message-orientedmiddleware technologies. Infrastructure middleware provides an impor-tant building block for future R&D for the following reasons:

Developers with a solid grasp of the design challenges and patternsunderlying host infrastructure middleware can become proficient withsoftware technology advances more rapidly. They can then catalyzethe adoption of more sophisticated middleware capabilities within ateam or organization.Developers with a thorough understanding of what happens “underthe covers” of middleware are better suited to identify new ways ofimproving their networked applications.

0.4 An Overview of the ACE Toolkit

The ADAPTIVE Communication Environment (ACE) is a widely used exam-ple of host infrastructure middleware. The ACE library contains 240,000lines of C++ code and 500 classes. The ACE software distribution alsocontains hundreds of automated regression tests and example applica-tions. ACE is freely available as open-source software and can be down-loaded from http://ace.ece.uci.edu/ or http://www.riverace.com.

To separate concerns, reduce complexity, and permit functional sub-setting, ACE is designed using a layered architecture [BMR 96], shownin Figure 0.5. The foundation of the ACE toolkit is its combination of OSadaptation layer and C++ wrapper facades [SSRB00], which encapsulatecore OS concurrent network programming mechanisms. The higher layersof ACE build upon this foundation to provide reusable frameworks, net-worked service components, and standards-based middleware. Together,these middleware layers simplify the creation, composition, configuration,and porting of networked applications without incurring significant perfor-mance overhead.

Page 18: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.4 An Overview of the ACE Toolkit 13

NETWORKEDSERVICE

COMPONENTSLAYER

FRAMEWORK LAYER

C++WRAPPERFACADELAYER

CAPIs

COMMUNICATIONSUBSYSTEM

VIRTUAL MEMORY & FILESUBSYSTEM

PROCESS/THREADSUBSYSTEM

PROCESSES/THREADS

WIN32 NAMEDPIPES & UNIX

STREAM PIPES

SOCKETS/TLI

UNIXFIFOS

SELECT/IO COMP

DYNAMICLINKING

SHAREDMEMORY

FILE SYSAPIS

OS ADAPTATION LAYER

SYNCHWRAPPERS

SPIPESAP

SOCK SAP/TLI SAP

FIFOSAP

PROCESS/THREAD

MANAGERS SERVICECONFIGU-

RATOR MEMMAP

SHAREDMALLOC

FILESAP

REACTOR/PROACTOR

STREAMS LOGMSG

CONNECTORCORBA

HANDLERACCEPTORSERVICEHANDLER

THE ACE ORB(TAO)

STANDARDS-BASED MIDDLEWARE

TOKENSERVER

TIMESERVER

GATEWAYSERVER

LOGGINGSERVER

NAMESERVER

JAWS ADAPTIVEWEB SERVER

GENERAL OPERATING SYSTEM SERVICES

Figure 0.5: The Layered Architecture of ACE

This book focuses on the ACE wrapper facades for native OS IPC andconcurrency mechanisms. The additional benefits of frameworks and acomprehensive description of the ACE frameworks are described in thesecond volume of C++ Network Programming [SH]. The remainder of thischapter outlines the structure and functionality of the various layers inACE. Section B.1.4 on page 263 describes the standards-based middleware(TAO [SLM98] and JAWS [HS99]) that’s based upon and bundled with ACE.

0.4.1 The ACE OS Adaptation Layer

The ACE OS adaptation layer constitutes approximately 10 percent of ACE(about 27,000 lines of code). It consists of a class called ACE_OS that con-tains over 500 C++ static methods. These methods encapsulate the native,C-oriented OS APIs that hide platform-specific details and expose a uni-

Page 19: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

14 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

form interface to OS mechanisms used by higher ACE layers. The ACE_OSadaptation layer simplifies the portability and maintainability of ACE andensures that only ACE developers—not applications developers—must un-derstand the arcane platform-specific knowledge underlying the ACE wrap-per facades. The abstraction provided by the ACE_OS class enables the useof a single source tree for all the OS platforms shown in Sidebar 1.

Sidebar 1: OS Platforms Supported by ACE

ACE runs on a wide range of operating systems, including:

PCs, for example, Windows (all 32/64-bit versions), WinCE; Redhat,Debian, and SuSE Linux; and Macintosh OS X;Most versions of UNIX, for example, SunOS 4.x and Solaris, SGI IRIX,HP-UX, Digital UNIX (Compaq Tru64), AIX, DG/UX, SCO OpenServer,UnixWare, NetBSD, and FreeBSD;Real-time operating systems, for example, VxWorks, OS/9, Chorus,LynxOS, Pharlap TNT, QNX Neutrino and RTP, RTEMS, and pSoS;Large enterprise systems, for example, OpenVMS, MVS OpenEdi-tion, Tandem NonStop-UX, and Cray UNICOS.

ACE can be used with all of the major C++ compilers on these platforms.The ACE Web site at http://ace.ece.uci.edu contains a complete,up-to-date list of platforms, along with instructions for downloading andbuilding ACE.

0.4.2 The ACE C++ Wrapper Facade Layer

A wrapper facade consists of one or more classes that encapsulate func-tions and data within a type-safe object-oriented interface [SSRB00]. TheACE C++ wrapper facade layer resides atop its OS adaptation layer andprovides largely the same functionality, as shown in Figure 0.5. Packagingthis functionality as C++ classes, rather than stand-alone C functions, sig-nificantly reduces the effort required to learn and use ACE correctly. TheACE wrapper facades are designed carefully to minimize or eliminate per-formance overhead resulting from its increased usability and safety. Theprinciples that guide ACE’s design are discussed in Appendix A.

Page 20: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.4 An Overview of the ACE Toolkit 15

ACE provides an extensive set of wrapper facades, constituting nearly50 percent of its total source base. Applications combine and refine thesewrapper facades by selectively inheriting, aggregating, and/or instantiat-ing them. In this book we show how the socket, file, concurrency, andsynchronization wrapper facades are used to develop efficient, portablenetworked applications.

0.4.3 The ACE Framework Layer

The remaining 40 percent of ACE consists of object-oriented frameworks,which are integrated sets of classes that collaborate to provide a reusablesoftware architecture for a family of related applications [FS97]. Object-oriented frameworks are a key to successful systematic reuse because theycomplement and amplify other reuse techniques, such as class libraries,components, and patterns [Joh97]. By emphasizing the integration andcollaboration of application-specific and application-independent classes,for example, the ACE frameworks enable larger-scale reuse of softwarethan is possible by reusing individual classes or stand-alone functions.The frameworks in ACE integrate and augment its C++ wrapper facadeclasses by applying advanced concurrency and network programming pat-terns [BMR 96, SSRB00] to reify the canonical control flow and collabora-tion among families of related classes in ACE.

The following ACE frameworks support the efficient, robust, and flexibledevelopment and configuration of concurrent networked applications andservices:

Event demultiplexing and dispatching frameworks. The ACE Reac-tor and Proactor frameworks implement the Reactor and Proactor pat-terns [SSRB00], respectively. The Reactor and Proactor frameworks auto-mate the demultiplexing and dispatching of application-specific handlersin response to various types of I/O-based, timer-based, signal-based, andsynchronization-based events.

Connection establishment and service initialization framework. TheACE Acceptor-Connector framework implements the Acceptor-Connectorpattern [SSRB00]. This framework decouples the active and passive ini-tialization roles from application processing performed by communicatingpeer services after initialization is complete.

Page 21: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

16 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

Concurrency framework. ACE provides the Task framework that can beused to implement key concurrency patterns [SSRB00, Lea99], such asActive Object and Half-Sync/Half-Async, which simplify concurrent pro-gramming by decoupling method execution from method invocation anddecoupling asynchronous and synchronous processing, respectively.

Service configurator framework. This framework implements the Com-ponent Configurator pattern [SSRB00] to support the configuration of appli-cations whose services can be assembled dynamically late in their designcycle, for example, at installation time. It also supports the dynamic re-configuration of services in an application at run time.

Streams framework. This framework implements the Pipes and Filterspattern [BMR 96], wherein each processing step is encapsulated in a fil-tering module that can access and manipulate data flowing through thestream of modules. The ACE Streams framework simplifies the develop-ment of hierarchically layered services that can be composed flexibly tocreate certain types of networked applications, such as user-level protocolstacks and network management agents [SS94].

An in-depth discussion of the motivation, design, and use of the frame-works in ACE appears in C++ Network Programming: Systematic Reusewith ACE and Frameworks [SH]. Additional information on the ACE wrap-per facades and frameworks is also available in The ACE Programmer’sGuide [HJS].

0.4.4 The ACE Networked Service Components Layer

In addition to its host infrastructure middleware wrapper facades andframeworks previously described, ACE also provides a library of networkedservices that are packaged as components. A component is an encapsu-lated part of a software system that implements a specific service or set ofservices [Szy98]. Although these components aren’t included in the ACE li-brary itself, they are bundled with the ACE software distribution to providethe following capabilities:

Demonstrate common uses of ACE capabilities—The componentsdemonstrate how key ACE frameworks and classes can be used todevelop flexible, efficient, and robust networked services.

Page 22: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.5 Example: A Networked Logging Service 17

Factor out reusable networked application building blocks—Thesecomponents provide reusable implementations of common networkedapplication services, such as naming, event routing [Sch00], logging,time synchronization [SSRB00], and network locking.

0.5 Example: A Networked Logging Service

Throughout this book we use a running example of a networked loggingservice to help illustrate key points and ACE capabilities. This servicecollects and records diagnostic information sent from one or more clientapplications. It’s a departure from the usual way of logging to a WindowsNT/2000 event log, which is not available on Windows 95 or 98. If you’rean experienced UNIX programmer, however, you may be thinking this is awaste of time since SYSLOGD provides this type of service already. Yet thisunderscores a key benefit of the logging service: it’s portable, so applica-tions can log messages on all platforms that ACE supports.

The logging service example is a microcosm of the actual Logging Ser-vice in ACE. ACE’s logging service can be configured dynamically via theComponent Configurator pattern [SSRB00] and ACE Service Configuratorframework [SH]. By applying the Adapter pattern [GHJV95], records canbe redirected to a UNIX SYSLOGD or to the Windows NT/2000 event log,or both—even if the initiating application is on another type of OS plat-form. This book’s logging service example is purposely scaled back so wecan focus on mastering complexity. Figure 0.6 illustrates the applicationprocesses and server in our networked logging service. Below, we outlinethe key entities shown in Figure 0.6.

Client application processes run on client hosts and generate log recordsranging from debugging messages to critical error messages. The logginginformation sent by a client application indicates the following:

1. The time the log record was created

2. The process identifier of the application

3. The priority level of the log record and

4. A string containing the logging message text, which can vary in sizefrom 0 to a configurable maximum length, such as 4K bytes.

Page 23: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

18 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

Oct 31 14:48:13 [email protected]@38491@7@client::unable to fork in function spawnOct 31 14:50:28 [email protected]@18352@2@drwho::sending request to server tango

TCP CONNECTION

NETWORK

STORAGE DEVICE

LoggingServer

TCP CONNECTION

if (Options::instance ()–>debug()) ACE_DEBUG ((LM_DEBUG, “sending request to server %s", server_host));

int spawn (void){ if (ACE_OS::fork () ==-1) ACE_ERROR (LM_ERROR, "unable to fork in function spawn");

CONSOLE

CLIENT

CLIENT

LoggingClient

LoggingClient

SERVER

Figure 0.6: Participants in the Networked Logging Service

Logging servers collect and output log records received from client ap-plications. A logging server can determine which client host sent eachmessage by using addressing information it obtains from the Socket API.There’s generally one logging server per system configuration, though theycan be replicated to enhance fault tolerance.

Throughout the book, we refer to the networked logging service to makeour discussion of domain analysis dimensions for networked applicationsmore concrete. The architecture of our logging service is driven by thisdomain analysis. Just as real products change in scope as they progressthrough their life cycles, the logging service’s design, functionality, scal-ability, and robustness will evolve as we progress through this book and[SH]. We’ll continue developing this service incrementally to show solu-

Page 24: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Section 0.6 Summary 19

tions to common design challenges using many key patterns implementedby classes in ACE. Sidebar 2 describes how to build the ACE library so thatyou can experiment with the examples we present in this book.

Sidebar 2: Building ACE and Programs that Use ACE

ACE is open-source software, so you can download it from http://ace.ece.uci.edu and build it yourself. Here are some tips to help youunderstand the source examples we show, and how to build ACE, theexamples, and your own applications:

Install ACE in an empty directory. The top-level directory in the dis-tribution is named ACE_wrappers. We refer to this top-level direc-tory as $ACE_ROOT. Create an environment variable by that namecontaining the full path to the top-level ACE directory.The ACE source and header files reside in $ACE_ROOT/ace.The source and header files for this book’s networked logging ser-vice examples reside in $ACE_ROOT/examples/C++NPv1.When compiling your programs, the $ACE_ROOT directory must beadded to your compiler’s file include path, which is often desig-nated by the -I or /I compiler option.The $ACE_ROOT/ACE-INSTALL.html file contains complete in-structions on building and installing ACE and programs that useACE.

You can also purchase a prebuilt version of ACE from Riverace at anominal cost. A list of the prebuilt compiler and OS platforms supportedby Riverace is available at http://www.riverace.com.

0.6 Summary

This chapter described the challenges of developing networked applicationsand middleware that can run effectively in distributed computing environ-ments. We introduced the inherent and accidental complexities encoun-tered when developing software ranging from tightly constrained real-timeand embedded systems [SLM98] to newly evolving middleware abstrac-tions [MSKS00] and next-generation networked applications [SKKK00] with

Page 25: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

20 CHAPTER 0 Design Challenges, Middleware Solutions, and ACE

stringent QoS requirements. We presented a taxonomy of middleware lay-ering, emphasizing the benefits of host infrastructure middleware, whichis the focus of this book.

This chapter also introduced the results of a domain analysis of the keydesign dimensions for networked application architectures. These weregrouped into four categories:

1. Communication protocols and mechanisms2. Concurrency architectures3. Service architectures and4. Service configuration strategies.

This domain analysis has been refined while developing hundreds of net-worked applications and middleware components during the past decade.This analysis also guided the development of the ACE concurrent networkprogramming toolkit. ACE exemplifies the principles and benefits gainedthrough refactoring [FBB 99] the recurring structure and behavior of net-worked applications into host infrastructure middleware. ACE’s pattern-oriented software architecture constitutes an industrial-strength exampleof how proper object-oriented design and C++ usage can yield significantimprovements in your development schedules and the quality, flexibility,and performance of your networked applications and middleware.

Finally, we introduced the networked logging service, which stores di-agnostic information sent from one or more client applications. We usethis example throughout the book to illustrate common design problemsand their effective solutions using ACE. The next two parts of the book areorganized as follows:

Part I—Chapters 1 through 4 outline communication design alter-natives and describe the object-oriented techniques used in ACE toprogramming OS IPC mechanisms effectively.Part II—Chapters 5 through 10 outline concurrency design alterna-tives and describe the object-oriented techniques used in ACE to pro-gram OS concurrency mechanisms effectively.

Throughout both parts of the book, we illustrate common problems thatarise when developers design networked applications and when they pro-gram them using native OS IPC and concurrency APIs directly. We alsoshow how ACE applies object-oriented design techniques, C++ features,and patterns to resolve these problems.

Page 26: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

Index

Abstract types, 30accept(), 65, 66Acceptor-Connector pattern, 15Acceptors, nonblocking, 145ACE (ADAPTIVE Communication

Environment), 8, 12–17building, 19C++ wrapper facade layer, 14–15displaying classes, 50downloading, 12evolution of, 259–267framework layer, 15–16future for, 267–268layered architecture of, 12, 13network services, 16–17OS adaptation layer, 13–14web site for, 14

ACE::read_n(), 76ACE::select(), 141, 151–152ACE::write_n(), 76ACE_Addr, 49–52

hash(), 51operator!=(), 51operator==(), 51

ACE_Atomic_Op, 221ACE_Condition_Thread_Mutex,

208, 229–230broadcast(), 229signal(), 229

wait(), 229ACE_const_cast, 176ACE_Data_Block, 72ACE_DEBUG, 93ACE_dynamic_cast, 176ACE_ERROR, 93ACE_ERROR_RETURN, 92, 93ACE_FILE_Connector, 85ACE_FILE_IO, 85ACE_Guard, 208–212, 216–217ACE_Handle_Set, 140–147

clr_bit(), 143fdset(), 143is_set(), 143max_set(), 143num_set(), 143reset(), 143set_bit(), 143sync(), 143

ACE_Handle_Set_Iterator, 140,147–151

operator(), 148ACE_Hash_Map_Manager, 154, 155ACE_INET_Addr, 49–52

addr_to_string(), 52get_host_name(), 52get_port_number(), 52string_to_addr(), 52

ACE_InputCDR, 76–80

295

Page 27: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

296 INDEX

good_bit(), 78operator>>(), 78steal_contents(), 78

ACE_IPC_SAP, 52–53disable(), 53, 62enable(), 53, 62get_handle(), 53set_handle(), 53

ACE_Log_Msg::log(), 93ACE_Mem_Map, 66ACE_Message_Block, 72–76

clone(), 74clr_flags(), 74copy(), 74duplicate(), 74length(), 74msg_priority(), 74msg_type(), 74next(), 74prev(), 74rd_ptr(), 74release(), 74set_flags(), 74size(), 74total_length(), 74wr_ptr(), 74

ACE_Message_Queue, 72ACE_Null_Condition, 208, 230–231ACE_Null_Mutex, 208, 212–217ACE_Null_Semaphore, 208, 222–229ACE_Object_Manager, 217–218ACE_OutputCDR, 76–80

begin(), 78end(), 78good_bit(), 78operator<<(), 78total_length(), 78

ACE_Process, 160–165child(), 163exit_code(), 162getpid(), 162kill(), 163

parent(), 163prepare(), 162spawn(), 162terminate(), 162unmanage(), 162wait(), 162

ACE_Process_Manager, 160, 182close(), 170instance(), 170open(), 170spawn(), 170spawn_n(), 170wait(), 170

ACE_Process_Manager, 169ACE_Process_Mutex, 208, 212–217ACE_Process_Options, 160,

165–169avoid_zombies(), 168creation_flags(), 168set_process_attributes(),

168command_line(), 167pass_handle(), 167set_handles(), 167setenv(), 167seteuid(), 168setruid(), 168working_directory(), 167

ACE_Process_Semaphore, 208,222–229

ACE_Read_Guard, 208–212, 219–221ACE_Recursive_Thread_Mutex,

231–233ACE_reinterpret_cast, 176ACE_RW_Process_Mutex, 208,

219–221ACE_RW_Thread_Mutex, 208,

219–221ACE_Sched_Params, 186, 198–201

next_priority(), 199prev_priority(), 199priority_max(), 199

Page 28: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

INDEX 297

priority_min(), 199ACE::select(), 140ACE_SOCK, 54–55

close(), 55get_local_addr(), 55get_option(), 55get_remote_addr(), 55, 85, 88open(), 55set_option(), 55

ACE_SOCK_Acceptor, 64–67accept(), 66open(), 66

ACE_SOCK_Connector, 56–60complete(), 58connect(), 58

ACE_SOCK_IO, 60–64ACE_SOCK_Stream, 60–64

recv(), 62recv_n(), 62recvv_n(), 62send(), 62send_n(), 62sendv_n(), 62

ACE_static_cast, 176ACE_Task, 205ACE_Thread_Manager, 186–198

cancel_all(), 189close(), 189exit(), 189instance(), 189join(), 189spawn(), 189spawn_n(), 189testcancel(), 189wait(), 189

ACE_Thread_Mutex, 208, 212–217ACE_Thread_Semaphore, 208,

222–229ACE_Time_Value, 58, 62ACE_TSS, 186, 187, 201–205

cleanup(), 203operator->(), 203

ACE_Write_Guard, 208–212,219–221

Active Object, 205Active Object pattern, 16, 133addr_to_string(), 52Address family, 37Arrays of primitive types, 77Asynchronous I/O, 108Asynchronous message exchange,

synchronous versus, 26–28avoid_zombies(), 168

Barrier synchronization, 197begin(), 78Blocking, 56, 58, 61, 62, 65broadcast(), 229

C++ code, displaying, 50C++ iostreams, 76C++ wrapper facade layer, 14cancel_all(), 189Casts, 176child(), 163cleanup(), 203clone(), 74close(), 55, 170, 189clr_bit(), 143clr_flags(), 74COM+, 9command_line(), 167Commercial off-the-shelf (COTS), 9,

10Common middleware services layer,

role of, 9Communication design

connectionless versusconnection-oriented protocols,23–26

message passing versus sharedmemory, 28–31

synchronous versusasynchronous messageexchange, 26–28

Page 29: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

298 INDEX

Communication dimensions, 6Communication domain, 36complete(), 58Component, 16Component Configurator Pattern,

16–17Concrete class, 30Concurrency design, 6

concurrent servers, 105–106iterative servers, 103–105limitations with OS, 135–136process/thread spawning

strategies, 112–114processes versus threads,

109–112reactive servers, 106–108real-time scheduling, 119–121task- versus message-based

architectures, 121–122threading models, 114–119time-shared scheduling, 119–121

Concurrency framework, 15Concurrent servers, 105–106Condition variables, 133–134Configuration dimensions, 6connect(), 56, 58Connection establishment and

termination, Socket API, 35Connection establishment

framework, 15Connectionless versus

connection-oriented protocols,23–26

const_cast, 176Container classes, 155Contention scope, 114Cooperative cancelation, 190–191,

197copy(), 74CORBA, 9, 29

Common Data Representation(CDR), 77

Cost containment, 11CreateProcess(), 109, 161CreateThread(), 110, 129creation_flags(), 168CreateProcess(), 128

Data framing strategies, 24Data transfer mechanism, Socket

API, 35Data-mode socket, 56Deadlocks, 107Debugging macros, 93Demarshaling, 9, 11, 76–77dequeue_head(), 227–228Descriptor, see Handlesdisable(), 53, 62Dispatching framework, 15Distributed shared memory (DSM),

30–31Distribution middleware, role of, 8–9Domain analysis, 5Domain-crossing penalty, 91Domain-specific middleware services

layer, role of, 9Double-Checked Locking

Optimization pattern, 191,192, 203

duplicate(), 74dynamic_cast, 176

Eager spawning, 112echo_server(), 237echo_server, 37–38Efficiency issues, 46enable(), 53, 62end(), 78Endpoints, 34enqueue_tail(), 226–227errno, 130, 202Error macros, 93Error propagation strategies, 137Escape hatches, 237–238Event demultiplexing framework, 15

Page 30: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

INDEX 299

synchronous, 125–127Event loops, 125exit(), 111, 128, 189exit_code(), 162ExitProcess(), 111, 128ExitThread(), 129

FD_CLR(), 127FD_ISSET(), 127FD_SET(), 127fd_set, 126, 141–143, 148–150FD_ZERO(), 127fdset(), 143First-in, first-out (FIFO), 120, 198for loop, 147fork(), 109, 128, 161, 164Framework layer, 15–16

get_handle(), 53, 238get_host_name(), 52get_local_addr(), 55get_option(), 55get_port_number(), 52get_remote_addr(), 55, 85, 88gethostbyname(), 84getpid(), 162GetThreadPriority(), 130good_bit(), 78

Half-Sync/Half-Async pattern, 16,112, 206

handle_connections(), 84, 91, 93,156

handle_connections, 177–179handle_data(), 84, 91, 94, 146,

156–157, 196–197Handles, 34

errors and, 37–40hash(), 51Hook methods, Logging_Server,

83–84Host infrastructure middleware

layer, role of, 8, 10–13

Hybrid-threading model, 116–117

instance(), 170, 189Internet Protocol (IP), 24Interprocess communication (IPC),

local and remote, 33iovec structure, 63is_set(), 143Iterative servers, 103–105Iterative_Logging_Server, 91–95Iterator pattern, 148

Java Packages, 8Java RMI, 9JAWS, 265Jitter, 11join(), 189

Kernel-threading model, 115–116kill(), 161, 163

Last-in, first-out (LIFO), 218Leader/Followers pattern, 112length(), 74Lightweight processes (LWPs),

116–117Linearization, 76Local context management, Socket

API, 35Local shared memory, 29Lock-step sequence, 27Locking, 203, 210–212, 218–224log_record(), 91Logging service

asynchronous request/responseprotocol, 28

client application, 95–98example of, 17–19initial, 80–95message framing protocol, 86message passing, 31TCP/IP connection, 25

Logging service, implementing

Page 31: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

300 INDEX

ACE_InputCDR, 72–80ACE_OutputCDR, 76–80

Logging_Client::send(), 95–97Logging_Handler, 86–91

log_record(), 91recv_log_record(), 87–90write_log_record(), 90–91

Logging_Process, 180–182Logging_Server, 81–86

handle_connections(), 84, 91handle_data(), 84, 91hook methods, 83–84make_log_file(), 85–86open(), 83–84run(), 83wait_for_multiple_events(),

84

Macrosdebugging and error, 93guard, 216

main(), 94, 157make_log_file(), 85–86, 92, 156Marshaling, 9, 11, 76–77max_set(), 143Memory management unit (MMU),

109Memory-mapped files, 29–30Message exchange, synchronous

versus asynchronous, 26–28Message passing versus shared

memory, 28–31Message(s)

composite, 73framing protocol, 86simple, 73

Message-based concurrencyarchitecture, 121–122

Message-oriented middleware(MOM), 29

Message_Queue, 223–229Microsoft Windows, 34Middleware standards, 263–264

Monitor Object pattern, 133, 224msg_priority(), 74msg_type(), 74Multiplexing connections, 24–25Multiprocessing

advantages and disadvantages of,109–110

mechanisms, 127–128spawning strategies, 112–114

Multiprocessing wrapper facadesACE_Process, 161–165ACE_Process_Manager, 169–182ACE_Process_Options, 165–169overview of, 159–161

Multithreadingadvantages and disadvantages of,

110–112mechanisms, 129–130models, 114–119spawning strategies, 112–114

Multithreading wrapper facadesACE_Sched_Params, 186,

198–201ACE_Thread_Manager, 186–198ACE_TSS, 186, 187, 201–205overview of, 185–187

Mutual exclusion (mutex) locks, seealso ACE_Condition_Thread_Mutex, ACE_Null_Mutex,ACE_Process_Mutex,ACE_RW_Process_Mutex,ACE_RW_Thread_Mutex, andACE_Thread_Mutex, 105, 132,134

N:1 user-threading model, 114–115N:M hybrid-threading model,

116–117Nagle’s algorithm, 55, 63, 64Network addressing, Socket API, 36Network services, library of, 16–17Networked applications

challenges of, 1–4

Page 32: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

INDEX 301

design dimensions, 5–7example of, 2–3

next(), 74next_priority(), 199Nonblocking, 56, 58, 61, 62, 65Nonmultiplexing connections, 25num_set(), 143

Object Lifetime Manager pattern,218

Object Request Brokers (ORBs), 9Object, differences between a thread

and an, 194Object-oriented middleware

benefits of host infrastructure,10–13

layers, 7–10role of, 7, 9–10

On-demand spawning, 1131:1 kernel-threading model, 115–116open(), 55, 66, 155, 170

Logging_Server, 83–84, 92operator!=(), 51operator(), 148operator->(), 203operator<<(), 78–79operator==(), 51operator>>(), 78–80Options management, Socket API, 36OS adaptation layer, 13–14

parent(), 163pass_handle(), 167Passive-mode socket, 56Pattern

Acceptor-Connector, seeAcceptor-Connector pattern

Active Object, see Active Objectpattern

Component Configurator, seeComponent Configuratorpattern

Double-Checked LockingOptimization, seeDouble-Checked LockingOptimization pattern

Half-Sync/Half-Async, seeHalf-Sync/Half-Async pattern

Iterator, see Iterator patternLeader/Followers, see

Leader/Followers patternMonitor Object, see Monitor

Object patternObject Lifetime Manager, see

Object Lifetime Managerpattern

Pipes and Filters, see Pipes andFilters pattern

Proactor, see Proactor frameworkReactor, see Reactor frameworkSingleton, see Singleton patternThread-Safe Interface, see

Thread-Safe Interface patternWrapper Facade, see Wrapper

Facade patternPEER_ADDR, 57PEER_STREAM, 57Pipes and Filters pattern, 16poll(), 126Portability, 46, 52, 135, 136, 152,

164, 176lack of, Socket API, 41–43

Ports, ephemeral, 51POSIX, 161, 163prepare(), 162prev(), 74prev_priority(), 199Primitive types, 77

arrays of, 77printf(), 93Priority inversion, 25priority_max(), 199priority_min(), 199Proactive servers, 108

Page 33: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

302 INDEX

Proactor framework, 15Process, see also Multiprocessing

contention scope, 114lifetime operations, 128pool, 106property operations, 128synchronization operations, 128

Process-per-connection, 171–180Protocol stacks, 7Protocols

connectionless versusconnection-oriented, 23–26

defined, 23family, 36

pthread_cancel(), 129, 187pthread_create(), 110, 129pthread_exit(), 129pthread_getschedparam(), 130pthread_getspecific(), 130pthread_join(), 129pthread_key_create(), 130pthread_kill(), 188pthread_setschedparam(), 130pthread_setspecific(), 130pthread_testcancel(), 187

Quality of service (QoS)requirements, 10–11

Race conditions, 130–132rd_ptr(), 74Reactive servers, 106–108Reactor framework, 15read_n(), 76Readers/writer locks, 132–133Real-time scheduling, 119–121recv(), 56, 62recv_log_record(), 87–90recv_n(), 62recvv_n(), 62reinterpret_cast, 176release(), 74

Request/response protocols,asynchronous andsynchronous, 26–28

reset(), 143Reuse, 10Round-robin, 120, 198–199RPC, 29run(), 83, 173, 174run_master(), 174–175run_svc(), 194–196run_worker(), 175–176

Scheduler activations, 116Scoped Locking, 203, 210–212, 224select(), 107, 126–127, 140,

151–152Semantic variations, 187Semaphores, see also

ACE_Null_Semaphore,ACE_Process_Semaphore, andACE_Thread_Semaphore, 105,133–134

send(), 56, 62send_n(), 62sendv_n(), 62Serialization, 30Service configurator framework,

16–17Service dimensions, 6Service initialization framework, 15set_bit(), 143set_flags(), 74set_handle(), 53, 238set_handles(), 167set_option(), 55set_process_attributes(), 168setenv(), 167seteuid(), 168setruid(), 168SetThreadPriority(), 130Shared memory

C++ objects and, 30distributed, 30–31

Page 34: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

INDEX 303

local, 29–30message passing versus, 28–31

signal(), 229Singleton pattern, 191, 192size(), 74Sleep locks, 133sockaddr, 49Socket API

address family, 37Connection establishment and

termination, 35Data transfer mechanisms, 35limitations of, 37–43local context management, 35network addressing, 36nonportable and nonuniform,

41–43options management, 36protocol family, 36role of, 34

Socket wrapper facadesACE_Addr, 49–52ACE_INET_Addr, 49–52ACE_IPC_SAP, 52–53ACE_SOCK, 54–55ACE_SOCK_Acceptor, 64ACE_SOCK_Connector, 56–60ACE_SOCK_IO, 60–64ACE_SOCK_Stream, 60–64benefits of, 46overview of, 45–49relationships between, 47structure of, 46using traits for, 57

Sockets, 34spawn(), 162, 170, 189spawn_n(), 170, 189Spawning

of threads, 195of worker processes, 175, 178strategies for processes and

threads, 112–114

Spin locks, 132Stand-alone applications, example

of, 2Standards, open, 10static_cast, 176steal_contents(), 78Strategic focus, 9Strategized Locking pattern, 215Streams framework, 16string_to_addr(), 52structtimeval, 127sync(), 143Synchronization mechanisms,

130–134Synchronization wrapper facades

ACE_Condition_Thread_Mutex,208, 229–230

ACE_Guard, 208–212, 216–217ACE_Null_Condition, 208,

230–231ACE_Null_Mutex, 208, 212–217ACE_Null_Semaphore, 208,

222–229ACE_Process_Mutex, 208,

212–217ACE_Process_Semaphore, 208,

222–229ACE_Read_Guard, 208–212,

219–221ACE_Recursive_Thread_Mutex,

231–233ACE_RW_Process_Mutex, 208,

219–221ACE_RW_Thread_Mutex, 208,

219–221ACE_Thread_Mutex, 208,

212–217ACE_Thread_Semaphore, 208,

222–229ACE_Write_Guard, 208–212,

219–221overview of, 207–209

Page 35: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

304 INDEX

Synchronous event demultiplexing,125–127

Synchronous event demultiplexing,wrapper facades

ACE::select(), 141, 151–152ACE_Handle_Set, 141–147ACE_Handle_Set_Iterator,

147–151ACE_Handle_Set, 140ACE_Handle_Set_Iterator, 140overview of, 139–141

Synchronous versus asynchronousmessage exchange, 26–28

Syntactic variations, 187System contention scope, 114System V STREAMS, 73System V UNIX shared memory, 29

TAO, 264–265Task, 205Task framework, 15Task-based concurrency

architecture, 121Template method,

Logging_Server::run(), 83terminate(), 162TerminateProcess(), 128, 161TerminateThread(), 129testcancel(), 189THR_DETACHED, 190THR_JOINABLE, 190thr_kill(), 188THR_NEW_LWP, 190THR_SCOPE_PROCESS, 190THR_SCOPE_SYSTEM, 190Thread, see also Multithreading

difference between an object anda, 194

lifetime operations, 129pool, 106property operations, 130spawning of, 195specific storage, 130

synchronization operations, 129Thread-per-connection, 106,

191–198Thread-per-request concurrent

server, 105–106Thread-Safe Interface pattern, 224,

226Thread-specific storage (TSS), see

also ACE_TSS, 130Timed socket operations, 56, 58,

60–62, 65Timeouts, 62–64, 152timeval, 127TlsAlloc(), 130TlsGetValue(), 130TlsSetValue(), 130total_length(), 74, 78TP4, 24Traits, 57Transmission Control Protocol (TCP),

24–26TSS, see Thread-specific storageType errors, 46

UNIX, 34, 35, 161, 163unmanage(), 162User Datagram Protocol (IP), 24User-threading model, 114–115

Virtual methods, 30

wait(), 128, 162, 170, 189, 229wait_for_multiple_events(), 84,

93, 144–145, 155–156WaitForMultipleObjects(), 107,

126, 128, 129, 161WaitForSingleObject(), 128, 129,

161waitpid(), 128, 161Wildcard, 51Win32, 161working_directory(), 167wr_ptr(), 74

Page 36: Library of Congress Cataloging-in-Publication Dataptgmedia.pearsoncmg.com › images › 9780201604641 › samplepage… · 2010-12-16 · Schmidt, Douglas C. C++ network programming

INDEX 305

Wrapper Facade pattern, 14, 45, 85hide platform differences,

248–254hierarchies to enhance clarity

and extensibility, 246–248optimize for efficiency, 255–257simplify for common case,

238–246to enhance type safety, 236–238

write_log_record(), 90–91write_n(), 76writev(), 63WSASend(), 63

XTP, 24