Class DTelNetClient

Inherits from:
Object
Declared in:
DTelNetClient.h

Class Hierarchy

    Object
      |
      +---DTelNetClient

Class Description

The DTelNetClient class implements a telnet client. The class supports negotiation of options. Also subnegotiation is supported. There is not yet support for interrupt sending.

Example:
#include <stdio.h>
#include "ofc/DTelNetClient.h"

@interface MyClient : DTelNetClient    // MyClient processes the special server responses
{
}

- (BOOL) processOpenNegotiation :(int) who :(int) option :(int) state;
- (BOOL) processResponseNegotiation :(int) who :(int) option :(BOOL) accepted;
- (BOOL) processRequestSubNegotiation :(int) option;
- (BOOL) processSpecialCommand :(unsigned char) command;
@end

@implementation MyClient

- (BOOL) processOpenNegotiation :(int) who :(int) option :(int) state;
{
  printf("Opening negotiation option %s for %s state %d\n",
      [DTelNetClient optionToString :option], (who == DTNC_SERVER ? "Server" : "Client"), state);

  return (option == 24 ? YES : NO);    // Accept option 24, refuse others
}

- (BOOL) processResponseNegotiation :(int) who :(int) option :(BOOL) accepted;
{
  printf("Server accepted negotiation option %s for %s state %d\n",
      [DTelNetClient optionToString :option], (who == DTNC_SERVER ? "Server" : "Client"), accepted);

  return YES;
}

- (BOOL) processRequestSubNegotiation :(int) option
{
  printf("Server request the value for the sub negotiation of option %s\n",
      [DTelNetClient optionToString :option]);

  if (option == 24)
    [self respondSubNegotiation :option :"dec-vt100" :9]; // Send value subnegotiation

  return YES;
}

- (BOOL) processSpecialCommand :(unsigned char) command;
{
  printf("Special command: %s received\n", [DTelNetClient commandToString :command]);

  return YES;
}
@end

int main(int argc, char *argv[])
{
  MyClient           *client  = [MyClient new];
  DInetSocketAddress *address = [DInetSocketAddress new];
  DURL          *url          = [DURL new];
  DData         *response     = nil;

  [address host :"localhost" :DTNC_PORT];

  [client open :address];              // Open connection to the server

  if ([client isConnected])
  {
    char buffer[256];

    buffer[0] = EOS;
                                       // Open the negotiations
    [client requestOpenNegotiation :DTNC_SERVER :DTNC_TM   :YES];

    do
    {
      BOOL input = NO;
      BOOL empty = NO;

      do
      {                                // Send user input to server
        [client sendText :buffer];

        if (!input)                    // Receive responses
          response = [client receive];

        buffer[0] = EOS;

        if (response != nil)
        {
          long i;
          long length = [response length];

          printf("Response:");         // Print response
          for (i = 0; i < length; i++)
            printf("%c", [response get :i]);

          if (length > 0)
            input = ([response get :(length-1)] != '\n');

          empty = (length == 0);

          [response free]; response = nil;
        }
      }
      while (([client pendingRequests]) || (empty) || (!input));

      fflush(stdout);
                                       // Ask input from user
      fgets(buffer, sizeof(buffer), stdin);
    }                                  // Keep asking till 'exit'
    while (strncmp(buffer, "exit", 4) != 0);

    [client close];
  }
  else
    printf("Could not connect to telnet server.\n");

  [client  free];                      // Cleanup
  [url     free];
  [address free];
}
Last modified:
25-Aug-2008 (DTelNetClient.h)

Instance Variables

private DSocket *_client
the client socket
private BOOL _connected
is the client connected ?
private int _options[DTNC_OPTIONS]
the negotiated state op the options
private DData *_request
the request to be sent to the server

Method Index


generated 06-Sep-2008 by ObjcDoc 3.0.0