PDA

View Full Version : SOCKET C problemi


Fenomeno85
07-06-2004, 13:13
ciao a tutti, allora ricopio lo stesso codice che c'è sul mio libro di sistemi e non vuole funzionare! mi da errori sul main :(

//programma server

#ifndef unix
#define WIN32
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/type.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <string.h>

#define PROTOPORT 5193
#define QLEN 6
int visits = 0;

main (argc, argv)
int argc;
char *argv[];

{
struct hostent *ptrh;
struct protoent *ptrp;
struct sockaddr_in sad;
struct sockaddr_in cad;
int sd, sd2;
int port;
int alen;
char buf[1000];

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101, wsaData);
#endif

memset ((char *)&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr= INADDR_ANY;

if (argc > 1){
port = atoi(argv[1]);
} else {
port = PROTOPORT;
}

if (port > 0){
sad.sin_port = htons ((ushort)port);
} else {
fprintf (stderr, "bad port number %s\n", argv[1]);
exit (1);

}

if ((int)(ptrp = getprotobyname ("tcp"))) == 0){
fprintf (stderr, "cannot map \"tcp\" to protocol number");
exit (1);
}

sd = socket (PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd <0) {
fprintf (stderr, "creazione del socket fallita");
exit (1);
}

if (bind(sd,(struct sockaddr *)&sad,sizeof(sad)) <0){
fprintf (stderr, "fallita bind");
exit (1);
}

if (listen(sd, QLEN) < 0){
fprintf (stderr, "impossibile mettersi in ascolto");
}

while (1){
alen = sizeof (cad);
if ((sd2=accept(sd, (struct sockaddr *)&cad,&alen) <0){
fprintf(stderr,"accept fallita");
exit (1);
}
visits ++;
sprintf (buf, "Questo server è stato contattato per %d volt%s",&visits,visits==1?".":"e.");
send (sd2,buf, strlen(buf),0);
closesocket (sd2);
}

}

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Fenomeno85
07-06-2004, 13:25
stesso problema per il client :cry:

//programma client
#ifndef unix
#define WIN32
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/type.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <string.h>

#define PROTOPORT 5193
extern int errno;
char localhost[] = "localhost";

main (argc, argv)
int argc;
char *argv[];

{
struct hostent *ptrh;
struct protoent *ptrp;
struct sockaddr_in sad;
int sd;
int port;
char *host;
int n;
char buf[1000];

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101, wsaData);
#endif

memset ((char *)&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;


if (argc > 1){
port = atoi(argv[1]);
} else {
host = localhost;
}

if (port > 0){
sad.sin_port = htons ((ushort)port);
} else {
fprintf (stderr, "bad port number %s\n", argv[2]);
exit (1);

}

ptrh = gethostbyname(host);

if ((char *)ptrh)==NULL){
fprintf (stderr, "host invalido: %s\n", host);
exit (1);
}

memcpy (&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

if ((int)(ptrp = getprotobyname ("tcp"))) == 0){
fprintf (stderr, "cannot map \"tcp\" to protocol number");
exit (1);
}

sd = socket (PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd <0) {
fprintf (stderr, "creazione del socket fallita");
exit (1);
}

if (connect(sd,(struct sockaddr *)&sad,sizeof(sad)) <0){
fprintf (stderr, "fallita bind");
exit (1);
}

n = recv (sd,buf,sizeof(buf),0);
while (n>0){
write (1,buf,n);
n = recv (sd,buf,sizeof(buf,0);
}

closesocket (sd);
exit (0);



}

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Fenomeno85
07-06-2004, 15:13
miseriaccia nessuno sa qual'è il problema ?

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:17
Psta gli errori che ti da ;)

Fenomeno85
07-06-2004, 15:19
--------------------Configuration: server - Win32 Debug--------------------
Compiling...
server.cpp
c:\documents and settings\matteo\desktop\ripasso c file\server\server.cpp(4) : warning C4005: 'WIN32' : macro redefinition
unknown(0) : see previous definition of 'WIN32'
c:\documents and settings\matteo\desktop\ripasso c file\server\server.cpp(21) : error C2065: 'argc' : undeclared identifier
c:\documents and settings\matteo\desktop\ripasso c file\server\server.cpp(21) : error C2065: 'argv' : undeclared identifier
c:\documents and settings\matteo\desktop\ripasso c file\server\server.cpp(22) : error C2448: '<Unknown>' : function-style initializer appears to be a function definition
c:\documents and settings\matteo\desktop\ripasso c file\server\server.cpp(22) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

server.exe - 4 error(s), 1 warning(s)


MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:24
Leva questa: #define WIN32

Se non sbaglio diversi compilatori non supportano questo tipo di definizione delle funzioni (seppur standard):

main (argc, argv)
int argc;
char *argv[];

Fenomeno85
07-06-2004, 15:26
no se levo define mi da sempre gli errori.

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:30
WIN32 è già definita...quindi non la devi ridefinire... Per glia ltri errori ti ho detto perchè te lid a... Devi definire la funzione nel modo del vecchio standard:

main(int argc, char *argv[])

Fenomeno85
07-06-2004, 15:38
--------------------Configuration: server - Win32 Debug--------------------
Compiling...
server.cpp
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(47) : error C2065: 'ushort' : undeclared identifier
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(47) : error C2146: syntax error : missing ')' before identifier 'port'
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(47) : error C2059: syntax error : ')'
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(94) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.

server.exe - 3 error(s), 1 warning(s)


MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:42
Sostituisci ushort con unsigned short...

Fenomeno85
07-06-2004, 15:44
--------------------Configuration: server - Win32 Debug--------------------
Compiling...
server.cpp
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(94) : warning C4508: 'main' : function should return a value; 'void' return type assumed
C:\Documents and Settings\Matteo\Desktop\ripasso c file\server\server.cpp(22) : warning C4101: 'ptrh' : unreferenced local variable
Linking...
server.obj : error LNK2001: unresolved external symbol _closesocket@4
server.obj : error LNK2001: unresolved external symbol _send@16
server.obj : error LNK2001: unresolved external symbol _accept@12
server.obj : error LNK2001: unresolved external symbol _listen@8
server.obj : error LNK2001: unresolved external symbol _bind@12
server.obj : error LNK2001: unresolved external symbol _socket@12
server.obj : error LNK2001: unresolved external symbol _getprotobyname@4
server.obj : error LNK2001: unresolved external symbol _htons@4
server.obj : error LNK2001: unresolved external symbol _WSAStartup@8
Debug/server.exe : fatal error LNK1120: 9 unresolved externals
Error executing link.exe.

server.exe - 10 error(s), 2 warning(s)


MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:47
Questo me l'aspettavo... Devi linkare Ws2_32.lib al ptuo progetto...

Fenomeno85
07-06-2004, 15:50
da ignorante che sono ... come faccio??

le sai tutte ... mi fai quasi paura :)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:54
Project -> Settings -> Settings for: seleziona All configurations -> Link -> aggiungi in fondo alla riga Object/library modules: ws2_32.lib -> Ok ;)

Fenomeno85
07-06-2004, 15:54
altra cosa, nel client mi dice questo:

--------------------Configuration: client - Win32 Debug--------------------
Compiling...
client.cpp
C:\Documents and Settings\Matteo\Desktop\ripasso c file\client\client.cpp(84) : error C2065: 'write' : undeclared identifier
Error executing cl.exe.

client.exe - 1 error(s), 0 warning(s)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 15:57
Aggiungi agli include dellla parte Windows #include <io.h>...dovrebbe funzionare...

Fenomeno85
07-06-2004, 16:02
adesso mi hai spaventato :D... comunque grazie di tutto ... ultima cosa, ma posso provare questo codice come in vb in locale con client e server aperti?? perchè adesso mi da violazione di memoria :)

per caso dai lezioni ?? :)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Fenomeno85
07-06-2004, 16:11
ok adesso metto i codici corretti:

programma server:

//programma server

#ifndef unix
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/type.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <string.h>

#define PROTOPORT 5193
#define QLEN 6
int visits = 0;

void main(int argc, char *argv[])
{
//struct hostent *ptrh;
struct protoent *ptrp;
struct sockaddr_in sad;
struct sockaddr_in cad;
int sd, sd2;
int port;
int alen;
char buf[1000];

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101, &wsaData);
#endif

memset ((char *)&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;
sad.sin_addr.s_addr= INADDR_ANY;

if (argc > 1){
port = atoi(argv[1]);
} else {
port = PROTOPORT;
}

if (port > 0){
sad.sin_port = htons ((unsigned short)port);
} else {
fprintf (stderr, "bad port number %s\n", argv[1]);
exit (1);

}

if (((int)(ptrp = getprotobyname ("tcp"))) == 0){
fprintf (stderr, "cannot map \"tcp\" to protocol number");
exit (1);
}

sd = socket (PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd <0) {
fprintf (stderr, "creazione del socket fallita");
exit (1);
}

if (bind(sd,(struct sockaddr *)&sad,sizeof(sad)) <0){
fprintf (stderr, "fallita bind");
exit (1);
}

if (listen(sd, QLEN) < 0){
fprintf (stderr, "impossibile mettersi in ascolto");
}

while (1){
alen = sizeof (cad);
if ((sd2=accept(sd, (struct sockaddr *)&cad,&alen) <0)){
fprintf(stderr,"accept fallita");
exit (1);
}
visits ++;
sprintf (buf, "Questo server è stato contattato per %d volt%s",&visits,visits==1?".":"e.");
send (sd2,buf, strlen(buf),0);
closesocket (sd2);
}

}

programma client

#ifndef unix
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/type.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <string.h>
#include <io.h>
#include <conio.h>

#define PROTOPORT 5193
extern int errno;
char localhost[] = "localhost";
void main(int argc, char *argv[])
{
struct hostent *ptrh;
struct protoent *ptrp;
struct sockaddr_in sad;
int sd;
int port;
char *host;
int n;
char buf[1000];

#ifdef WIN32
WSADATA wsaData;
WSAStartup (0x0101, &wsaData);
#endif

memset ((char *)&sad, 0, sizeof(sad));
sad.sin_family = AF_INET;


if (argc > 2){
port = atoi(argv[2]);
} else {
port = PROTOPORT;
}

if (port > 0){
sad.sin_port = htons ((unsigned short)port);
} else {
fprintf (stderr, "bad port number %s\n", argv[2]);
exit (1);

}

if (argc > 1){
host = argv[1];
} else {
host = localhost;
}

ptrh = gethostbyname(host);

if (((char *)ptrh)==NULL){
fprintf (stderr, "host invalido: %s\n", host);
exit (1);
}

memcpy (&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

if (((int)(ptrp = getprotobyname ("tcp"))) == 0){
fprintf (stderr, "cannot map \"tcp\" to protocol number");
exit (1);
}

sd = socket (PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd <0) {
fprintf (stderr, "creazione del socket fallita");
exit (1);
}

if (connect(sd,(struct sockaddr *)&sad,sizeof(sad)) <0){
fprintf (stderr, "fallita bind");
exit (1);
}


n = recv (sd,buf,sizeof(buf),0);
while (n>0){
write (1,buf,n);
n = recv (sd,buf,sizeof(buf),0);
}

closesocket (sd);
getch ();



}

il bello è che il client non riceve niente boo

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 16:12
Fai un trace, magari il problema è nella write...
Leva io.h e sostituisci alla write una

fwrite(buf, sizeof(char), n, stdout);

Fenomeno85
07-06-2004, 16:18
nisba anche cambiando non cambia niente :(

ma perchè ogni volta che apro devo sempre aggiungere la libreria Ws2_32.lib ?

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Fenomeno85
07-06-2004, 16:25
andando ot ... poi nel messaggio non me lo avevi detto ... ma te hai fatto l'uni??

qualcuno sa qualche cosa in + di te?? se fanno un programma dove si sfidano programmatori te di sicuro vinceresti :)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 16:28
Eh...c'è tanta gente più forte di me ;)

Comunque se salvi il progetto non ti dovrebbe chiedere ogni volta ws2_32.lib...

Ora lo provo ;)

cionci
07-06-2004, 17:19
C'era un problema sulla accept a questa riga:

if ((sd2=accept(sd, (struct sockaddr *)&cad,&alen)) <0){

In partica a sd2 veniva assegnato il risultato del confronto fra 0 e quello ritornato da accept... E' bastato spostare la tonda ed è andato senza problemi...

Anzi...aspetta... C'è una & di troppo nella sprintf prima della send nel server...

Fenomeno85
07-06-2004, 20:43
grazie mille cionci ... domani lo metto a posto anchio :)

ot: sembro ripetitivo ma l'uni te l'hai fatta??

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
07-06-2004, 21:11
Non l'ho ancora finita :)

Fenomeno85
08-06-2004, 06:40
Originariamente inviato da cionci
Non l'ho ancora finita :)

ma te non lavoravi già da 15 anni?? :)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Fenomeno85
08-06-2004, 06:45
ok sei un grande adesso funziona tutto :D ... oggi pomeriggio creerò qualche cosa di nuovo :D

te per caso non hai nessun esercizio da propormi?? :)

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

Luc@s
08-06-2004, 07:29
Originariamente inviato da Fenomeno85
ma te non lavoravi già da 15 anni?? :)


programmava, penso :D

cionci
08-06-2004, 08:24
Originariamente inviato da Fenomeno85
ma te non lavoravi già da 15 anni?? :)
Programmo da circa 15 anni...
Diciamo che sono un po' indietro con l'uni ;)
Ho cominciato a programmare alle medie...

Fenomeno85
08-06-2004, 13:22
scusate l'ot continuo ... siccome devo andare a fare questa università :) .. non sto capendo se iscrivermi alla statale oppure al politecnico di milano. cionci o lucas sapete qual'è la migliore??

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

LukeHack
08-06-2004, 15:32
Originariamente inviato da Fenomeno85
scusate l'ot continuo ... siccome devo andare a fare questa università :) .. non sto capendo se iscrivermi alla statale oppure al politecnico di milano. cionci o lucas sapete qual'è la migliore??

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~
guarda,se puoi iscriviti a Tecnologie informatiche (o dei sistemi informativi),
a meno che non sei un vero SECCHIONE (al di là della passione per l'informatica e matematica) lascia stare ingegneria (te lo dice un fuori corso attempato;)), che ti rende la puttana delle scienze (nel senso che le bazzichi tutte;) ) ma senza mai approfondire troppo nessuna di queste, e fai delle materie mostruosamente complesse (tipo RETI LOGICHE :eek: che ancora mi manca) che poi al lavoro non ti servono a NULLA...
quindi w L'informatica come ramificazione della matematica, e non come vile strumento per arrivare a giustificare la MODELLAZIONE DEI CIRCUITI DIGITALI e DELLE CPU!
(putroppo 10 anni fa non c'erano ste belle facoltà nuove :( , ma vabbè,ormai mi manca poco ;) )

cionci
08-06-2004, 15:35
Originariamente inviato da LukeHack
(te lo dice un fuori corso attempato;)),
Compagno :D

Fenomeno85
08-06-2004, 15:41
e che si fa a tecnologia informatiche?? dove sta?? alla statale??

MEMBRO DEL GRAN CONSIGLIO DELLE CACCOLE VERDI

~§~ Sempre E Solo Lei ~§~

cionci
08-06-2004, 16:44
Originariamente inviato da LukeHack
a meno che non sei un vero SECCHIONE (al di là della passione per l'informatica e matematica) lascia stare ingegneria
Ora non è più come ai nostri tempi... La triennale è semplice...molto + semplice...

LukeHack
08-06-2004, 19:58
Originariamente inviato da cionci
Ora non è più come ai nostri tempi... La triennale è semplice...molto + semplice...
guarda che non lo so...
ti dico solo che io ho seguito il corso di Elettronica 1 con quelli del Nuovo Ordinamento,che fanno in 2 mesi di lezioni quello che noi facevamo con 3...Il risultato? che loro fanno DUE (e dico 2) cose in meno di noi,PERO' il corso dura UN TERZO DI MENO,col pessimo risultato di: LEZIONI INUTILI,PROFESSORI CHE SPIEGANO IN FRETTA E FURIA,E lo scritto è lo stesso del nostro...
ALMENO quando io seguivo i vecchi corsi,i prof. erano 10-20 anni che insegnavano il loro corso in 3 mesi,avevano tutto il tempo di spiegare l'impossibile,ricordo che ho sempre dato esami dopo i corsi...adesso ovviamente non seguo più,E' INUTILE...si capisce meglio col libro...
E POI,GLI SCRITTI SONO PRATICAMENTE IDENTICI,diciamo che il prg. è lievemente più corto,ma ti assicuro,ho già dato diversi esami con i niubboni del N.O.,il vantaggio in termini di RISPARMIO roba per l'esame è ridicolo..
le materie sono le stesse, la didattica idem...CAMBIA SOLO il sistema di crediti e la frammentazione degli esami che porta ad un numero di corsi maggiori e quindi,necessariamente,PIU' brevi..risultato: peggio di prima :rolleyes:
meglio per noi:D

ma te quanti te ne mancano?:D a me 7:sofico:

cionci
08-06-2004, 22:27
A me uno in più !!! :muro:

Da noi la diffocoltà è nettamente diminuita... Certo...Elettronica ed altre amterione sono rimste immutate se non condensate ancora di più, ma sono spariti diversi esami... Ad esempio Geometria ed Algebra, Chimica, Calcolo delle Probabilità e Statistica, Fisica II...
Da noi gli iscritti sono circa il 30% in più...