[C][RISOLTO]: Problema invio-ricezione stringhe a socket
Inviato: mercoledì 11 maggio 2016, 18:23
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"):
ma anche in questo caso i caratteri che riceve il sono �'��y�. C' è qualcosa di sbagliato nel codice postato?
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));
}