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