Accedi

Ho dimenticato la password

Ultimi argomenti
» argomento
Dom Giu 02, 2013 4:30 pm Da ruggiero98

» problema con la funzione SE aiutoooo x favore?????
Dom Giu 02, 2013 4:18 pm Da ruggiero98

» aiuto in programma con if
Dom Mag 26, 2013 5:39 pm Da ruggiero98

»  CALCOLO PERCENTUALE IN C
Sab Apr 20, 2013 8:22 pm Da ruggiero98

» Costruire un temporizzatore software per accensione luci a led
Lun Mar 25, 2013 2:34 pm Da Cristina Shady

» Ciao a tutti!
Gio Mar 22, 2012 4:19 am Da cosmos91

» Virtualbox VS le periferiche USB
Mar Apr 06, 2010 1:49 pm Da dandeciani

» PROGRAMMA: BINARY CODE
Mar Dic 23, 2008 7:28 pm Da Thalionwen

» saluti a tutti
Mar Dic 23, 2008 7:12 pm Da Thalionwen

» GUIDA : CAP 1 LEZIONE 1 Elementi di base dei programmi in C [Prima Parte]
Sab Nov 29, 2008 11:44 am Da ya89

» un semplice ciao
Sab Nov 29, 2008 11:38 am Da ya89

» Aiuto per alice 7 mega
Ven Nov 14, 2008 4:03 pm Da root

» FORUM: I nuovi banner
Ven Nov 14, 2008 2:48 pm Da Thalionwen

» Zooming Ricorsivo, questo sconosciuto.
Ven Nov 14, 2008 2:43 pm Da Thalionwen

» GUIDA : LEZIONE 4 : UTILIZZARE GLI ARRAY IN C#
Ven Nov 14, 2008 1:54 pm Da ab89

» GUIDA : CAP 1 LEZIONE 1 Elementi di base dei programmi in C [Terza e Ultima Parte]
Ven Nov 14, 2008 12:41 am Da ab89

» GUIDA : CAP 1 LEZIONE 1 Elementi di base dei programmi in C [Seconda Parte]
Mer Nov 12, 2008 12:59 am Da ab89

» [PS2] Dark Cloud
Mar Nov 11, 2008 6:50 pm Da ab89

» [PC] Sacred 2
Lun Nov 10, 2008 10:49 pm Da ab89

» GUIDA : CAP 1 LEZIONE 3 INTRODUZIONE AGLI ARRAY
Lun Nov 10, 2008 1:37 pm Da ab89

Flusso RSS


Yahoo! 
MSN 
AOL 
Netvibes 
Bloglines 



PROGRAMMA : Utilizzo socket per creazione di un Server

Andare in basso

PROGRAMMA : Utilizzo socket per creazione di un Server

Messaggio Da ab89 il Sab Ott 25, 2008 4:05 pm

Dato che l'argomento è abbastanza vasto tralascio la parte di spiegazione su socket e server per illustrare il codice

A livello logico, per creare un'applicazione di questo tipo si applica il seguente schema :


  1. CREAZIONE SOCKET IN ASCOLTO SU UNA PORTA
  2. ATTESA SOCKET IN INGRESSO
  3. SE SOCKET IN INGRESSO
  4. LETTURA MESSAGGIO
  5. SE NON CI SONO ERRORI SI SCRIVE IL MESSAGGIO
  6. RITORNO IN FASE DI ATTESA
  7. INFINE AL TERMINE DEL PROGRAMMA CHIUSURA SOCKET
Ovviamente i 7 punti sopra indicati sono di esempio ma secondo me chiariscono il concetto.

Nel codice oltre al main() sono presenti altre 2 funzioni :

  • f_create_socket(int port)
  • f_close_socket(int sock)
La prima serve per creare un socket in ascolto sulla porta numero port (nel codice è 1800) in questo modo viene analizzato tutto il flusso (STREAM) in ingresso da quella porta.

La seconda serve per chiudere un socket aperto.

Il codice segue la logica applicata precedentemente :
Per prima cosa crea un socket in ascolto alla porta 1800.
In seguito tramite un ciclo while resta in attesa fintanto che non viene rilevato un socket in ingresso.
Esso viene accettato.
Viene letto il messaggio.
Infine viene chiuso il socket in ingresso
Successivamente viene verificato il messaggio inviato, se il messaggio è exit il programma termina, altrimenti
viene stampato a video il messaggio ricevuto.

Codice:

#include <sys/types.h>
#include <sys/socket.h>
//"in" per "sockaddr_in"
#include <netinet/in.h>
//"fcntl" per la funzione "fcntl"
#include <fcntl.h>
#include <stdio.h>

int f_create_socket (int port);
void f_close_socket (int sock);

main()
{
    char buffer[512];
   
    //indicano i socket utilizzati
    //socket_listener : rappresenta il sistema (127.0.0.1)
    //socket_applicant : rappresenta il socket che invia il messaggio
    int socket_listener, socket_applicant;
   
    int dim_buffer;
    int eol = 0; //end of listening (fine di "ascolto")
   
    //creazione socket sul quale ascoltare
    socket_listener = f_create_socket (1800);
   
    printf("Server in attesa ...\n");
   
    while (!eol){
       
        //int accept (int socket, struct sockaddr *addr, socklen_t *length_ptr)
        if ((socket_applicant = accept(socket_listener, 0, 0)) != -1){
            if ((dim_buffer = read(socket_applicant, buffer, sizeof(buffer))) < 0 ){
                printf("Impossibile leggere il messaggio\n");
                f_close_socket(socket_applicant);
            }
            else{
                buffer[dim_buffer] = 0;
                if (strcmp(buffer, "exit") == 0)
                    eol = 1;
                else
                    printf("Messaggio : %s\n", buffer);
            }
            f_close_socket(socket_applicant);
        }
    }
   
    f_close_socket(socket_listener);
    printf("Server Terminato\n");
   
    return;
}

int f_create_socket (int port)
{
    int sock, errore;
    struct sockaddr_in tmp;
   
    //creazione del socket
   
    sock = socket(AF_INET, SOCK_STREAM, 0);
   
    tmp.sin_family = AF_INET;
    tmp.sin_addr.s_addr = INADDR_ANY;
    tmp.sin_port = htons(port);
   
    //il socket deve essere non bloccante
    errore = fcntl(sock, F_SETFL, O_NONBLOCK);
   
    //eseguo il bind del socket
    errore = bind(sock, (struct sockaddr *) &tmp, sizeof(tmp));
   
    //abilito la possibilità di gestire fino a 7 chiamate
    errore = listen(sock, 7);
   
    return sock;
}

void f_close_socket (int sock)
{
    close(sock);
    return;
}

Il programma è stato testato e funzione !! Very Happy
Una piccola nota va ai commenti fatti alla variabile socket_listener.
Ciò che ho scrito potrebbe risultare fuorviante.
Ciò che voglio dire scrivendo l'indirizzo 127.0.0.1 è che creando un socket ad una porta e con quell'indirzzo
si ottiene la stessa cosa che scrivendo solamente, come fatto nel codice, il numero della porta.
Questo perchè 127.0.0.1 equivale all'indirizzo di local_host del sistema, il che implica un riferimento alla macchina stessa Very Happy

In caso di dubbi e/o domande sono a disposizione Very Happy

_________________
生きるためにもあまり変過ぎるし、死ぬためにもあまり珍し過ぎる。

What D.Gray-man Character Are You?
Hosted By theOtaku.com: Animee

avatar
ab89
Admin
Admin

Numero di messaggi : 74
Età : 29
Località : Rovigo
Data d'iscrizione : 29.09.08

Scheda personaggio
PF:

Visualizza il profilo

Torna in alto Andare in basso

Torna in alto

- Argomenti simili

 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum