#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0
#define IP_SIZE 16 //lunghezza massima della stringa IP
#define PORT_SIZE 7 //lunghezza massima della stringa IP
#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1" // Indirizzo di default
void errorHandler(string);
void clearWinSock();
void initWinSock();
void handleConnection(socket_descriptor);
int main(void) {
initWinSock();
// CREAZIONE DELLA SOCKET
int clientSocket;
clientSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket < 0) {
errorHandler("socket creation failed.\n");
clearWinSock();
return 0;
}
int port_server;
string ip_server = (string) malloc(IP_SIZE);
string port = (string) malloc(PORT_SIZE);
printf("Inserisci l'indirizzo ip del server...(127.0.0.1 di default) ");
fgets(ip_server, IP_SIZE, stdin);
printf("Inserisci il numero di porta del server...(45890 di default) ");
fgets(port, PORT_SIZE, stdin);
if (strcmp(ip_server, "\n") == 0)
ip_server = IP;
else
ip_server[strlen(ip_server) - 1] = '\0';
if (strcmp(port, "\n") == 0)
port_server = PORT;
else {
port[strlen(port) - 1] = '\0';
port_server = atoi(port);
}
// COSTRUZIONE DELL’INDIRIZZO DEL SERVER
struct sockaddr_in sad;
memset(&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr = inet_addr(IP); // IP del server
sad.sin_port = htons(port_server); // Server port
// CONNESSIONE AL SERVER
if (connect(clientSocket, (struct sockaddr *) &sad, sizeof(sad)) < 0) {
errorHandler("Failed to connect.\n");
printf("ERRORE NUMERO %d", errno);
closesocket(clientSocket);
clearWinSock();
return 0;
}
printf("[INFO] Connessione avvenuta\n");
handleConnection(clientSocket);
printf("[INFO] Connessione chiusa\n");
//free(ip_server);
//free(port);
// CHIUSURA DELLA CONNESSIONE
closesocket(clientSocket);
clearWinSock();
return (0);
}
void handleConnection(socket_descriptor clientSocket) {
string input = (string) malloc(BUFFERSIZE);
string buf = (string) malloc(BUFFERSIZE);
do {
printf("\nScegli tra i seguenti comandi:\n");
printf("c s1 s2 (concatena la stringa s1 con s2)\n");
printf("u s (converte la stringa s in lettere maiuscole)\n");
printf("l s (converte la stringa s in lettere minuscole)\n");
printf(
"f s1 s2 (restituisce true se s1 occorre in s2, false altrimenti)\n");
printf("n s (restituisce la lunghezza della stringa s)\n");
printf(
"nc s (restituisce il numero di consonanti presenti nella stringa s)\n");
printf(
"nv s (restituisce il numero di vocali presenti nella stringa s)\n");
printf("q (il client si disconnette)\n");
fgets(input, BUFFERSIZE, stdin);
int stringLen = strlen(input); // Determina la lunghezza
input[stringLen - 1] = '\0'; //Elimina il new line finale
//INIZIO COMUNICAZIONE
printf("[INFO] Sto per inviare: \"%s\"\n", input);
// INVIARE DATI AL SERVER
if (send(clientSocket, input, stringLen, 0) != stringLen) {
errorHandler("send() error");
closesocket(clientSocket);
clearWinSock();
exit(0);
}
// RICEVERE DATI DAL SERVER
int bytesRcvd;
printf("[INFO] Attendo risposta\n");
if ((bytesRcvd = recv(clientSocket, buf, BUFFERSIZE - 1, 0)) <= 0) {
errorHandler("recv() error");
closesocket(clientSocket);
clearWinSock();
exit(0);
}
buf[bytesRcvd] = '\0';
printf("[INFO] Risposta ricevuta: \"%s\"\n", buf); // Print the echo buffer
} while (input[0] != 'q');
}
void errorHandler(string errorMessage) {
printf("%s", errorMessage);
}
void clearWinSock() {
#if defined WIN32
WSACleanup();
#endif
}
//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
errorHandler("Error at WSAStartup()\n");
exit(0);
}
#endif
}
#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1"
#define QLEN 10
typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0
void errorHandler(string);
void clearWinSock();
void initWinSock();
string c(string, string);
string u(string);
string l(string);
string f(string, string);
int n(string);
int nc(string);
int nv(string);
string q();
void handleClient(socket_descriptor);
int main(int argc, char *argv[]) {
int port_server;
if (argc > 1) {
port_server = atoi(argv[1]);
} else
port_server = PORT;
if (port_server < 0) {
printf("bad port number %s \n", argv[1]);
return 0;
}
initWinSock();
//CREAZIONE DELLA SOCKET
int mySocket;
mySocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mySocket < 0) {
errorHandler("socket creation failed. \n");
clearWinSock();
return 0;
}
// ASSEGNAZIONE DI UN INDIRIZZO ALLA SOCKET
struct sockaddr_in sad;
memset(&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr = inet_addr("127.0.0.1");
sad.sin_port = htons(port_server);
if (bind(mySocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) {
errorHandler("bind() failed.\n");
closesocket(mySocket);
clearWinSock();
return 0;
}
// SETTAGGIO DELLA SOCKET ALL'ASCOLTO
if (listen(mySocket, QLEN) < 0) {
errorHandler("listen() failed.\n");
closesocket(mySocket);
clearWinSock();
return 0;
}
// ACCETTARE UNA NUOVA CONNESSIONE
struct sockaddr_in cad; // structure for the client address
int clientSocket; // socket descriptor for the client
unsigned int clientLen; // the size of the client address
printf("[INFO] Waiting for a client to connect...\n");
fflush(stdout);
while (1) {
clientLen = sizeof(cad); // set the size of the client address
if ((clientSocket = accept(mySocket, (struct sockaddr *) &cad,
&clientLen)) < 0) {
errorHandler("accept() failed. \n");
// CHIUSURA DELLA CONNESSIONE
closesocket(mySocket);
clearWinSock();
return 0;
}
printf("[INFO] Connesso al client %s:%d\n", inet_ntoa(cad.sin_addr),
cad.sin_port);
handleClient(clientSocket);
}
}
void errorHandler(string errorMessage) {
printf("[ERROR] %s", errorMessage);
}
void clearWinSock() {
#if defined WIN32
WSACleanup();
#endif
}
//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
errorHandler("Error at WSAStartup()\n");
exit(0);
}
#endif
}
string c(string s1, string s2) {
string dest[BUFFERSIZE];
memset(dest, '\0', BUFFERSIZE);
strcat(dest, s1);
strcat(dest, s2);
return dest;
}
string u(string s) {
int i = 0;
for (i = 0; i < strlen(s); i++)
s[i] = toupper(s[i]);
return s;
}
string l(string s) {
int i = 0;
for (i = 0; i < strlen(s); i++)
s[i] = tolower(s[i]);
return s;
}
string f(string s1, string s2) {
string ret;
if (strstr(s2, s1) == NULL)
ret = "false";
else
ret = "true";
return ret;
}
int n(string s) {
return strlen(s);
}
int nc(string s) {
int i = 0, consonanti = 0, vocali = 0;
for (i = 0; i < strlen(s); i++)
if ((s[i] == 'a') || (s[i] == 'e') || (s[i] == 'i') || (s[i] == 'o')
|| (s[i] == 'u') || (s[i] == 'A') || (s[i] == 'E')
|| (s[i] == 'I') || (s[i] == 'O') || (s[i] == 'U'))
vocali++;
consonanti = strlen(s) - vocali;
return consonanti;
}
int nv(string s) {
int i = 0, vocali = 0;
for (i = 0; i < strlen(s); i++)
if ((s[i] == 'a') || (s[i] == 'e') || (s[i] == 'i') || (s[i] == 'o')
|| (s[i] == 'u') || (s[i] == 'A') || (s[i] == 'E')
|| (s[i] == 'I') || (s[i] == 'O') || (s[i] == 'U'))
vocali++;
return vocali;
}
string q() {
string ret = (string) malloc(BUFFERSIZE);
memset(ret, '\0', BUFFERSIZE);
return ret;
}
void handleClient(socket_descriptor clientSocket) {
string buf;
int finito = FALSE;
buf = (string) malloc(BUFFERSIZE);
do {
printf("[INFO] In attesa di comando\n");
int bytesRcvd = recv(clientSocket, buf, BUFFERSIZE - 1, 0);
buf[bytesRcvd] = '\0';
printf("[INFO] Ricevuto comando: \"%s\"\n", buf);
string ret = (string) malloc(BUFFERSIZE);
string s = (string) malloc(BUFFERSIZE);
string s1 = (string) malloc(BUFFERSIZE);
string s2 = (string) malloc(BUFFERSIZE);
string token = (string) malloc(BUFFERSIZE);
token = strtok(buf, " ");
int size;
switch (token[0]) {
case 'c':
s1 = strtok(NULL, " ");
s2 = strtok(NULL, " ");
ret = c(s1, s2);
break;
case 'u':
s = strtok(NULL, " ");
ret = u(s);
break;
case 'l':
s = strtok(NULL, " ");
ret = l(s);
break;
case 'f':
s1 = strtok(NULL, " ");
s2 = strtok(NULL, " ");
ret = f(s1, s2);
break;
case 'q':
ret = "bye";
finito = TRUE;
break;
case 'n':
size = strlen(token);
printf("LUNGHEZZA %d", size);
if (size == 1) {
s = strtok(NULL, " ");
printf("CALCOLO LUNGHEZZA DI %s", s);
int len = n(s);
sprintf(ret, "%d", len);
printf("SEMBRA SIA %s", ret);
} else {
switch (token[1]) {
case 'c':
s = strtok(NULL, " ");
int con = nc(s);
sprintf(ret, "%d", con);
break;
case 'v':
s = strtok(NULL, " ");
int voc = nv(s);
sprintf(ret, "%d", voc);
break;
default:
errorHandler("Comando inesistente");
break;
}
}
break;
default:
errorHandler("Comando inesistente");
break;
}
printf("[INFO] Il risultato della computazione è \"%s\"\n", ret);
int retLen = strlen(ret);
if (send(clientSocket, ret, retLen, 0) != retLen) {
errorHandler("send() error");
closesocket(clientSocket);
clearWinSock();
}
printf("[INFO] Risultato inviato\n");
} while (!finito);
free(buf);
}