PDA

View Full Version : [Visual C++ 2010] Socket in Visual C++ 2010 e Windows 7 64bit


DomusP45
19-03-2014, 07:24
Salve a tutti,
non ho mai programmato una socket, nè ho idea di come si faccia.

A titolo del tutto esemplificativo mi è stata proposta questa

http://cs.baylor.edu/~donahoo/practical/CSockets/practical/

che è molto intuitiva, ma è vecchia e a quanto pare fatta per sistemi 32bit.

Io devo creare una socket in ambiente 64bit in un'applicazione a 64bit, e questa non ne vuole sapere di compilare.

Ho configurato l'ambiente come descritto, e cercando con google ho trovato che la libreria da includere wsock32.lib in windows 7 è stata sostituita dalla libreria ws2_32.dll, che ho trovato nella cartella

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64

ma anche aggiungendo questa cartella a quella delle librerie aggiuntive, non compila.

Ad esempio, provando a compilare TCPEchoClient, continua a darmi questi errori

1>------ Inizio compilazione: Progetto: sockt, Configurazione: Debug Win32 ------
1>Compilazione avviata 19/03/2014 08:22:42.
1>InitializeBuildStatus:
1> Aggiornamento timestamp di "Debug\sockt.unsuccessfulbuild".
1>ClCompile:
1> Tutti gli output sono aggiornati.
1>ManifestResourceCompile:
1> Tutti gli output sono aggiornati.
1>TCPEchoClient.obj : error LNK2019: riferimento al simbolo esterno "public: int __thiscall CommunicatingSocket::recv(void *,int)" (?recv@CommunicatingSocket@@QAEHPAXH@Z) non risolto nella funzione _main
1>TCPEchoClient.obj : error LNK2019: riferimento al simbolo esterno "public: void __thiscall CommunicatingSocket::send(void const *,int)" (?send@CommunicatingSocket@@QAEXPBXH@Z) non risolto nella funzione _main
1>TCPEchoClient.obj : error LNK2019: riferimento al simbolo esterno "public: __thiscall TCPSocket::TCPSocket(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned short)" (??0TCPSocket@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@G@Z) non risolto nella funzione _main
1>TCPEchoClient.obj : error LNK2019: riferimento al simbolo esterno "public: __thiscall Socket::~Socket(void)" (??1Socket@@QAE@XZ) non risolto nella funzione "public: __thiscall CommunicatingSocket::~CommunicatingSocket(void)" (??1CommunicatingSocket@@QAE@XZ)
1>C:\OPENCV\Test\miei\provefunzioni\sockt\Debug\sockt.exe : fatal error LNK1120: 4 esterni non risolti
1>
1>Compilazione NON RIUSCITA.


Qualcuno sa dirmi come risolvere questi problemi di compilazione oppure sa dirmi come creare una socket in un'applicazione 64bit in visual C++ 2010, che cosa utilizzare?

tomminno
19-03-2014, 10:05
Stai compilando comunque un programma a 32 bit:

1>------ Inizio compilazione: Progetto: sockt, Configurazione: Debug Win32 ------


Se vuoi un software a 64bit devi compilare per l'architettura x64.
A quel punto il path delle librerie a 64bit viene incluso automaticamente dall'IDE.

Infine hai referenziato la ws2_32.lib?

DomusP45
19-03-2014, 10:14
Stai compilando comunque un programma a 32 bit:

1>------ Inizio compilazione: Progetto: sockt, Configurazione: Debug Win32 ------


Se vuoi un software a 64bit devi compilare per l'architettura x64.
A quel punto il path delle librerie a 64bit viene incluso automaticamente dall'IDE.

Infine hai referenziato la ws2_32.lib?

Allora, ho cambiato il progetto a 64 bit come è giusto che sia (avevo fatto quella prova a 32 per capire se era dovuto a quello l'errore di compilazione) e nonostante referenzi quella libreria mi da problemi.

Allora ho provato a cercare direttamente la libreria chiesta dalla classe in C:\ ed ho trovato anche quella nella stessa cartella.

WSock32.Lib in C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64


Allora ho referenziato quella (nelle dipendenze aggiuntive) e messo quella cartella come cartelle di librerie aggiuntive, ed il programma compila.

Ma una volta lanciato,TCPEchoClient, non fa niente. Si apre e si chiude una finestra command.

A questo punto mi chiedo come farlo funzionare: ho capito che windows 7 ha comunque le librerie più vecchie in quella cartella, e se aggiunte come addizionali, il programma compila. E già mi sento meglio.

Ora mi guardo un pò il codice del programma e cerco di capire se non fa niente perchè la libreria c'è per compatibilità, ma alla fine non permette granchè, oppure se quell'esempio necessita di altra roba, se può essere l'antivirus/firewall che blocca il tentativo di comunicazione...

E quindi, ora mi metto a fare queste prove.

Grazie comunque per la risposta, aggiornerò la discussione quando avrò più dettagli sul problema.

tomminno
19-03-2014, 12:02
Ma hai provato ad andare in debug? Hai a disposizione uno dei migliori IDE da questo punto di vista, usalo!

I programmi a console si chiudono non appena finito, se non metti niente per interrompere l'esecuzione prima dell'uscita dal main il comportamento è normale.

DomusP45
19-03-2014, 13:00
Ma hai provato ad andare in debug? Hai a disposizione uno dei migliori IDE da questo punto di vista, usalo!

I programmi a console si chiudono non appena finito, se non metti niente per interrompere l'esecuzione prima dell'uscita dal main il comportamento è normale.

Si si, ho messo system("Pause") per fermare l'esecuzione...credo sia dovuto al fatto che necessita di parametri in ingresso per funzionare...

Grazie comunque della disponibilità tomminno! Buona giornata!