Talk

Talk è un programma di comunicazione testuale utilizzabile da coppie di utenti, loggati su sistemi Linux compatibili, che trasferisce righe di testo da un terminale all’altro. Esso nasce nel 1988, sviluppato nei laboratori della Berkeley University e rilasciata con la versione 4.2BSD di sistemi UNIX. La differenza tra Talk ed un comune programma di Chat è sostanziale: quando si "chatta", di solito lo si fa con un altro gruppo di utenti (con la possibilità di Chat private uno-ad-uno) attraverso un programma chiamato Internet Relay Chat (IRC) che sfrutta un IRC Server. Talk è un programma di "conversazione uno-a-uno" in cui non è richiesto un IRC Server. In una sessione di Chat gli utenti non vedono cosa si è scritto finchè non si digita il tasto di [INVIO], cosa che non avviene utilizzando Talk dove i messaggi sono visualizzati in maniera istantanea (instant messages). Inoltre nel caso la persona con cui si sta "chattando" ritarda la risposta si ha la possibilità di contattare un altro utente nel frattempo. Per cui una sessione Talk è preferibile nel caso si vuole contattare qualcuno a cui "dedicare" l'intero colloquio. In una sessione di Chat, si deve selezionare un canale (o Stanza) per poter instaurare una discussione con un "gruppo" di utenti. Per "Chattare" si deve avere una Connessione Internet (naturalmente!) ed un IRC client software. Talk invece è come una conversazione telefonica nella quale la composizione del numero telefonico della persona desiderata corrisponde nello specificare l'indirizzo IP (Internet Protocol) della persona desiderata o il nome del suo PC senza bisogno di alcun sistema IRC.

Il programma lavora sul modello Client/Server; il Client svolge le funzioni di interfaccia con l’utente, gestendo le fasi di scrittura dei messaggi e di visualizzazione dei messaggi di risposta. Il Server gestisce la fase di notifica delle richieste di comunicazione e permette a due client Talk di stabilire una sessione Talk.

Il diagramma seguente mostra i canali di comunicazione creati dal programma Talk necessari per effettuare lo scambio dei messaggi tra due utenti generici A e B.
Il primo canale creato è quello tra Talk Client A e Talk Server B, questo serve per informare il Talk Server B che si vuole contattare l'utente B loggato sul sistema. Succesivamente il Talk Server B prova ad informare l'utente B dell'invito e comunica al Talk Client A l'eventuale risposta. A questo punto il Talk Client A comunica con il proprio Talk Server A a cui lascia un "recapito" sul quale vuole essere contattato. Successivamente se l'utente B accetta l'invito, prova a contattare il Talk Server A per reperire il "recapito" sul quale il Talk Client A aspetta. A questo punto entrambi i Talk Client A e B creano un Canale di scambio dei messaggi dedicato alla trasmissione del testo.

(top)

Lato Client

Per attivare il programma Client è necessario digitare il seguente comando:

talk { User | User@Host } [Tty]

Descrizione

Per iniziare una conversazione, un utente digita il comando Talk e specifica la login ID dell’utente che vuole contattare.

Opzioni disponibili:

User : Se si desidera conversare con qualcuno che è loggiato sullo stesso sistema server, allora User è appunto il login della persona. Se si desidera conversare con un utente loggato su un altro sistema server, allora User è nella forma 'utente@macchina'.

Tty : Se si desidera conversare con un utente che ha più terminali aperti, l'argomento Tty può essere usato per indicare il nome del terminale appropriato, dove Tty è nella forma 'ttyXX'.

Per esempio:

catesp@unisa.it :>talkmichael@host17.dev.ibm.com tty3

catesp@unisa.it invita l'utente michael loggato sull'host host17 nel domain dev.ibm.com ad una conversazione, al quale è recapitato sul terminale il seguente messaggio:

Message from TalkDaemon@unisa.it...
   talk: connection requested by catesp@unisa.it.
   talk: respond with:talk catesp@unisa.it

Quando il destinatario riceve il messaggio di invito può accettare e rispondere digitando:

michael@host17:> talk catesp@unisa.it

Il comando Talk visualizzerà lo schermo del terminale dei due utenti diviso in due metà e mostrerà progressivamente i messaggi ricevuti finchè un utente non termina la conversazione, digitando i tasti (Ctrl-C).

(top)

Lato Server

Il programma Server lavora sotto forma di “demone”, esso è attivato dal sistema in fase di boot e rimane continuamente in ascolto di un’eventuale richiesta di connessione da parte dei client. Esistono due versioni di Server, talkd , e la sua evoluzione ntalkd.

Descrizione talkd Daemon

talkd utilizza il protocollo UDP ed è in ascolto sulla porta 517, è il primo server progettato per il protocollo Talk, ma attualmente è poco utilizzato ed è presente solo su versioni abbastanza vecchie di sistemi Linux (BSD v4.2). Esso lavora in maniera identica a ntalk , eccetto per le strutture dati che sono leggermente differenti.

Descrizione ntalkd Daemon

ntalkd utilizza il protocollo UDP ed è in ascolto sulla porta 518, esso è il più comune tra i due (BSD v4.3 e superiori). Un Talk client A prova a contattare il Talk server B, per determinare se c'è già qualche invito di conversazione per lui, chiedendo di controllare la lista degli inviti da recapitare mantenuta dal Talk server B. Se c'è nella lista, esso si connette all'altro Talk client B utilizzando un canale dedicato in protocollo TCP. Altrimenti, esso lascia un invito per l’utente B, e sarà compito del Talk server B presentare tale l’invito di conversazione.

Nota: per effettuare una sessione di Talk è necessario che i due client comunichino attraverso due Talk server dello stesso tipo.

(top)


Strutture Dati

Le comunicazioni sono effettuate mediante lo scambio di messaggi basati sulle seguenti strutture dati:

Il client invierà un datagram packet con la seguente struttura:

typedef struct {
  unsigned char vers;         /* Versione Talk daemon (sempre settata 1)*/
char type; /* Azione che il Server deve eseguire */
unsigned short pad; /* padding, può avere un valore qualsiasi */
long idnum; /* identificativo del messaggio. */
struct sockaddr_in addr; /* IP address del demone remoto */
struct sockaddr_in ctl_addr;/* IP address del Talk client locale*/
long pid; /* process ID del Talk client locale*/
char l_name[12]; /* user name dell’utente chiamante */ char r_name[12]; /* user name dell'utente chiamato */ char r_tty[16]; /* terminale tty remoto */ } CTL_MSG;

La struttura CTL_MSG dovrà essere riempita nel seguente modo:

vers Dovrà contenere sempre il valore "1".
type Tipo di operazione da compiere, (LOOK_UP, ANNOUNCE, …).
idnum Identificativo progressivo per i messaggi scambiati tra le due parti.
addr Indirizzo del Talk client. Esso deve appartenere alla famiglia INET. E’ il front-end per la sessione di Talk su un canale TCP. L'indirizzo deve essere in network byte order.
ctl_addr Indirizzo del demone server. Esso deve appartenere alla famiglia INET. La porta può essere settato a qualsiasi valore. L'indirizzo deve essere in network byte order.
pid Il PID del Talk client, in network byte order.
l_name Una stringa terminante con carattere Null contenente l'user name dell'utente A.
r_name Una stringa terminante con carattere Null contenente l'user name dell'utente B.
r_tty Una stringa terminante con carattere Null contenente l’identificato del terminale dell'utente B.

Il server risponde con un messaggio avente la seguente struttura:

typedef struct {
  unsigned char vers;     /* Versione Talk daemon (sempre settata 1)*/
char type; /* Azione richiesta */
char answer; /* Risposta alla richiesta fatta */ char pad; /* padding */
long idnum; /* identificativo del messaggio */ struct sockaddr_in addr;/* Indirizzo dell’utente chiamante */
} CTL_RESPONSE;

Il server remoto ritorna le seguenti informazioni nella strutturaCTL_RESPONSE:

vers Contiene sempre il valore "1".
type Deve essere lo stesso valore inviato in CTL_MSG.
idnum Identificativo del messaggio di risposta. Questo valore deve essere in network byte order.
addr Indirizzo del Talk client. Esso deve appartenere alla famiglia INET. E’ l’altro front-end per la sessione di Talk su un canale TCP. L'indirizzo deve essere in network byte order.

Azioni richieste dal client al server.

LEAVE_INVITE (0) Il Talk client lascia sul proprio server un invito per un altro client, per informarlo su come stabilire la sessione di Talk.
LOOK_UP (1) Il Talk client A(B) controlla sul Talk server B(A) se esiste un invito per esso.
DELETE (2) Il Talk client chiede ad entrambi i Talk server di cancellare il proprio invito lasciato precedentemente, nel caso di avvenuta connessione da parte dei due client o di rifiuto da parte del chiamato.
ANNOUNCE (3) Il Talk client A(B) annuncia sul Talk server B(A) un invito.

Risposte del server alla richieste del client:

SUCCESS (0) se è riuscito ad informare l’utente B circa il tentativo di contatto.
NOT_HERE (1) se l’utente B non è loggato.
FAILED (2) operazione fallita per una ragione sconosciuta.
MACHINE_UNKNOWN (3) l’utente B non raggiungibile.
PERMISSION_DENIED (4) l’utente B rifiuta qualsiasi invito.
UNKNOWN_REQUEST (5) richiesta non conforme al protocollo.
BADVERSION (6) versione del protocollo non valida.
BADADDR (7) indirizzo del client non valido.
BADCTLADDR (8) indirizzo del server non valido.
(top)