codice:
//CLIENT.c
//CLIENT
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{ /***** variabili per modulo client *******/
struct sockaddr_in serverIP; // mi serve per comunicare con taluno server
int err_net;
int err_id;
int sk; //n° socket
char msg[26]; // scambio di messaggi
char msg_R[] = "che data/ora sono?";
int send_ok, rec_ok;
int ok = 1;
int close_ok;
//Creo socket tramite taluna primitiva
sk=socket(AF_INET, SOCK_STREAM, 0); // fissa
if (sk==-1) // la primitiva in caso si errore ret -1
{
printf("Creazione socket fallito\n");
exit(1);
}
// Assegnamento degli indirizzi
memset(&serverIP, 0, sizeof(serverIP)); /* azzera la struttura*/
serverIP.sin_family = AF_INET; /* IPv4 address */
serverIP.sin_port = htons(1050); /* network ordered */
err_id = inet_pton(AF_INET, "127.0.0.1", &serverIP.sin_addr.s_addr);
if (err_id==0) // la primitiva in caso si errore ret 0
{
printf("Indirizzamento fallito\n");
exit(1);
}
// crea connessione
err_net=connect(sk, (struct sockaddr*) &serverIP, sizeof(serverIP));
if (err_net==-1) // la primitiva in caso si errore ret -1
{
printf("Connessione fallita\n");
exit(1);
}
while(ok==1)
{
// invio richiesta data/ora
send_ok = send(sk, (void *)msg_R, strlen(msg_R), 0);
if (send_ok==-1 || send_ok < strlen(msg_R)) // la primitiva in caso si errore ret -1
{
printf("Invio di richiesta fallito, ritento\n");
}
else ok = 0;
}
while(ok==0)
{
//ricevuta data/ora
rec_ok = recv(sk, (void*)msg, sizeof(msg), MSG_WAITALL);
if ( (rec_ok == -1) || rec_ok<sizeof(msg))
{
int okk = 1;
printf("Packetloss, rinvio richiesta \n");
while(okk == 1)
{
// invio richiesta data/ora
send_ok = send(sk, (void *)msg_R, strlen(msg_R), 0);
if (send_ok==-1 || send_ok < strlen(msg_R)) // la primitiva in caso si errore ret -1
{
printf("Invio di richiesta fallito, ritento\n");
}
else okk = 0;
}
}
else ok = 1;
}
printf("%s",msg); // ricevuto e stampo a video
close_ok = close(sk); // chiudo il so_cke_t
if (close_ok==-1) // la primitiva in caso si errore ret -1
{
printf("chiusura socket client fallito\n");
exit(1);
}
return 0;
}
//SERVER.c
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{ /***** variabili per modulo server *******/
struct sockaddr_in clientIP, myIP; //serve per comunicare tramite indirizzo col client
int err_bind;
int err_listen;
int err_accept;
int sk_server; //n° socket
char msg[26]; // scambio di messaggi
char msg_R[] = "che data/ora sono?";
char m[50];
int richiesta;
int send_ok, rec_ok;
int ok = 1;
time_t ora;
int close_ok;
socklen_t dim = sizeof(clientIP);
//Creo socket tramite taluna primitiva
sk_server=socket(AF_INET, SOCK_STREAM, 0); // fissa
if (sk_server==-1) // la primitiva in caso si errore ret -1
{
printf("Creazione socket fallito\n");
exit(1);
}
// Assegnamento degli indirizzi al server
memset(&myIP, 0, sizeof(myIP)); /* azzera la struttura*/
myIP.sin_family = AF_INET; /* IPv4 address */
myIP.sin_addr.s_addr = htonl(INADDR_ANY); /* network ordered */
myIP.sin_port=htons(1050);
// connetto local_inf al socket creato
err_bind = bind(sk_server, (struct sockaddr*) &myIP, sizeof(myIP));
if (err_bind==-1) // la primitiva in caso si errore ret -1
{
printf("Connessione fallita\n");
exit(1);
}
// server in ascolto su taluno socket
err_listen = listen(sk_server, 5) ; // 5 richieste da servire contemporaneamente
// che vanno nella coda di buffer
if (err_listen==-1) // la primitiva in caso si errore ret -1
{
printf("Non ascolto\n");
exit(1);
}
// accettazione della richiesta
err_accept = accept(sk_server, (struct sockaddr*) &clientIP, &dim);
if (err_accept==-1) // la primitiva in caso si errore ret -1
{
printf("Richiesta rifiutata \n");
exit(1);
}
// ricezione di richiesta data/ora
rec_ok = recv(sk_server, (void*)m, sizeof(msg_R), MSG_WAITALL);
richiesta = strcmp(m, msg_R);
if( (rec_ok == -1) || richiesta !=0)
{
printf("Packetloss \n");
}
else
{
// invio data/ora.
time(&ora);
ctime_r(&ora, msg);
send_ok = send(sk_server, (void *)msg, strlen(msg), 0);
while(ok == 1)
{
if (send_ok==-1 || send_ok < strlen(msg)) //in caso si errore ret -1
{
printf("Invio fallito, ritento\n");
}
else ok = 0;
}
}
close_ok = close(sk_server);
if (close_ok==-1) // la primitiva in caso si errore ret -1
{
printf("chiusura socket server fallito\n");
exit(1);
}
return 0;
}