Grande problema esercizio di C Socket inverti stringa

di il
2 risposte

Grande problema esercizio di C Socket inverti stringa

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:
31006_b30fd3e0d67dfb9a12bc809bb94225eb.png
31006_b30fd3e0d67dfb9a12bc809bb94225eb.png

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte