codice:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
//#define MAX 8192 /* in bytes, 8KB */
int main() {
int sd;
struct sockaddr_in server_addr; /* l'indirizzo del server */
//char buff[MAX]; /* dati di invio e ricezione */
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
struct hostent *hp;
char ip;
printf("Inserisci l'indirizzo ip: ");
scanf("%s", &ip);
hp = gethostbyname(&ip);
server_addr.sin_family = AF_INET;
int porta;
printf("Inserisci la porta: ");
scanf("%d", &porta);
printf("-*-*-*-*-*--*-*-*-*-*-*-*-\n");
int arrayOp[2];
printf("Primo operando: ");
scanf("%d", &arrayOp[0]);
printf("Secondo operando: ");
scanf("%d", &arrayOp[1]);
printf("Scegli l'operazione da eseguire: (1.+ 2.- 3.* 4./ 5.esci)\n");
scanf("%d", &arrayOp[2]);
if(arrayOp[2]!= 5){
server_addr.sin_port = htons(porta);
/* successivamente viene memorizzato nella struttura server_addr */
server_addr.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr)) -> s_addr;
/* Viene creato il socket descriptor */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione della socket\n");
/* Viene connesso al server */
if(connect(sd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
printf("Errore di connessione al server\n");
send(sd, arrayOp, sizeof(arrayOp), 0);
recv(sd, arrayOp, sizeof(arrayOp), 0);
switch(arrayOp[2]){
case 1: printf("Addizione \n");
printf("%d + %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]+arrayOp[1]));
break;
case 2: printf("Sottrazione \n");
printf("%d - %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]-arrayOp[1]));
break;
case 3:
printf("Moltiplicazione \n"); printf("%d * %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]*arrayOp[1]));
break;
case 4:
printf("Divisione \n"); printf("%d / %d = %d\n", arrayOp[0], arrayOp[1], (arrayOp[0]/arrayOp[1]));
break;
case 5:
printf("ciao");
break;
default:
printf("Errore nello switch\n");
break;
}
}
close(sd);
return 0;
}
SERVER
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <time.h>
/*#include <arpa/inet.h>*/ /* Se si vuole visualizzare l'indirizzo ip del client, decommentare questa riga */
//#define MAX 8192 /* in bytes, 8KB */
int main()
{
//char buff[MAX]; /* dati di invio e ricezione */
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
/*
* Creazione socket descriptor per il server.
* AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
*/
if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione del server\n");
/*
* Inseriamo nella struttura alcune informazioni
*/
server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(4000); /* la porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */
/*
* Assegnazione del processo alla socket tramite la funzione BIND
*/
if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
printf("Errore di binding\n");
/*
* Si mette in ascolto con un massimo di 20 connessioni
*/
int arrayOp[2];
while(arrayOp[2] != 5)
{
listen (sd_server, 20);
/*
* Essendo un server monothreading, accetterà una sola connessione per volta
*/
int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
/* Con opportune modifiche si potrebbe vedere anche l'ip del client */
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
printf("Errore nella chiamata accept\n");
/* si ricevono i dati dal client */
recv(sd_client, arrayOp, sizeof(arrayOp), 0);
printf("Operando 1--> %d | Operando 2 --> %d | scelta --> %d\n", arrayOp[0], arrayOp[1], arrayOp[2]);
if(arrayOp[2]==1)
{
//ris = op1 + op2;
//send(sd_client, arrayOp, sizeof(arrayOp), 0);
arrayOp[2]=1;
}
else if(arrayOp[2]==2)
{
//ris = op1 - op2;
//send(sd_client, arrayOp, sizeof(arrayOp), 0);
arrayOp[2]=2;
}
else if(arrayOp[2]==3)
{
//ris = op1 * op2;
arrayOp[2]=3;
}
else if(arrayOp[2]==4)
{
//ris = op1 / op2;
arrayOp[2]=4;
}
else if(arrayOp[2]==5)
{
arrayOp[2]=5;
}
/* si spedisce un messaggio */
send(sd_client, arrayOp, sizeof(arrayOp), 0);
}
/* chiusura del socket descriptor */
close(sd_server);
close(sd_client);
return 0;
}