Author: James CE Johnson

ACE Tutorial 015
Building a protocol stream

The Xmit object knows how to send data to the peer. It sits at the tail of the stream and gets everything that flows down from the head. In keeping with the spirit of things, this object does only one thing and doesn't concern itself with anyone else' details.

The only thing you might want to do is combine it with Recv. Why? As you'll realize in a page or two, the Xmit and Recv objects must interact if you're going to ensure a safe transit. By having a single object it's easier to coordinate and maintain the interaction.

    // page14.html,v 1.12 1999/04/03 21:56:30 jcej Exp

    #ifndef XMIT_H
    #define XMIT_h

    #include "Protocol_Task.h"

    // Forward reference reduces #include dependencies
    class ACE_SOCK_Stream;

    /* A class suitable for sending data to a peer from within an
       ACE_Stream.
     */
    class Xmit : public Protocol_Task
    {
    public:
      typedef Protocol_Task inherited;

      // We must be given a valid peer when constructed.  Without that we
      // don't know who to send data to.
      Xmit (ACE_SOCK_Stream &peer);
      ~Xmit (void);

      // As you know, close() will be called in a couple of ways by the
      // ACE framework.  We use that opportunity to terminate the
      // connection to the peer.
      int close (u_long flags);

    protected:

      ACE_SOCK_Stream &peer (void)
      {
        return this->peer_;
      }

      // Send the data to the peer.  By now it will have been completely
      // protocol-ized by other tasks in the stream.
      int send (ACE_Message_Block *message,
                ACE_Time_Value *timeout);

    private:
      // A representation of the peer we're talking to.
      ACE_SOCK_Stream &peer_;
    };

    #endif /* XMIT_H */

[Tutorial Index] [Continue This Tutorial]