PDA

Visualizza la versione completa : [c/c++] invio dei dati via rete


nik600
31-10-2004, 13:33
ciao

scusatemi se apro un'altro post su questo argomento ma penso che sia sostazialmente diverso da quello che ho aperto (e che grazie al vostro aiuto ho risolto) ieri.

dunque vorrei qualche chiarimento sul trasferimento dei dati via rete, i dati possono essere inviati solo come stringhe? e poi vanno fatti i relativi cast o è possibile inviare i dati in formato binario (credo e spero di si ;-) )

ad esempio: se io volessi inviare il contenuto di un array ...come posso fare?

e di un array multimensionale?

e se volessi inviare un oggetto addirittura? (non arebbe senso mandare il puntatore dell'oggetto...) che sene fa l'altra macchina di un indirizzo di memoria che punta chissà dove?

grazie mille

daniele_dll
31-10-2004, 23:42
beh...tramite rete puoi inviare dei dati...numeri...stringhe...oggetti...sono solo dati :)

oggetti...nell'elenco stona, xche in realtà non puoi mandare un'oggetto...xche un'oggetto ha certi riferimenti in memoria e mandare un puntatore non avrebbe senso...xo puoi mandare TUTTE le propietà di un singolo oggetto...in modo che il soft che riceve le info possa creare un'oggetto con le propietà del primo e quindi lavorare usando i settaggi del primo

via rete puoi mandare solo dati...dati...ovvero byte...quello che ci sta li dentro è una sua scelta...se vuoi mandare stringhe...se vuoi scriverti un protocollo...quello che vuoi ma sono solo, come dici tu, stringhe :)))

nik600
01-11-2004, 16:04
ciao

ti ringrazio della risposta, ma quindi, se io volessi inviare il contenuto di un array...cosa dovrei fare? e quali librerie dovrei utilizzare?

ad esempio ora sto usando una libreria cnaiapi.h che ho trovato sul libro di testo che ci hanno consigliato all'uni x il corso di reti...

ti posto un pezzo di codice:



#include <stdlib.h>
#include <stdio.h>
#include <cnaiapi.h>
#include <unistd.h>

int main(int argc,char **argv){

computer comp;
appnum app;
connection conn;

//definizione dati
char saluto[]={"ciao come va\r\n"};

if (argc<2||argc>3){
fprintf(stderr,"utilizzo: %s <indirizzo server> [porta]\n",argv[0]);
exit(1);
}

/*converte gli argomenti passati nel nome macchina e nella porta*/

comp=cname_to_comp(argv[1]);

if(comp==-1){
exit(1);
}

if (argc==3){
app=(appnum)atoi(argv[2]);
}else{
if((app=appname_to_appnum("echo"))==-1){
exit(1);
}
}

/*viene stabilita una connessione con l'echoserver*/

conn=make_contact(comp,app);

if(conn<0){
exit(1);
}

//invio i dati al server

send(conn,saluto,strlen(saluto),0);

return 0;
}


questo semplice programmino chiamato con

#nome_programma <ip_server> [porta]

invia la stringa "ciao come va" al server sulla porta scelta...se volessi mandare il contenuto di un array ...cosa dovrei fare?

grazie

(ora che ci penso...una stringa è un'array...) quindi non dvrei fare niente? e dall'altra parte come ricevo i dati e li assegno all'array?

daniele_dll
01-11-2004, 16:36
costruisciti una stringa con il contenuto di un'array :)

creati una funzione implode che non fa altro che "imploderti", ovvero unirti, una stringa da un'array tramite un separatore :)

ovvero...
se hai un'array di X elementi...devi calcolarti lo spazio totale di memoria che hai bisogno...quindi hai bisogno di sapere quanti byte occupa l'array in totale...a questo punto aggiungi a questo spazio lo spazio necessario per i delimitatori...essendo che il delimitatore che si sceglie può essere + di un carattere...devi fare una cosa tipo questa

array è l'array passato
str_size è la dimensione della stringa



int array_numelements = sizeof(array) / sizeof(array[0]);
.
. calcoli la memoria necessaria per i vari elementi nell'array
.
str_memsize += (strlen(delimiter)-1) * array_numelements;
str_memsize++;


alla fine aggiungo un carattere in + per il NULL finale
usi malloc...ti allochi la memoria necessaria e ti crei la stringa con il contenuto che ti serve...
per copiare all'interno usi le funzioni per le stringhe...o direttamente lavori usando il puntatore vedi un po tu

PS: fatto cosi ci deve essere almeno un'elemento nell'array, ovvero l'elemento zero, altrimenti ti becchi un bel segfault sulla riga che calcola

PS2: non so se esiste l'implode o il join in, cosa possibile, cmq da un punto di vista di studio potresti provare a costruirtelo tu :)

PS3: quello che effettivamente ti rimane da fare è di calcolare la dimensione necessaria per il contenuto dell'array e poi assemblare tutto

PS4: non prendere in parola quello che ho scritto...vedi se effettivamente calcola correttamente la memoria necessaria prima di metterti a scrivere il resto senno rischi di perdere un sacco di tempo poi per capire xche non va :)

sciauz

nik600
01-11-2004, 17:02
ma allora alla fine è come dicevo io!

si usano le stringhe...

grazie x l'aiuto! ti farò sapere...

:ciauz:

Loading