Skip to content
Snippets Groups Projects
Commit 4acfad7d authored by Gianluca's avatar Gianluca
Browse files

da finire

parent d504db52
No related branches found
No related tags found
No related merge requests found
File added
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char valueToSend[256] = {'\0'};
char valueToReceive[256] = {'\0'};
char iterationsServer[256] = {'\0'};
int iterations;
struct timeval startTime, endTime;
double timeServ;
printf("Inserire il numero di iterazioni: ");
scanf("%d", &iterations);
if (!iterations) {
exit(1);
}
snprintf(iterationsServer, sizeof(iterationsServer), "%d", iterations);
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
char buffer[256] = "";
struct sockaddr_in simpleServer;
if (argc != 3) {
fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]);
exit(1);
}
/* create a streaming socket */
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
} else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for connecting */
simplePort = atoi(argv[2]);
/* setup the address structure */
/* use the IP address sent as an argument for the server address */
// bzero(&simpleServer, sizeof(simpleServer));
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
// inet_addr(argv[2], &simpleServer.sin_addr.s_addr);
simpleServer.sin_addr.s_addr = inet_addr(argv[1]);
simpleServer.sin_port = htons(simplePort);
/* connect to the address and port with our socket */
returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer,
sizeof(simpleServer));
if (returnStatus == 0) {
printf("Connect successful!\n");
} else {
fprintf(stderr, "Could not connect to address!\n");
close(simpleSocket);
exit(1);
}
// Inviando il numero di iterazioni al server
write(simpleSocket, iterationsServer, strlen(iterationsServer));
// Avvio il timer
gettimeofday(&startTime, NULL);
// Aspettando l'ACK
read(simpleSocket, valueToReceive, sizeof(valueToReceive));
if (strcmp(valueToReceive, "ACK") != 0) {
fprintf(stderr, "Invalid ACK");
exit(0);
}
printf("%s\n", valueToReceive);
int i = 0;
while (i < iterations) {
int num1;
int num2;
char operator;
// Pulisco i buffer
memset(&valueToReceive, '\0', sizeof(valueToReceive));
memset(&valueToSend, '\0', sizeof(valueToSend));
printf("Inserire il valore da voler inviare al server con il formato num "
"num operator: ");
scanf("%d %d %c", &num1, &num2, &operator);
if (valueToSend[0] == '\0') {
fprintf(stderr, "Impossibile inviare una riga vuota!");
} else {
write(simpleSocket, valueToSend, strlen(valueToSend));
read(simpleSocket, valueToReceive, sizeof(valueToReceive));
printf("\n\nEcho: %s\n", valueToReceive);
++i;
}
}
// Invio il BYE
memset(&valueToSend, '\0', sizeof(valueToSend));
snprintf(valueToSend, sizeof(valueToSend), "BYE");
write(simpleSocket, valueToSend, sizeof(valueToSend));
// Aspettando l'ACK
read(simpleSocket, valueToReceive, sizeof(valueToReceive));
if (strcmp(valueToReceive, "ACK") != 0) {
fprintf(stderr, "Invalid ACK");
exit(0);
}
printf("%s\n", valueToReceive);
close(simpleSocket);
// Spengo il timer
gettimeofday(&endTime, NULL);
timeServ = (endTime.tv_sec + (endTime.tv_usec / 1000000.0)) -
(startTime.tv_sec + (startTime.tv_usec / 1000000.0));
printf("Service Time: %.2f", timeServ);
return 0;
}
all: client server
client: client.c
gcc client.c -o client
server: server.c
gcc server.c -o server
clean:
rm -f client server
File added
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
struct sockaddr_in simpleServer;
if (argc < 1 || argc > 2) {
fprintf(stderr, "Usage: %s <port>\n", argv[0]);
exit(1);
}
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
} else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for listening */
if (argc == 2) {
simplePort = atoi(argv[1]);
if (simplePort < 10000 || simplePort > 12000) {
fprintf(stderr, "Port must be in range [10000, 12000]\n");
exit(1);
}
} else {
srand(time(NULL));
simplePort = (rand() % 1999) + 10000;
}
/* setup the address structure */
/* use INADDR_ANY to bind to all local addresses */
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
simpleServer.sin_port = htons(simplePort);
/* bind to the address and port with our socket */
returnStatus = bind(simpleSocket, (struct sockaddr *)&simpleServer,
sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Bind completed on port %d!\n", simplePort);
} else {
fprintf(stderr, "Could not bind to address!\n");
close(simpleSocket);
exit(1);
}
/* lets listen on the socket for connections */
returnStatus = listen(simpleSocket, 5);
if (returnStatus == -1) {
fprintf(stderr, "Cannot listen on socket!\n");
close(simpleSocket);
exit(1);
}
struct sockaddr_in clientName = {0};
int simpleChildSocket = 0;
int clientNameLength = sizeof(clientName);
/* wait here */
while (1) {
char valueToSend[256] = {'\0'};
char valueToRead[256] = {'\0'};
simpleChildSocket =
accept(simpleSocket, (struct sockaddr *)&clientName, &clientNameLength);
if (simpleChildSocket == -1) {
fprintf(stderr, "Cannot accept connections!\n");
close(simpleSocket);
exit(1);
}
// Leggendo il numero di richieste da svolgere
read(simpleChildSocket, valueToRead, sizeof(valueToRead));
int iterations = atoi(valueToRead);
printf("Numero iterazioni: %d\n", iterations);
// Mando ACK al Client
snprintf(valueToSend, sizeof(valueToSend), "ACK");
write(simpleChildSocket, valueToSend, sizeof(valueToSend));
for (int i = 0; i < iterations; ++i) {
// Pulisco i buffer
memset(valueToRead, '\0', sizeof(valueToRead));
memset(valueToSend, '\0', sizeof(valueToSend));
// Leggo il valore ricevuto dal client e gli restituisco la lunghezza
read(simpleChildSocket, valueToRead, sizeof(valueToRead));
snprintf(valueToSend, sizeof(valueToSend), "%zu", strlen(valueToRead));
write(simpleChildSocket, valueToSend, sizeof(valueToSend));
}
memset(valueToRead, '\0', sizeof(valueToRead));
memset(valueToSend, '\0', sizeof(valueToSend));
// Aspetto il BYE dal client
read(simpleChildSocket, valueToRead, sizeof(valueToRead));
if (strcmp(valueToRead, "BYE") != 0) {
fprintf(stderr, "Invalid BYE\n");
exit(1);
}
printf("\tBYE RECEIVED\n");
// Invio ACK al Server
snprintf(valueToSend, sizeof(valueToSend), "ACK");
write(simpleChildSocket, valueToSend, sizeof(valueToSend));
close(simpleChildSocket);
}
close(simpleSocket);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment