DATAGRAM SOCKETdisys/CHAT-Socket-Ang-Diom-Vit.pdf · Definizione ! supporta i datagram ! privo di...

Post on 20-Apr-2020

10 views 0 download

Transcript of DATAGRAM SOCKETdisys/CHAT-Socket-Ang-Diom-Vit.pdf · Definizione ! supporta i datagram ! privo di...

DATAGRAM SOCKET

Angelastro Sergio

Diomede Antonio

Viterbo Tommaso

Definizione

´  supporta i datagram

´  privo di connessione

´  messaggi inaffidabili di una lunghezza massima prefissata

´  il protocollo UDP supporta questo tipo di socket

´  AF_INET (formato di indirizzamento) + SOCK_DGRAM (tipologia pacchetto) -> trasmissione UDP

Realizzazione

´  E’ stata stata realizzata un’applicazione per la comunicazione tra due host che utilizza le socket basate sul protocollo UDP

´  L’applicazione è cross platform

´  Libreria windows: winsock32

´  Libreria Linux: sys/socket, arpa/inet

Development Tools

´  Ambiente di sviluppo: Eclipse Kepler

´  Linguaggio di programmazione: C

´  Compilatore: MinGW

Schema Generale

Server Client

Socket()

Bind()

Recevefrom()

Aspetta un datagramma

sendto()

close()

Socket()

sendto()

Recevefrom()

close()

Dati (richiesta)

Dati (risposta)

Creazione di un socket

Assegna il proprio IP alla socket

Creazione di un socket

Itera

tiva

me

nte

In

via

e ri

ce

ve

me

ssa

gg

i

Invi

a e

ric

eve

m

ess

ag

gi

Chiusura socket Chiusura socket

Server(1)

void setSockAddr_in2(char IP[IPMAX]) { memset(&infoServerPers, 0, sizeof(infoServerPers)); infoServerPers.sin_family = PF_INET; infoServerPers.sin_port = htons(PORT); infoServerPers.sin_addr.s_addr = inet_addr(IP); }

sockAddr_in infoServerPers è una variabile che è costituita da: Campo1- sin_family famiglia di indirizzi Campo2- sin_port: porta sulla quale c’è il servizio Campo3- sin_addr.s_addr: proprio IP address Memset: inizializza i campi della variabile

Server(2)

1)if((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0) ErrorHandler("socket() failed");

2)if((bind(sock,(struct sockaddr*)&infoServerPers, sizeof(infoServerPers)))<0)

ErrorHandler("bind() failed");

1) 2)

printf("\nLa socket del server e' stata creata: %d",sock);

printf("\nBind: La socket e' stata collegata al proprio indirizzo IP.\n");

Client(1)

void setSockAddr_in (char IP[IPMAX]) { memset(&infoServer, 0, sizeof(infoServer)); infoServer.sin_family = AF_INET; infoServer.sin_port = htons(PORT); infoServer.sin_addr.s_addr = inet_addr(IP); }

sockAddr_in infoServer è una variabile che è costituita da: Campo1- sin_family famiglia di protocolli Campo2- sin_port: porta sulla quale c’è il servizio Campo3- sin_addr.s_addr: indirizzo IP del server con cui chattare Memset: inizializza i campi della la variabile

Client(2)

1)if((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0) ErrorHandler("socket() failed");

1)

printf("\nLa socket del client e' stata creata: %d",sock);

Live Chat

Si utilizzano ciclicamente recvfrom() e la sendto() per lo scambio dei messaggi

References

´  Datagram Socket programming http://www.programminglogic.com/sockets-programming-in-c-using-udp-datagrams/

´  Socket Programming http://www.yolinux.com/TUTORIALS/Sockets.html

´  Eclipse Configuration https://www.ics.uci.edu/~pattis/common/handouts/mingweclipse/mingweclipse.html

Stream Socket

Angelastro Sergio

Diomede Antonio

Viterbo Tommaso

Definizione

´  Fornisce una connessione

´  sequenziale

´  affidabile

´  full-duplex

´  Il protocollo TCP supporta questo tipo di socket

´  AF_INET (formato indirizzamento)+ SOCK_STREAM determineranno una connessione TCP

Realizzazione

´  E’ stata realizzata un’applicazione per la comunicazione tra due host che utilizza le streaming socket basata sul protocollo TCP

´  L’applicazione è cross platform

´  Libreria windows: winsock32

´  Libreria Linux: sys/socket, arpa/inet

Development Tools

´  Ambiente di sviluppo: Eclipse Kepler

´  Linguaggio di programmazione: C

´  Compilatore: MinGW

Schema Generale Server Client

Socket()

Bind()

Close()

Socket()

Connect()

Close()

Listen()

Accept()

Read()

Read()

Write()

Bloccato fino alla connessione

Esecuzione della richiesta

Read()

Write()

TCP 3 ways handshake

dati

dati

EOF

Creazione di un socket

Assegna un local address al socket

Setta la socket in ascolto Creazione di un

socket

Collegarsi al Server

Itera

tiva

me

nte

(p

roc

ess

o d

i b

ac

kgro

und

) A

cc

etta

una

nuo

va

co

nne

ssio

ne

Invi

a e

ric

eve

me

ssa

gg

i

Invi

a e

ric

eve

m

ess

ag

gi

Chiusura socket

Chiusura socket

Server(1)

void setSockAddr_in2 char IP[IPMAX]) { memset(&infoServerPers, 0, sizeof(infoServerPers)); infoServerPers.sin_family = PF_INET; infoServerPers.sin_port =htons(PORT); infoServerPers.sin_addr.s_addr = inet_addr(IP); }

sockAddr_in infoServerPers è una variabile che è costituita da: Campo1- sin_family famiglia di indirizzi Campo2- sin_port: porta sulla quale c’è il servizio Campo3- sin_addr.s_addr: proprio IP address Memset: inizializza i campi della la variabile

Server(2)

1)if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) ErrorHandler("socket() failed");

2)if ((bind(sock, (struct sockaddr *)&infoServerPers, sizeof(infoServerPers))) < 0)

ErrorHandler("bind() failed");

3)if (listen (sock, QLEN) < 0) {

ErrorHandler("listen() failed.\n"); closesocket(sock);ClearWinSock();return 0;

}

1) 2)

3)

printf("\nLa socket e' stata creata: %d",sock);

printf("\nBind:La socket e' stata collegata al proprio indirizzo IP.");

printf("\nLa socket ora e' in ascolto.");

Client(1)

void setSockAddr_in (char IP[IPMAX]) { memset(&infoServer,0,sizeof(infoServer)); infoServer.sin_family = AF_INET; infoServer.sin_port = htons(PORT); infoServer.sin_addr.s_addr=inet_addr(IP); }

sockAddr_in infoServer è una variabile che è costituita da: Campo1- sin_family famiglia di protocolli Campo2- sin_port: porta sulla quale c’è il servizio Campo3- sin_addr.s_addr: indirizzo IP del server con cui chattare Memset: inizializza i campi della la variabile

Client(2)

1)if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))<0) ErrorHandler("socket() failed");

2)if (connect(sock,(struct sockaddr*)&infoServer, sizeof(infoServer))<0) {

ErrorHandler( "Failed to connect.\n" ); closesocket(sock);ClearWinSock();return 0;

}

1) 2)

printf("\nLa socket del client e' stata creata: %d",sock);

printf("\nConnessione al server avvenuta con successo.\n");

Server(3)

4) if((socketTemp=accept(sock,(struct sockaddr*)&infoClient, &clientLen))<0) {

ErrorHandler("accept() failed .\n"); closesocket(sock);ClearWinSock();return 0; }

printf("\nLa connessione col client %s e' stata accettata",inet_ntoa(infoClient.sin_addr)); printf("\ned stata creata la socket di benvenuto: %d\n",socketTemp);

4)

Live Chat

Si utilizzano iterativamente recv() e la send () per lo scambio dei messaggi

References

´  Socket Programming http://www.yolinux.com/TUTORIALS/Sockets.html

´  Eclipse Configuration https://www.ics.uci.edu/~pattis/common/handouts/mingweclipse/mingweclipse.html