DATAGRAM SOCKET

Transcript

DATAGRAM SOCKET
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()
Creazione di un
socket
Bind()
Iterativamente
Invia e riceve
messaggi
Recevefrom()
Dati
(richiesta)
Aspetta un
datagramma
Creazione di un
socket
sendto()
Dati
(risposta)
Recevefrom()
sendto()
close()
Socket()
Chiusurasocket
socket
Chiusura
close()
Invia e riceve
messaggi
Assegna il proprio IP
alla socket
Server(1)
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
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);
}
Server(2)
1)
2)
1)if((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
ErrorHandler("socket() failed");
printf("\nLa socket del server e' stata creata: %d",sock);
2)if((bind(sock,(struct sockaddr*)&infoServerPers,
sizeof(infoServerPers)))<0)
ErrorHandler("bind() failed");
printf("\nBind: La socket e' stata collegata
al proprio indirizzo IP.\n");
Client(1)
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
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);
}
Client(2)
1)
1)if((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
ErrorHandler("socket() failed");
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/socketsprogramming-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
Client
Server
Bind()
Assegna un local
address al socket
Listen()
Setta la socket in
Creazione
ascolto
Accept()
Bloccato fino alla connessione
Iterativamente
(processo di
background)
Accetta una nuova
connessione
Invia e riceve messaggi
Creazione di un
socket
di un
socket
Collegarsi al
Server
TCP 3 ways handshake
Read()
dati
Socket()
Connect()
Write()
Esecuzione della richiesta
Write()
Read()
Close()
dati
Chiusura socket
EOF
Chiusura socket
Read()
Close()
Invia e riceve
messaggi
Socket()
Server(1)
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
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);
}
Server(2)
1)
3)
2)
1)if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
ErrorHandler("socket() failed");
printf("\nLa socket e' stata creata: %d",sock);
2)if ((bind(sock, (struct sockaddr *)&infoServerPers,
sizeof(infoServerPers))) < 0)
ErrorHandler("bind() failed");
printf("\nBind:La socket e' stata collegata al proprio indirizzo
IP.");
3)if (listen (sock, QLEN) < 0)
{
ErrorHandler("listen() failed.\n");
closesocket(sock);ClearWinSock();return 0;
}
printf("\nLa socket ora e' in ascolto.");
Client(1)
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
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);
}
Client(2)
1)
2)
1)if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
ErrorHandler("socket() failed");
printf("\nLa socket del client e' stata creata: %d",sock);
2)if (connect(sock,(struct sockaddr*)&infoServer,
sizeof(infoServer))<0)
{
ErrorHandler( "Failed to connect.\n" );
closesocket(sock);ClearWinSock();return 0;
}
printf("\nConnessione al server avvenuta con successo.\n");
Server(3)
4)
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);
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