Berkeley Sockets: come posso inviare una stringa?

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
zacmarco
Linux 0.x
Linux 0.x
Messaggi: 34
Iscritto il: gio 9 giu 2005, 0:00
Località: Foggia

Berkeley Sockets: come posso inviare una stringa?

Messaggio da zacmarco »

Codice: Seleziona tutto

//dichiarazione della struct da inviare al server
struct buffer{
	int ID;
   char nome[20];
};

//lato client
buffer buf;
buf.ID = 12345;
strcpy(buf.nome, "CIAO");
sendto(sd, &buf, sizeof(buf), 0, (const struct sockaddr *)&sad, len);

//lato server
recvfrom(sd, &buf, sizeof(buf), 0, (struct sockaddr *)&cad, (socklen_t*)&fromlen);

*** OUTPUT SERVER ***
ho ricevuto l'ID               : 12345
ho ricevuto la stringa         : CIAO
fin qui tutto ok! :D
se invece prova a sostituire il tipo del campo "nome" da char[] a string, e imposto la stringa con questa istruzione (invece di strcpy())

Codice: Seleziona tutto

 buf.nome = "CIAO";
il server non riceve più il valore corretto, escono output del tipo

Codice: Seleziona tutto

ho ricevuto l'ID               : 12345
M.ÿÿHßÕÿÿÿÿÿÿÿÿÿü#inga         : I..I.y. c.R.g.R.r.I.>B
(                 4
À
 žd@ðþÿÿoÿÿÿoðÿÿož
                 Ðd@0€@ ó       @°Ç@@
Ö@ð@r@0
@Ë
@°s@pÅ@°
@@
@°Ê°@LŸ
       @`Ÿ
          à
@@­        @ `@À
   @ ­
      à
@@Segmentation fault
string è incompatibile con le API sendto() e recvfrom()? o posso trovare un modo per aggirare il problema?

grazie!

Avatar utente
useless
Staff
Staff
Messaggi: 3896
Iscritto il: dom 12 ott 2003, 0:00
Località: A place where the streets have no name
Contatta:

Messaggio da useless »

è impostare le stringhe in C con un'assegnazione che è sbagliato, altrimenti che motivo avrebbe di esistere strcpy()? poi be', in C manco esiste il tipo string...
se ti riferisci al C++, pensa che quello che mandi con sendto() è una sequenza di byte. se vuoi mandare un oggetto (quale qualcosa di classe string) devi quindi serializzarlo e fare il contrario dall'altra parte. cosa + semplice presumo sia inviare la stringa in formato C che puoi ricavare con il metodo della classe string c_str() (o un nome simile, ravana un po').

ricordo, come al solito, che x i problemi di programmazione c'è un forum dedicato: http://www.nogood.it/prog/.

Rispondi