|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Dev-C++ e programmazione di rete
Buongiorno a tutti, avrei un problema a compilare un programma sotto Dev-C++... il programma è un client che tenta di connettersi ad un server. Il codice è il seguente:
Codice:
#include <stdio.h> #include <winsock.h> #include <windows.h> #define close closesocket #define PORT 4000 void addr_initialize (struct sockaddr_in *indirizzo, int port, long IPaddr) { indirizzo->sin_family=AF_INET; indirizzo->sin_port=htons((u_short)port); indirizzo->sin_addr.s_addr=IPaddr; } int main (int argc, char *argv[]) { int sd; struct sockaddr_in server_addr; struct sockaddr_in mio_addr; int mio_addr_len=sizeof(mio_addr); int error; addr_initialize (&server_addr, PORT, inet_addr(argv[1])); sd=socket(AF_INET, SOCK_STREAM, 0); error=connect(sd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (0==error) { printf ("Ho eseguito la connessione\n"); getsockname(sd, (struct sockaddr*)&mio_addr, &mio_addr_len); printf ("La mia porta è: %d\n\n", ntohs(mio_addr.sin_port)); } else printf ("%s", "Errore di connect\n\n"); close(sd); system("PAUSE"); return 0; } C:\DOCUME~1\ALBERT~1\IMPOST~1\Temp\ccSAaaaa.o(.text+0x1a) In function `Z15addr_initializeP11sockaddr_inil': [Linker error] undefined reference to `htons@4' C:\DOCUME~1\ALBERT~1\IMPOST~1\Temp\ccSAaaaa.o(.text+0xde) In function `main': [Linker error] undefined reference to `WSAStartup@8' [Linker error] undefined reference to `inet_addr@4' [Linker error] undefined reference to `socket@12' [Linker error] undefined reference to `connect@12' [Linker error] undefined reference to `getsockname@12' [Linker error] undefined reference to `ntohs@4' [Linker error] undefined reference to `closesocket@4' Credo di dover linkare la libreria libws2_32.a, ma non ho idea di come farlo. Qualcuno saprebbe darmi una mano? Grazie mille. Alberto
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. Ultima modifica di Marinelli : 04-03-2005 alle 16:23. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Alberto cmq le modifiche che ti messo ti servono almeno
Codice:
#ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Ok, scusa... pensavo valessero solo per la compilazione sotto Visual C.
Il codice allora è questo: Codice:
#include <stdio.h> #include <winsock.h> #include <windows.h> #define close closesocket #define PORT 4000 void addr_initialize (struct sockaddr_in *indirizzo, int port, long IPaddr) { indirizzo->sin_family=AF_INET; indirizzo->sin_port=htons((u_short)port); indirizzo->sin_addr.s_addr=IPaddr; } int main (int argc, char *argv[]) { int sd; struct sockaddr_in server_addr; struct sockaddr_in mio_addr; int mio_addr_len=sizeof(mio_addr); int error; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif addr_initialize (&server_addr, PORT, inet_addr(argv[1])); sd=socket(AF_INET, SOCK_STREAM, 0); error=connect(sd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (0==error) { printf ("Ho eseguito la connessione\n"); getsockname(sd, (struct sockaddr*)&mio_addr, &mio_addr_len); printf ("La mia porta è: %d\n\n", ntohs(mio_addr.sin_port)); } else printf ("%s", "Errore di connect\n\n"); close(sd); system("PAUSE"); return 0; }
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Aug 1999
Città: Tolmezzo (UD) - Milano
Messaggi: 13744
|
Ok, ho risolto...
![]() E' sufficiente aggiungere "C:/Programmi/Vari/Dev-Cpp/lib/libws2_32.a" nelle opzioni di compilazione, aggiungi questi comandi alla linea di comando del linker. Ciao ciao ![]()
__________________
...to go where no one has gone before. One ring to rule them all, one ring to find them, one ring to bring them all and in darkness bind them. Caron, non ti crucciare: vuolsi così colà dove si puote ciò che si vuole, e più non dimandare. |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Dec 2001
Messaggi: 264
|
A che servono le istruzioni:
Codice:
WSADATA wsaData; WSAStartup (0x0101,&wsaData); Ho notato che rispetto a linux le strutture e le chiamate alle funzioni di rete non cambiano;mi chiedevo:sarà cosi anche per tutte le altre che faremo (se ne faremo...)? |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Servono ad inizializzare il Winsock per quella applicazione...
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2002
Città: Milano
Messaggi: 959
|
io sotto win non riesco a compilare nonostante abbia incluso la libreria, mi da errori sui file di libreria inclusi (winsock e windows.h)
Marinelli tu sei riuscito a compilarlo? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
che compilatore usi ster?
sul vc6 / vc.net basta che vai nelle proprietà ![]() Le funzioni che useremo son sempre identiche. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
Come detto da cionci serve a inizializzare e poter utilizzare il socket. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
1) non è meglio sempre verificare che il descrittore del socket creato sia un valore >= 0? Alle superiori mi dicevano che era meglio ... all'uni nisba. 2) le costanti AF_INET e PF_INET non sono due cose differenti?? Io sapevo che AF_INET si riferiva al tipo di indirizzi IP della pila TCP/IP mentre PF_INET identificava la pila TCP/IP. All'uni è la stessa cosa. 3) quando si fa il connect non bisogna vedere per la precisione se è anche qui >= 0 il valore restituito e non solo =? ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
quindi per il codice tranne che per le librerie che non ho voglia di fare i casi quando si è sotto win che sotto linux
Codice:
#include <stdio.h> #include <winsock.h> #include <windows.h> #define close closesocket #define PORT 6000 void addr_initialize (struct sockaddr_in *indirizzo, int port, long IPaddr){ indirizzo->sin_family=AF_INET; indirizzo->sin_port=htons((u_short)port); indirizzo->sin_addr.s_addr=IPaddr; } int main (int argc, char *argv[]){ int sd; struct sockaddr_in server_addr; struct sockaddr_in mio_addr; int mio_addr_len=sizeof(mio_addr); int error; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif /* clear structure */ memset ((char*)&server_addr, 0, sizeof(server_addr)); memset ((char*)&mio_addr, 0, sizeof(mio_addr)); addr_initialize (&server_addr, PORT, inet_addr("127.0.0.1")); sd=socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { printf ("\nSocket fallita.\n"); system ("PAUSE"); return (-1); } if (connect(sd, (struct sockaddr*)&server_addr, sizeof(server_addr))>=0){ printf ("Ho eseguito la connessione\n"); getsockname(sd, (struct sockaddr*)&mio_addr, &mio_addr_len); printf ("La mia porta è: %d\n\n", ntohs(mio_addr.sin_port)); } else printf ("%s", "Errore di connect\n\n"); system ("PAUSE"); close(sd); return 0; }
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Codice:
/* clear structure */ memset ((char*)&server_addr, 0, sizeof(server_addr)); memset ((char*)&mio_addr, 0, sizeof(mio_addr)); ![]() ciao ![]() |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao ![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
perchè non inizializzi tutta la struttura.
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Codice:
struct sockaddr_in { short int sin_family; // Address family unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8]; // Same size as struct sockaddr }; ![]() |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
mmm il bello è che si usa
![]() Codice:
SOCKADDR_IN StructureSee Also Structures, Styles, Callbacks, and Message Maps | SOCKADDR In the Internet address family, the SOCKADDR_IN structure is used by Windows Sockets to specify a local or remote endpoint address to which to connect a socket. struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; Parameters sin_family Address family (must be AF_INET). sin_port IP port. sin_addr IP address. sin_zero Padding to make structure the same size as SOCKADDR. Remarks This is the form of the SOCKADDR structure specific to the Internet address family and can be cast to SOCKADDR. The IP address component of this structure is of type IN_ADDR. The IN_ADDR structure is defined in Windows Sockets header file WINSOCK.H as follows: struct in_addr { union { struct{ unsigned char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { unsigned short s_w1, s_w2; } S_un_w; unsigned long S_addr; } S_un; }; ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
![]() scusate se continuo a rompervi ma questa cosa proprio non riesco a capirla. ciao ![]() |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
Codice:
... anche se un indirizzo TCP/IP è lungo 6 byte, la struttura sockaddr ne prevede 14 per memorizzare gli indirizzi. Per questo motivo, l'ultimo campo di sockaddr_in è costituito da 8 byte nulli, in modo che la lunghezza totale della struttura sia pari a quella a quella di sockaddr.
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
cercando con google:
Codice:
Come si nota nel listato, è necessario porre a zero 8 bytes della struttura dove l'indirizzo IP è stato caricato. Perchè azzerare 8 bytes? Perchè poi proprio 8 bytes? Per compatibilità all'indietro con la vecchia sockaddr (senza _in ). E' facile fare il cast di un puntatore se le strutture hanno la stessa dimensione (ragion per cui sono 8 bytes) e poiché i dati non sono posti a zero dopo la loro allocazione e necessario azzerarli a mano. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:50.