jump to navigation

C Socket Programming in the UNIX environment – part 4 6 dicembre 2007

Posted by fripp in C, GNU/Linux, Informatica, Networking, Programmazione, Sistemi Operativi, Unix.
Tags: , , , , , , , ,
trackback

Iniziamo a metter in pratica quello che abbiamo imparato fino ad oggi!

Abbiamo visto come allocare le risorse per inizializzare una comunicazione tra processi attraverso la chiamata alla funzione socket e quali strutture usare per la gestione degli indirizzi.

La prima cosa che occorre fare è quella di assegnare un indirizzo ad una socket attraverso la funzione bind.


#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *address, socklen_t addrlen);


Vediamo di capire il significato di ciascun parametro:

  • sockfd è il file descriptor ottenuto da una precedente chiamata a socket;
  • address punta alla struttura che rappresenta l’indirizzo a cui vogliamo associare la socket;
  • addrlen è la dimensione della struttura cui punta address;

La funzione bind viene per esempio usata dal server per specificare le porte su cui si dovrà metter in ascolto. A questo punto è opportuno ricordare quali sono le macro predefinite che identificano particolari indirizzi di rete IPv4:

  • INADDR_ANY identifica l’indirizzo generico 0.0.0.0;
  • INADDR_BROADCAST identifica l’indirizzo di broadcast;
  • INADDR_LOOPBACK identifica l’indirizzo 127.0.0.1;
  • INADDR_NONE indentifica un indirizzo errato;

Dimenticavo……..la funzione bind restituisce un intero e in particolare 0 in caso di successo, -1 in caso di errore (controllate sempre i valori di ritorno!).

Altra funzione fondamentale è la connect, usata da un client per stabilire la connessione con un server.

Il prototipo della connect è il seguente:


#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr* serveraddr, socklent_t len);

Ecco una descrizione del sigificato degli argomenti:

  • sockfd è il file descriptor della socket;
  • serveraddr è la struttura che descrive l’indirizzo del server a cui connettersi;
  • len è la dimensione in byte della precedente struttura;

A questo punto occorre fare una precisazione. La funzione connect esegue la connessione del client col server. Se si sta usando un protocollo di livello trasporto di tipo “connected”, come il TCP, la connect si occupa di effettuare tutta l’inizializzazione della connessione (il three way handshake nel caso del TCP); se si sta usando un protocollo “connectionless”, come UDP, la connect si limita a impostare l’indirizzo verso cui inviare dati e l’indirizzo a cui riceverli.

Le due funzioni che verranno sono fondamentali dal lato server: la listen e la accept, che servono rispettivamente per metter il server in ascolto su una specifica socket e per accettare le richieste di connessione sulla socket di ascolto.

Ecco i prototipi:


#include <sys/socket.h>

int listen(int sockfd, int backlog);

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

Il primo argomento di listen è il file descriptor della socket su cui il server si mette in ascolto, mentre backlog indica la lunghezza della coda delle connessioni in arrivo; nel caso della accept, il primo parametro ha sempre lo stesso significato del primo parametro della listen, mentre il secondo e il terzo servono per ottenere informazioni relative all’host che si sta connettendo al server stesso.La funzione accept restituisce nuovo file descriptor relativo alla socket che verrà usata per soddisfare le risorse del client: una volta accettata a connessione, il server userà questo nuovo file descriptor per comunicare col client.Queste finora descritte sono le funzioni basilari per la creazione e la gestione di una connessione tra processi per mezzo delle socket. Nella prossima puntata (sperando di aver un poco di tempo) metterò il codice di una semplice applicaazione client-server che mette in pratica le cose dette finora.

A presto……………

Annunci

Commenti»

1. Crurrigmaliah - 13 febbraio 2008

Hello!
Nice site 😉
Bye

2. dandan86 - 23 giugno 2008

sei manna dal cielo!

3. fripp - 23 giugno 2008

Per così poco 😀 !

4. prestariot - 5 ottobre 2008

come si inseriscono i codici in quel modo li?
Grazie per l’articolo.

5. fripp - 6 ottobre 2008

Non capisco la tua domanda. Prova ad esser più chiaro


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: