[C][RISOLTO]: Problema invio-ricezione stringhe a socket

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
GIus90
Prode Principiante
Messaggi: 7
Iscrizione: mercoledì 11 maggio 2016, 18:09
Distribuzione: Ubuntu 15.10
Sesso: Maschile

[C][RISOLTO]: Problema invio-ricezione stringhe a socket

Messaggio da GIus90 »

Sono alle prese con la realizzazione di una bacheca remota composta da un client e un server. Il server richiede l' accesso mediante user e pass.
In poche parole quando invio l' username, ad esempio "Marco", in ricezione sul server non ho la stringa "Marco", ma "Marco�y�". Ho provato mettendo il carattere '\0' come terminatore ma non funziona lo stesso, la stringa arriva sempre corrotta. (acquisisco da stdin,invio con write sul socket e ricevo con read )
Allora a questo punto ho realizzato un server e un client "minimali" per testare l' invio e la ricezione di stringhe (invio della stringa "Ciao"):

Codice: Seleziona tutto

***CODICE SERVER******

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>

#define PORT 1300
#define MAX_BUFFER 81
#define BACKLOG 3

int main () {
	int sockfd;
	int new_fd;
	struct sockaddr_in my_addr;
	struct sockaddr_in their_addr;        
	socklen_t sin_size;
	sockfd = socket (PF_INET,SOCK_STREAM,0);    /* descrittore socket*/
	if (sockfd <0)  {
		perror ("errore creazione socket");                                /* controllo errore descrittore */
		return (-1);
	}
	my_addr.sin_family = AF_INET;
	my_addr.sin_port= htons (PORT);
	my_addr.sin_addr.s_addr=INADDR_ANY ;
	memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
	
	if (bind (sockfd, (struct sockaddr *) &my_addr, sizeof (my_addr))<0){   /* associo indirizzo a socket e controllo errore*/
		perror ("errore creazione socket");  
		return -1;
	}
	if (listen (sockfd,BACKLOG)<0){   /* metto in ascolto sock con backlog 3 e controllo errore */
		perror ("errore creazione socket");  
		return -1;
	}
	
	sin_size= sizeof their_addr;
	if((new_fd= accept(sockfd,(struct sockaddr *)&their_addr, &sin_size))==-1){;
		printf("Errore nell' accept");
		exit(EXIT_FAILURE);

	}
	printf("sei connesso\n");
	char stringa[5];
	read(new_fd,stringa,5);
	printf("la stringa è: %s \n",stringa);
	
}

Codice: Seleziona tutto

******CODICE CLIENT*****

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define DEST_IP "10.0.2.15" 
#define DEST_PORT 1300
#define BUFFER 100

int main(void) {
int sockfd,sockconn;
struct sockaddr_in dest_addr; 
// conterrà l’indirizzo di destinazione
sockfd = socket(PF_INET, SOCK_STREAM, 0); /* esegui il controllo degli errori!*/
dest_addr.sin_family = AF_INET; // host byte order
dest_addr.sin_port = htons(DEST_PORT); // short, network byte order
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
// non dimenticare di controllare connect()!
sockconn= connect(sockfd, (struct sockaddr *)&dest_addr, sizeof dest_addr);
if(sockconn<0) printf("errore connect\n");
printf("Sei connesso\n");
char buffer[] = { 'C', 'i', 'a', 'o', '\0' };
write(sockconn,&buffer,strlen(buffer));
}
ma anche in questo caso i caratteri che riceve il sono �'��y�. C' è qualcosa di sbagliato nel codice postato?
Ultima modifica di GIus90 il giovedì 12 maggio 2016, 2:45, modificato 2 volte in totale.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Problema invio-ricezione stringhe a socket

Messaggio da Claudio_F »

Così a naso mi sembra che '&buffer' all'ultima riga del client sia sbagliato, per passare l'indirizzo della stringa non basta scrivere 'buffer' ?
Avatar utente
Dclaudio1990
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 624
Iscrizione: sabato 11 aprile 2015, 14:31
Distribuzione: openSUSE
Sesso: Maschile
Località: Roma

Re: Problema invio-ricezione stringhe a socket

Messaggio da Dclaudio1990 »

Claudio_F [url=http://forum.ubuntu-it.org/viewtopic.php?p=4881013#p4881013][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Così a naso mi sembra che '&buffer' all'ultima riga del client sia sbagliato, per passare l'indirizzo della stringa non basta scrivere 'buffer' ?
Si credo sia decisamente li il problema.
"Io penso, dunque sono, ossia esisto."
-René Descartes
GIus90
Prode Principiante
Messaggi: 7
Iscrizione: mercoledì 11 maggio 2016, 18:09
Distribuzione: Ubuntu 15.10
Sesso: Maschile

Re: Problema invio-ricezione stringhe a socket

Messaggio da GIus90 »

qui ho trovato un esempio illuminante che mi ha permesso di correggere il codice http://www.binarytides.com/server-clien ... ets-linux/
inoltre lascio ai posteri un paio di funzioni scritte da me per acquisire da standard input affinché non ci siano problemi di formattazione nell' invio di stringhe

Codice: Seleziona tutto

//acquisizione interi da tastiera

int scrivi_intero(){
	int ris=-1;
	while(1){
		char test=getchar();
		if(test!='\n') ungetc(test,stdin);
		char *p;
		char *buf=NULL;
		size_t count=0;
		if(getline(&buf,&count,stdin)>0){
		ris=strtoumax(buf,&p,10);
		if(*p=='\n'||*p=='\0'){
			break;
		}
		else printf("input non intero,riprova\n");
	}
}
return ris;
}


//acquisizione stringhe da tastiera

int scrivi_frase(char* testo_ris, int max_dim){
	int ret;
	char test=getchar();
	if(test!='\n') ungetc (test,stdin);
	while(1){
		char* app_line=NULL;
		size_t count=0;
		ret=getline(&app_line,&count,stdin);
		if (ret<=max_dim+1 && ret>=0){
			strcpy (testo_ris,app_line);
			ret--;
			testo_ris[ret]='\0';
			break;
		}
		printf("stringa troppo lunga [max %d caratteri] o errore nell' inserimento, riprovare\n" , max_dim);
	}
	return 0;
}
Vi ringrazio comunque delle risposte. Sono contento di aver scoperto quest' angolo del web dove confrontarsi sulla programmazione :D
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti