Salve.
Ho due semplici programmi che comunicano tramite un socket TCP. I programmi sono scritti in C++ (ma sostituendo i cout e cin con istruzioni printf e scanf possono senza problemi essere ricondotti al C) e vengono eseguiti sotto Linux. Eccoli:
client.cpp
codice:
#include <iostream>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <netdb.h>
#define PORT 30000
using namespace std;
struct Data
{
int n;
int* v;
};
int main(int argc,char *argv[])
{
char *host;
struct hostent *hp;
struct sockaddr_in sin;
int sock;
Data d;
if (argc==2)
{
host=argv[1];
}
else
{
cout << "usage: client iphost" << endl;
exit(1);
}
hp=gethostbyname(host);
if (!hp)
{
cout << "client: errore host" << endl;
exit(1);
}
bzero((char *)&sin,sizeof(sin));
sin.sin_family=AF_INET;
bcopy(hp->h_addr,(char *)&sin.sin_addr,hp->h_length);
sin.sin_port=htons(PORT);
if ((sock=socket(PF_INET,SOCK_STREAM,0))<0)
{
cout << "client: errore socket" << endl;
exit(1);
}
if (connect(sock,(struct sockaddr *)&sin,sizeof(sin)) <0)
{
cout << "client: errore connect" << endl;
close(sock);
exit(1);
}
while(1)
{
cout << "Quanti elementi vuoi inserire?" << endl;
cin >> d.n;
d.v=new int[d.n];
for (int i=0;i<d.n;i++)
cin >> d.v[i];
send(sock,&d,sizeof(d),0); //ATTENZIONE: ERRORE! La variabile d contiene il puntatore d.v ma non il vettore in heap!!!
}
close(sock);
return 0;
}
server.cpp
codice:
#include <iostream>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <netdb.h>
#define PORT 30000
using namespace std;
struct Data
{
int n;
int* v;
};
int main()
{
struct sockaddr_in sin;
int sock,newsock;
int len;
Data d;
bzero((char*)&sin,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_port=htons(PORT);
if ((sock=socket(PF_INET,SOCK_STREAM,0))<0)
{
cout << "server: errore socket" << endl;
exit(1);
}
if (bind(sock,(struct sockaddr*)&sin,sizeof(sin))<0)
{
cout << "server: errore bind" << endl;
exit(1);
}
listen(sock,5);
while (1)
{
if ((newsock=accept(sock,(struct sockaddr *)&sin,(socklen_t *)&len))<0)
{
cout << "server: errore accept" << endl;
exit(1);
}
while (len=recv(newsock,&d,sizeof(d),0))
{
for (int i=0;i<d.n;i++)
cout << d.v[i] << " "; //ATTENZIONE: ERRORE!
cout << endl;
}
close(newsock);
}
return 0;
}
Il mio scopo sarebbe inviare una variabile strutturata di tipo Data (compreso il vettore di interi). I programmi, ovviamente, non funzionano come si desidererebbe, in quanto il tipo strutturato Data contiene un puntatore a intero e inviando una variabile strutturata di tale tipo si invia solo il puntatore d.v ma non il vettore puntato. Il tutto sarebbe risolvibile utilizzando per d.v un vettore classico anziché un vettore allocato in heap, tuttavia non essendo nota a priori la lunghezza vorrei evitare di inviare una marea di dati inutili mettendo array a dimensione prefissata.
Vengo quindi al mio primo quesito: esiste un modo per inviare una struttura dati che contiene un puntatore, ed inviare, quindi, anche i dati puntati? :master:
Ho poi da porre un'altro quesito, ma un po' collegato all'esempio che ho fatto. In realtà io più che inviare una variabili strutturate con dati allocati in heap (come il tipo Data dell'esempio) necessiterei di inviare array di variabili di questo tipo, e mi farebbe comodo usare gli stl container messi a disposizione dal C++ (mi riferisco, ad esempio, a classi come vector, set e map). Esiste un modo per inviare dati di questo tipo? :master: (se non fosse possibile vedrò di arrangiarmi con un array normale, ma devo comunque risolvere il primo dubbio sui dati allocati dinamicamente)
Grazie.