Salve a tutti mi sono appena iscritto a questo forum, non che un grande noob nella programmazione, ma sono molto determinato a imparare. Sto avendo un problema con questo esercizio, questo è il testo:
Esercizio
Scrivere un’applicazione client/server in cui:
• Il client, in un ciclo infinito:
– Legge una stringa da standard input
– Invia al server la stringa.
• Il server visualizza:
– risponde al client mandando la stringa ricevuta ma invertita
• Client e server terminano quanto l’utente digita la
stringa “exit”
• N.B usare le socket stream
Il programma funziona solo alla "prima iterazione", alla seconda funziona solo se ripremo invio, facendomi però ricominciare il while. Poi non funziona e basta. È stato scritto su geany e uso gcc come compilatore. Mi trovo su macchina ubuntu versione 18 mi pare
Grazie mille per gli aiuti, ricordo che sono un gran nabbo.
PS:In allegato c'è un'immagine dell'output del client.
PPS: QUESTO ESERCIZIO È UN SEMPLICE ESERCIZIO DATOCI PER ESERCITARCI E NON COMPORTA ALCUNA VALUTAZIONE O ALTRO.
Io ho scritto questo CODICE per il SERVER;
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define BUFF_SIZE 256
#define PORT_NUM 5000
void error(char *msg) {
perror(msg);
error(1);
}
void invertistringa(char array[]);
int main () {
int sockfd, newsockfd, portno, clilen;
char buffer[BUFF_SIZE];
struct sockaddr_in serv_addr, cli_addr;
int n;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = PORT_NUM;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
while(1) {
bzero(buffer, BUFF_SIZE);
n = read(newsockfd, buffer, BUFF_SIZE-1);
if(n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n", buffer);
if(n < 0) error("Writing to socket");
if(strcmp(buffer, "exit\n") == 0) {
n = write(newsockfd, "\nBye\n", 4);
if(n < 0) error("ERROR writing to socket");
close(newsockfd);
exit(0);
}else {
invertistringa(buffer);
n = write(newsockfd, buffer, sizeof(buffer));
}
}
close(newsockfd);
return 0;
}
void invertistringa(char array[]) {
int dimensione = strlen (array);
for(int i = 0; i<(dimensione/2);i++) {
char a = array[i];
array[i] = array[dimensione - i -1];
array [dimensione -i -1] = a;
}
//return;
}
E questo CODICE per il CLIENT:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define BUFF_SIZE 256
#define PORT_NUM 5000
#define HOST_NAME "localhost"
void error (char *msg){
perror(msg);
exit(0);
}
int main () {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[BUFF_SIZE];
int not_end = 1;
portno = PORT_NUM;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
error("ERROR opening socket.");
server = gethostbyname(HOST_NAME);
if(server == NULL) {
fprintf(stderr, "ERROR, no such host\n");
error(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if(connect(sockfd,(struct sock_addr *)&serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting");
while(not_end) {
printf("Please enter the message:");
bzero(buffer, BUFF_SIZE);
fgets(buffer, BUFF_SIZE-1, stdin);
n = write(sockfd, buffer, strlen(buffer));
if(n < 0)
error("ERROR writing to socket");
if(strcmp("exit\n", buffer) == 0) {
printf("\nclosing the socket...\n");
not_end = 0;
}
bzero(buffer, BUFF_SIZE);
n = read(sockfd, buffer, BUFF_SIZE-1);
if(n < 0)
error("ERROR reading from socket");
printf("%s\n", buffer);
}
close(sockfd);
return 0;
}
Allegati: