Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Andre00
    Registrato dal
    Mar 2003
    Messaggi
    371

    Realizzare client TELNET

    Sono nuovo al C ma non alle reti in generale e sgattaiolando tra info trovate su internet ho tentato di realizzare un piccolo client che mi permettesse di collegarmi a qualsiasi servizio:

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <unistd.h>
    #include <netdb.h>

    #define SLEEP_TIME 10

    int
    main (int argc, char **argv)
    {
    int tcp_socket,n,nrecv,nsend,len,i,j;
    int TCP_PORT;
    struct sockaddr_in tcp_server;
    struct hostent *ptrh;
    struct in_addr a;
    char buffer[1024];
    char stringa[2048];
    char buffer_to_read;


    if (argc < 2)
    {
    // non e' possibile leggere l'indirizzo IP del server!
    printf ("Nessun IP del server indicato!\n");
    exit (-1);
    }
    printf("Inserire porta TCP: ");
    scanf("%d",&TCP_PORT);
    printf("\nInserire lunghezza stringa da leggere max 2048: ");
    scanf("%d",&len);
    printf("\n");
    // creiamo la socket per TCP
    tcp_socket = socket (AF_INET, SOCK_STREAM, 0);
    if (tcp_socket <= 0)
    {
    printf ("Errore nella creazione della socket tcp!\n");
    exit (-1);
    }
    ptrh=gethostbyname (argv[1]);

    // azzeriamo la struttura dati con le informazioni ...
    bzero (&tcp_server, sizeof (tcp_server));
    // impostiamo come "famiglia" quella di rete ...
    tcp_server.sin_family = AF_INET;
    // associamo la socket a qualsiasi interfaccia di rete ...
    memcpy(&tcp_server.sin_addr, ptrh->h_addr,ptrh->h_length);
    // impostiamo la porta remota di ascolto ...
    tcp_server.sin_port = htons (TCP_PORT);
    // apriamo la connessione
    if (connect
    (tcp_socket, (struct sockaddr *) &tcp_server, sizeof (tcp_server)) < 0)
    {
    // errore nella connessione, interrompiamo l'esecuzione
    printf ("Errore nella connessione al server!\n");
    exit (-1);
    }

    // leggiamo tutti i dati che ci invia il server e mettiamoli a video!

    printf ("connessione al server!\n");
    n=1;nrecv=0;i=0;
    while (recv (tcp_socket, &(stringa[i]),len,0)) {
    printf("%s",&(stringa[i]));
    i=i+n;


    }
    send (tcp_socket, &(stringa[i]), len, 0);

    //send (tcp_socket, stringa, len, 0);
    printf("n= %d \nScrivi al server \n",n);
    scanf("%s",&stringa);
    printf("Attendi...");
    send (tcp_socket, stringa, len, 0);


    // chiudiamo la connessione!
    close(tcp_socket);

    return 0;

    }

    In sostanza ho provato a collegarmi ad un server ftp o telnet in locale o remoto.RIsultato ad esempio per telnet:
    ottengo la videata completa delle info mandate dal server, ma non mi viene restituita la possibilità di inviare niente al server.
    Non capisco ci deve essere un problema di sincronizzazione. Ad esempio dopo aver ottenuto LOGIN: da collegamente con il telnet server del mio router dovrei inserire nome user e password ma la possibilità di inserire il nome user non mi viene data. Eppure il server mi invia tutto perfettamente fino al login
    Cosa impedisce al mio client terminate le recv di usare la send allo stesso socket?

    GRAZIE in anticipo!

    CIAO A TUTTI!
    L'incubo peggiore è non poter più sognare...

  2. #2
    devi conoscere esattamente il protocollo utilizzato per il servizio ed inviare i dati nella sequenza e nel momento giusto.
    Decidi il servizio a cui ti vuoi collegare (per esempio ftp), verifica con telnet la sequenza dei comandi o cerca su google e poi replicala nel tuo programma.
    Per esempio per il protocollo ftp il server resta in attesa del login con il comando
    USER user
    e quindi chiede la password
    PASS password
    quindi i comandi che probabilmente già conosci di ftp (ls, cp, etc)
    con QUIT esci
    ciao
    sergio

  3. #3
    Utente di HTML.it L'avatar di Andre00
    Registrato dal
    Mar 2003
    Messaggi
    371
    Si quello che dici tu è senz altro vero. Tuttavia avrei voluto realizzare qualcosa tipo il client telnet che a seconda del servizio con il quale instaura una connessione si adatta dal punto di vista del client.
    Facendo le cose facili pensavo che ogni volta che il server parlasse il client ascoltasse come conseguenza e viceversa in modo tale che client e server si basassero su strutture che permettessero di capire quando poter parlare o ascoltare (inviare o ricevere) a seconda delle opporunità.

    DOmanda esistono strutture che restituiscono informazioni su quando posso inviare o ricevere dati?

    Io mi baso su un

    while (recv (tcp_socket, &(stringa[i]),len,0)) {

    ma perchè la recv si blocca proprio quando questo controllo dovrebbe evitare che si bloccasse?


    BOH...

    SE ne avete attendo consigli di ogni sorta...

    CIAO E GRAZIE!
    L'incubo peggiore è non poter più sognare...

  4. #4
    ma non è così, telnet non si adatta al servizio.
    Se tu fai
    telnet mio_sito.it 80
    ti colleghi, per esempio, al server http del sito mio_sito.
    Telnet rimane in attesa che il client invii la richiesta che sarà, esempio, del tipo
    GET index.html HTTP/1.0 (se ricordo bene)
    il server ti restiutirà index.html del sito consideato.
    Un altro esempio è
    telnet sito.it 21
    per collegarsi al server ftp in ascolto sulla porta 21. Il server risponde ed attende il tuo login, secondo il protocollo ftp.
    In definitiva sei tu che conoscendo il protocollo di comunicazione con il server a cui ti sei collegato devi sapere quando ricevi i dati e quanto inviarli
    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.