Newsgroup: it.comp.lang.c
Titolo: Telnet

Ciao a tutti.
Mamma mia che fatica questo C...
Come si puo' implementare una connessione Telnet?
La mia intenzione e' scrivere un programma di
chat, piu' o meno... Ora, gestire le stringhe etc
dopo dure lotte non e' quasi piu' un problema. Il
problema e' inviarle a qualcun'altro.. ^___^
Grazie per l'aiuto.
Igor Rossetti
PS che fine ha fatto Alex Monti?

 Come si puo' implementare una connessione Telnet?
Con una certa fatica, perche` il protocollo telnet
non e` banale.  Ma 9 volte su 10 ti basta spedire e
ricevere stringhe di caratteri, e questo non e`
difficile con le socket (sia su Unix e similUnix
moderni, sia su Windows grazie a winsock).
Alex

  problema e' inviarle a qualcun'altro.. ^___^
Allora tanto x cominciare sei OT.
Comunque x darti qualche indicazione io farei cosi':
Comincerai con il creare un server al quale i miei client si
collegheranno,
e da questo gestirei l'interconnessione tra i vari client,facendogli
smistare i messaggi che da un client vanno ad un altro.
La struttura di un programma server e' piu' o meno la seguente:
Creazione della socket che dovra' essere messa in listen dei vari client.
vedere funzione "socket";
Fare la bind della socket con la funzione bind.
Mettere la socket in listen delle connessioni con la funzione "listen".
Chiamare la funzione "accept" per accettare le connessioni dai vari
client.
All' arrivo di una richiesta di connessione forkare un processo figlio per
la gestione di tale connessione e rimettere il processo padre in accept di
nuove connessioni.
Il server figlio sara' in grado di ricevere/spedire messaggi tra lui e il
client attraverso le funzioni read/write a cui sara' passato il socket
descriptor della connessione.
Struttura Server:
socket(....)
bind(......)
listen(....)
while ( (conSock = accept( .....)) )
        {
         if ( !fork() )
            {
                figlio( conSock )
                exit(0);
            }
        close( conSock );
        }
 
Per quanto riguarda il figlio, questo si colleghera' al server e
inviera'/ricevera' messaggi dal server tramite le funzioni write/read come
nel server.
Struttura Client:
socket(....)
connect( .....)
write(...)
....
....
read(...)
....
....
write(....)
....
....
Dopo di che sta a te scegliere il miglio modo per gestire lo smistamento dei
messaggi tra un client ed un altro client tramite l'interazione dei vari
server.
CLIENT   --->    SERVER------------------
                                        |
CLIENT   --->    SERVER------------------
                                        |
CLIENT   --->    SERVER---------------------------------->INTERAZIONE
                                        |                  TRA I VARI 
CLIENT   --->    SERVER------------------                    SERVER
                                        |
CLIENT   --->    SERVER------------------
Ivan Molella
--
Posted from 
mta03-acc.tin.it
 [212.216.176.34] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 PS che fine ha fatto Alex Monti?
Io sto proprio facendo questo, un programma di chat
per GNOME ...
Ad ogni modo lascia stare telnet e inizia a leggerti
tutto il materiale reperibile sui socket.
Visto che non hai specificato il sistema operativo
non posso darti altre informazioni...
Ciauz
-- 
+ 
g.gab...@europe.com
 ---------------+
|                                      |
+------------------ think Open Source -+

 PS che fine ha fatto Alex Monti?
Ah mi son scordato di dirti che qua' il tuo tipo
di domanda e Off Topic visto che i socket e in generale
il network programming e' strettamente dipendente
dal sistema operativo usato.


Allora tanto x cominciare sei OT.
Scusami.  Pero' ho chiesto questo riferito al
linguaggioC, non in generale... Magari con il
Visual Basic era piu' semplice... 

Ti ringrazio, m non sono stato chiaro nella mia
richiesta.
Io vorrei creare un client che si collega ad un
indirizzo attraverso una X porta... Non sarei
nemmeno in grado di ipotizzare un macello come
quello che mi hai descritto, forse fra qualche
anno... ^___^
Detto in soldoni vorrei ricevere ed inviare
stringhe ad un MUD... e non so come fare...
vorrei farlo in C... per imparare bene devo
buttarmi su qualcosa e questo e' il campo in cui
vorrei spezzarmi la schiena.
Ciao

Questo e' l'esempio di un piccolo client che si collega ad un server
generico 
nella fattispecie al servizio echo che ti rimanda in dietro quello che
spedisci,ma che con qualche accorgimento potresti utilizzare per collegarti ad
un MUD.
NB:
IL codice sotto riportato e' per linux, ma una versione unix non dovrebbe
essere molto differente( qualche include da modificare ) e lo stesso vale
per windows(include Winsock.h dovrebbe contenere tutto ).
Non l'ho compilato quindi ci sara' qualcosa che dovrai modificare
sicuramente
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<netdb.h>
#define HOST_IP	 "127.0.0.1"
#define MUD_PORT 7
#define BUFF_MESS_SIZE	255
char buffSend[BUFF_MESS_SIZE];
char buffRecv[BUFF_MESS_SIZE];
int main( int argc,char **argv )
{
  int  sock_fd = 0;
  struct sockaddr_in servaddr;
  if ( (sock_fd = socket( AF_INET,SOCK_STREAM,0 )) < 0 )
     {
     fprintf( stderr,"Error in socket creation!\n" );
     exit(1);
     }
  memset( &servaddr,0,sizeof(servaddr) );
 
  servaddr.sin_family = AF_INET;
  servaddr.sin_port   = htons(MUD_PORT);
  if (inet_pton(AF_INET, HOST_IP, &servaddr.sin_addr) <= 0)
     {
     fprintf( stderr,"Error in host ip address detect!\n" );
     exit(1);
     } 
  if (connect(sock_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
     {
     fprintf( stderr,"Error in Connetcting host\n" );
     exit(1);
     } 
  strcpy (buffSend,"Sono il client!" );
  fprintf( stdout,"Invio messaggio al MUD...\n" );
  write( sock_fd,buffSend, strlen(buffSend) );
  fprintf( stdout,"Attesa risposta!\n" );
  while ( read( sock_fd,buffRecv,BUFF_MESS_SIZE ) )
        fprintf( stdout,"%s",buffRecv );
  close( sock_fd );
  return 0;
