View Full Version : programmino scolastico client server
: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?
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);
}
}
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...
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:
mi da gli errori piu' strani.. il linker.. le librerie boh...
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
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:
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
ora sembra andare almeno la compilazione :D
ora provo a creare il programma server e faccio qualke esperimento
grazie 1000 :)
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).
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++
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 ;)
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
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
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 ;)
[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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.