PDA

View Full Version : programmino scolastico client server


PacManZ
10-03-2006, 18:49
:help:

compilo con devc++, ma nella riga

struct sockaddr_in server;


il compilatore mi da questo errore "storage size of 'server' isn't known"
che diavolo significa?

PacManZ
10-03-2006, 19:42
non avevo la libreria netinet/in.h ...
ora pero' mi da un sacco di errori di linker...
provo a postare il codice

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define PORT 4000

void main(int argc,char *argv[])
{
struct sockaddr_in server;
int sd,errore,i;
char c;
FILE *punt;
server.sin_family=AF_INET;
server.sin_port=htons((u_short)PORT);
server.sin_addr.s_addr=inet_addr(argv[1]);
sd=socket(AF_INET,SOCK_STREAM,0);
errore=connect(sd,(struct sockaddr*)&server,sizeof(server));
if (errore)
printf("Connessione non avvenuta.");
else
{
i=0;
while (argv[2][i]!='\0')
{
i++;
send(sd,&c,i,0);
}
c='*';
send(sd,&c,1,0);
punt=fopen(argv[3],"w");
i=recv(sd,&c,1,0);
while(i>0)
{
fprintf(punt, "%c",c);
c=recv(sd,&c,1,0);
}
fclose(punt);
close(sd);
}
}

71104
10-03-2006, 20:15
eeeeehhhhhhh??????? ma che hai incluso?? :mbe: ma scusa, includi semplicemente winsock.h e poi linka a ws2_32.lib ... sei su Windows mica su Linux...

PacManZ
10-03-2006, 20:30
ah si?
io ho provato a scrivere il programma che il prof ha scritto alla lavagna :D
il prof e' bravo ed e' stato capace di farmi capire quasi tutto, ma non ci ha detto che il programma andasse sotto linux... :stordita:

PacManZ
10-03-2006, 20:52
mi da gli errori piu' strani.. il linker.. le librerie boh...

wisher
10-03-2006, 21:00
devi passare in compilazione -l e la libreiria dll che ti hanno segnalato prima.
se ci dici con cosa compili possiamo esserti di maggiore aiuto
ciao

PacManZ
10-03-2006, 21:08
uso devc++ 4.9.9.2

ho provato a togliere un po di include e a mettere il winsock.h

#include <stdio.h>
#include <winsock.h>
#define PORT 4000

void main(int argc,char *argv[])
{
struct sockaddr_in server;
int sd,errore,i;
char c;
FILE *punt;
server.sin_family=AF_INET;
server.sin_port=htons((u_short)PORT);
server.sin_addr.s_addr=inet_addr(argv[1]);
sd=socket(AF_INET,SOCK_STREAM,0);
errore=connect(sd,(struct sockaddr*)&server,sizeof(server));
if (errore)
printf("Connessione non avvenuta.");
else
{
i=0;
while (argv[2][i]!='\0')
{
i++;
send(sd,&c,i,0);
}
c='*';
send(sd,&c,1,0);
punt=fopen(argv[3],"w");
i=recv(sd,&c,1,0);
while(i>0)
{
fprintf(punt, "%c",c);
c=recv(sd,&c,1,0);
}
fclose(punt);
close(sd);
}
}


come si fa a includere una libreria??
fino a oggi ho solo incluso file .h (quindi immagino solo headers) :muro:

vlacus
10-03-2006, 21:31
passare a linux no?...

PacManZ
10-03-2006, 21:37
sto pensando di fare una partizione per linux, ma preferirei far girare il programmino anke su windows...

AbuJaffa
10-03-2006, 21:38
Anzitutto la gestione del winsock è leggermente diverso dalla programmazione di rete in linux. Prima di usare le funzioni di winsock, bisogna preliminarmente usare la seguente funzione che non fa altro che inizializzare la windows socket.

int winDLLstart(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup(wVersionRequested, &wsaData);
return(err);
}

Come potrai notare, sono nient'altro che luride convenzioni che Microsoft ha imposto ai programmatori windows. La parte importante è la WSAStartup().

per linkare la libwsock32.a fai...Progetto-->opzioni del progetto-->Parametri -->aggiungi libreria-->libwsock32.a

PacManZ
10-03-2006, 21:58
ora sembra andare almeno la compilazione :D

ora provo a creare il programma server e faccio qualke esperimento

grazie 1000 :)

71104
10-03-2006, 22:49
mi sa che mi sono sbagliato: il nome dell'header dovrebbe essere winsock2.h (mi so perso un 2); winsock.h è una sua vecchia versione. per quello che devi fare tu non dovrebbe cambiare nulla, ma non si sa mai. comunque come altri ti hanno giustamente detto, la gestione dei socket tra Windows e Linux presenta differenze piccole e molto bastarde (su Linux un valore di ritorno nullo vuol dire una cosa e su Windows vuol dire l'opposto) percui ci devi andare di #ifdef, ma io preferirei lavorare come dice il tuo professore; se proprio non vuoi fare il dual boot (e ti capisco) installati VMWare Workstation (se non erro ne esiste una versione gratis).

PacManZ
11-03-2006, 09:29
il server crasha dandomi un errore di segmentazione (accede a memoria non sua?)

#include <stdio.h>
#include <winsock2.h>
#define PORT 4000
#define MAXC 15

void main(void)
{
int winDLLstart(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup(wVersionRequested, &wsaData);
return(err);
}
struct sockaddr_in server,client;
int sd,new_sd,errore,i,j,client_len;
char c,nomefile[100];
FILE *punt;
server.sin_family=AF_INET;
server.sin_port=htons((u_short)PORT);
server.sin_addr.s_addr=INADDR_ANY;
sd=socket(AF_INET,SOCK_STREAM,0);
bind(sd,(struct sockaddr*)&server,sizeof(server));
listen(sd,MAXC);
while(1)
{
new_sd=accept(sd,(struct sockaddr*)&client,&client_len);
i=recv(new_sd,&c,1,0);
j=0;
while((i>0) && (c!='*'))
{
nomefile[j]=c;
j++;
i=recv(new_sd,&c,1,0);
}
nomefile[j]='\0';
punt=fopen(nomefile, "r");
fscanf(punt,"%c",&c);
while(!feof(punt))
{
send(new_sd,&c,1,0);
fscanf(punt,"%c",&c);
}
fclose(punt);
close(new_sd);
}
}



sono anke disposto a fare il dual boot, ma dovrei svuotare un po' D: e fare un'altra partizione... e credo che faro' cosi'. Ke linux scarico pero' :mbe: e che compilatore c/c++

VICIUS
11-03-2006, 10:16
sono anke disposto a fare il dual boot, ma dovrei svuotare un po' D: e fare un'altra partizione... e credo che faro' cosi'. Ke linux scarico pero' :mbe: e che compilatore c/c++
Open SuSE è piuttosto facile da installare e gestire per un principiante. Per il compilatore su linux c'è gcc che va benissimo ed è gia incluso.

ciao ;)

wisher
11-03-2006, 10:17
il server crasha dandomi un errore di segmentazione (accede a memoria non sua?)

#include <stdio.h>
#include <winsock2.h>
#define PORT 4000
#define MAXC 15

void main(void)
{
int winDLLstart(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup(wVersionRequested, &wsaData);
return(err);
}
struct sockaddr_in server,client;
int sd,new_sd,errore,i,j,client_len;
char c,nomefile[100];
FILE *punt;
server.sin_family=AF_INET;
server.sin_port=htons((u_short)PORT);
server.sin_addr.s_addr=INADDR_ANY;
sd=socket(AF_INET,SOCK_STREAM,0);
bind(sd,(struct sockaddr*)&server,sizeof(server));
listen(sd,MAXC);
while(1)
{
new_sd=accept(sd,(struct sockaddr*)&client,&client_len);
i=recv(new_sd,&c,1,0);
j=0;
while((i>0) && (c!='*'))
{
nomefile[j]=c;
j++;
i=recv(new_sd,&c,1,0);
}
nomefile[j]='\0';
punt=fopen(nomefile, "r");
fscanf(punt,"%c",&c);
while(!feof(punt))
{
send(new_sd,&c,1,0);
fscanf(punt,"%c",&c);
}
fclose(punt);
close(new_sd);
}
}



sono anke disposto a fare il dual boot, ma dovrei svuotare un po' D: e fare un'altra partizione... e credo che faro' cosi'. Ke linux scarico pero' :mbe: e che compilatore c/c++
x il momento potresti anche usare una distribuzione live (knoppix è la più diffusa) e poi salvare i dati su un disco/penna usb...
come compilatore c'è gcc (è da shell) e dovrebbe essere già pronto all'uso
ciao

71104
11-03-2006, 12:42
Open SuSE è piuttosto facile da installare e gestire per un principiante. Per il compilatore su linux c'è gcc che va benissimo ed è gia incluso.

ciao ;) io per fare un esame universitario ho installato Fedora Core 4 su VMWare Workstation e devo dire che mi ci son trovato benissimo: installazione semplicissima, poi ho scelto GNOME (era la scelta di default ma l'avrei scelta comunque perché DanieleC88 insisteva a consigliarmela :D), tutto parte, tutto a posto, tutto regolare; insomma non posso lamentarmi, mi stava quasi quasi iniziando a venire voglia di diventare un guru di Linux dopo esserlo stato di Windows NT :D

VICIUS
11-03-2006, 12:50
io per fare un esame universitario ho installato Fedora Core 4 su VMWare Workstation e devo dire che mi ci son trovato benissimo: installazione semplicissima, poi ho scelto GNOME (era la scelta di default ma l'avrei scelta comunque perché DanieleC88 insisteva a consigliarmela :D), tutto parte, tutto a posto, tutto regolare; insomma non posso lamentarmi, mi stava quasi quasi iniziando a venire voglia di diventare un guru di Linux dopo esserlo stato di Windows NT :D
Si so quanto può diventare insistente daniele :D
Cmq. se ti piace smanettare e programmare Linux è sicuramente meglio di Windows. Puoi mettere le mani al codice di tutto il sistema fino ad arrivare ai driver e il kernel.

ciao ;)

Mixmar
11-03-2006, 15:06
[CUT] se proprio non vuoi fare il dual boot (e ti capisco) installati VMWare Workstation (se non erro ne esiste una versione gratis).

VMWare Workstation non è gratuito, ma c'è una versione di prova per 30 giorni; alternativamente, è possibile usare VMWare Player, che è gratuito (è uguale alla Workstation, accetta le stesse macchine virtuali, ma non si possono creare macchine nuove nè modificare i parametri di quelle esistenti). Per utilizzare macchine Linux, va molto bene poichè trovate sullo stesso sito della VMWare delle macchine già pronte: inoltre esiste una communità di appassionati che ne ha create diverse configurate per molti scopi diversi.

In sintesi: basta scaricare e lanciare il player... :D