datagram socketdisys/chat-socket-ang-diom-vit.pdf · definizione ! supporta i datagram ! privo di...
TRANSCRIPT
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