home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / PPPBCKP / SRC / SRC15B74.ZIP / WATTSRC.ZIP / APPS / TCPTALK.C < prev   
Text File  |  1994-11-27  |  5KB  |  194 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6. #include <tcp.h>
  7.  
  8. #define TALK_PORT 23
  9.  
  10.  
  11. void init( void )
  12. {
  13.     puts("\7\7");
  14.     textbackground( MAGENTA );
  15.     textcolor( WHITE );
  16.     clrscr();
  17.     cputs("  messages:");
  18.     gotoxy(1,24);
  19.     cputs("  current line:");
  20.  
  21.     window( 2,2,79,23);
  22.     textbackground( DARKGRAY );
  23.     clrscr();
  24.     window( 1,24,80,25 );
  25.     clrscr();
  26.     gotoxy( 1,2);
  27. }
  28.  
  29. void add_msg( char *source, char *msg )
  30. {
  31.     window( 2,2,79,23);
  32.     gotoxy( 1, 1 );
  33.     delline();
  34.     gotoxy( 1, 21 );
  35.     cprintf( "%8.8s : %s", source, msg );
  36.     window( 1,24,80,25 );
  37.     gotoxy( 1, 2 );
  38. }
  39.  
  40. int main(int argc, char *argv[])
  41. {
  42.     longword remoteip;
  43.     char *host;
  44.     char dummyuser[ 80 ], dummyruser[80], dummyhost[80];
  45.  
  46.     char buffer[ 80 ], rbuffer[80], ch;
  47.     word position;
  48.     word sendit, who_closed = 0;
  49.     int status;
  50.  
  51.     static tcp_Socket s;    /*, s2;*/
  52.     char *user, *remoteuser;
  53.  
  54.     sock_init();
  55.  
  56.     clrscr();
  57.     cputs("TCPTALK : (experimental version)\n\n\r");
  58.  
  59.     user = "me";    /* default */
  60.  
  61.     if (argc < 2) {
  62.     cputs("TCPTALK  [remote_user_id@]remote_host  [my_user_id]");
  63.     cputs("\n\r\nWaiting for an incomming call\n\r\n");
  64.     cprintf("(My address is [%s]\n\r", inet_ntoa( buffer, gethostid()));
  65.     tcp_listen( &s, TALK_PORT, 0, 0, NULL, 0 );
  66.     sock_mode( &s, TCP_MODE_ASCII );
  67.     sock_wait_established( &s, 0, NULL, &status);
  68.     cprintf("Connection established\r");
  69.     sock_wait_input( &s, sock_delay, NULL, &status );
  70.     sock_gets( &s, dummyhost, sizeof( dummyhost ));
  71.     sock_wait_input( &s, sock_delay, NULL, &status );
  72.     sock_gets( &s, remoteuser = dummyruser, sizeof( dummyruser ));
  73.     sock_puts( &s, "ok" );
  74.     sound( 1000 );
  75.     cputs("\n\rPress any to go to TALK session.\n\r");
  76.     getch();
  77.     nosound();
  78.     sock_puts( &s, "<answerring your call>" );
  79.         init();
  80.     } else {
  81.     remoteuser = "other";
  82.     if ( (host = strchr( argv[1], '@')) != NULL ) {
  83.         *host++ = 0;
  84.         remoteuser = argv[1];
  85.     } else
  86.         host = argv[1];
  87.  
  88.     if (!( remoteip = resolve( host ))) {
  89.         textcolor( RED );
  90.         cprintf("\n\rUnable to resolve '%s'\n\r", host );
  91.         exit( 3 );
  92.     }
  93.  
  94.     if ( argc < 3 ) {
  95.         cputs("Userid to assume:");
  96.         user = gets( dummyuser );
  97.         puts("\n\r");
  98.     } else
  99.         cprintf("Using '%s' as local userid\n\r", user);
  100.  
  101.     if ( !tcp_open( &s, 0, remoteip, TALK_PORT, NULL )) {
  102.         cputs("Unable to open connection.");
  103.         exit( 1 );
  104.     }
  105.     sock_mode( &s, TCP_MODE_ASCII );
  106.     sock_wait_established( &s, sock_delay,NULL, &status);
  107.     sock_puts( &s, inet_ntoa(buffer,gethostid()));
  108.     sock_puts( &s, user );
  109.     sock_wait_input( &s, sock_delay, NULL, &status );
  110.  
  111.     sock_gets( &s, buffer, sizeof( buffer ));
  112.     if ( stricmp( buffer, "ok" )) {
  113.         sock_close( &s );
  114.         cputs("Remote side did not wish to connect");
  115.         cprintf("MSG: %s\n", buffer);
  116.         sock_wait_closed( &s, sock_delay, NULL, &status );
  117.         exit( 1 );
  118.     }
  119.     init();
  120.     add_msg( remoteuser, "< remote user has not answerred yet, waiting...>");
  121.     sock_wait_input( &s, 0, NULL, &status );
  122.     }
  123.  
  124.     /* we are connected */
  125.  
  126.     add_msg( remoteuser, "connected");
  127.     *buffer = position = sendit = 0;
  128.  
  129.     while ( tcp_tick( &s ) ) {
  130.     /*
  131.      *
  132.      */
  133.     if (kbhit()) {
  134.         if ((ch = getch()) == 27) {
  135.         sock_close( &s );
  136.         who_closed = 1;
  137.         break;
  138.         }
  139.         switch (ch) {
  140.            case '\r' : sendit = 1;
  141.                break;
  142.            case '\b' : buffer[ --position ] = 0;
  143.                delline();
  144.                cputs( buffer );
  145.                break;
  146.            case '\t' : ch = ' ';
  147.            default   : buffer[ position++ ] = ch;
  148.                buffer[ position ] = 0;
  149. /*               if (position > 64 );    /* TODO -- what??? */
  150.                gotoxy( 1,2);
  151.                clreol();
  152.                cputs(buffer );
  153.         }
  154.         if (sendit) {
  155.         sock_puts( &s, buffer );
  156.         add_msg( user , buffer);
  157.         delline();
  158.         sendit = 0;
  159.         position = *buffer = 0;
  160.         }
  161.     }
  162.  
  163.     if (sock_dataready( &s )) {
  164.         sock_gets( &s, rbuffer, sizeof( rbuffer ));
  165.         add_msg( remoteuser, rbuffer );
  166.     }
  167.     }
  168.  
  169.  
  170.     delline();
  171.     textcolor( RED );
  172.     if ( who_closed == 1 ) {
  173.     cputs(" *** YOU CLOSED CONNECTION *** ");
  174.     sock_wait_closed(&s, sock_delay, NULL, &status);
  175.     } else
  176.     cputs(" *** OTHER PERSON CLOSED CONNECTION *** ");
  177.  
  178.     sleep( 1 );
  179.     while (kbhit()) getch();
  180.     getch();
  181.  
  182.     exit( 0 );
  183.  
  184. sock_err:
  185.     switch ( status ) {
  186.        case 1 : cputs("Connection closed");
  187.         break;
  188.        case -1: cputs("REMOTE HOST CLOSED CONNECTION");
  189.         break;
  190.     }
  191.     exit( 0 );
  192.     return (0);  /* not reached */
  193. }
  194.