Newsgroup: it.comp.programmare.win32
Titolo: [ ling. C ] Errori di portabilità a Windows (Socket: Compilazione (Dev c/c++)

Sto cercando di compilare dei sorgenti col Dev C/C++ ma non riesco ad
elimare gli errori.
Sono due files per impratichirsi con le socket: un client e un server.
Ho sia la versione per Unix (e girano a meraviglia) che la modifica per
Windows.
Mi hanno consigliato di aggiungere l'opzione -lwsock32  nel Dev
(precisamente
strumenti-->opzioni del compilatore--->programmi  e  alla riga
gcc: -lwsock32  )......ma non è cambiato molto :_(
Ho Windows 2000 professional e il Dev c/c++ versione 4.9.8.0
Cosa altro posso provare? :-?
Ringrazio per l'aiuto!
- Simone -
P.s. Gli errori che mi dà il DEV:
///////////// LOG /////////////////////////
Compilatore: Default compiler
Esecuzione di  gcc.exe...
gcc.exe "C:\Documents and Settings\simone\Documenti\Università\LPSR - Lab
Programmazione Servizi su Rete\esempio1\esempio1_serverW.c" -o "C:\Documents
and Settings\simone\Documenti\Università\LPSR - Lab Programmazione Servizi
su
te\esempio1\esempio1_serverW.exe"    -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\
lib"
C:/Documents and Settings/simone/Documenti/Università/LPSR - Lab
Programmazione Servizi su Rete/esempio1/esempio1_serverW.c:30:1: warning:
"errno" redefined
In file included from C:/Dev-Cpp/include/objbase.h:12,
                 from C:/Dev-Cpp/include/ole2.h:9,
                 from C:/Dev-Cpp/include/windows.h:111,
                 from C:/Documents and
Settings/simone/Documenti/Università/LPSR - Lab Programmazione Servizi su
Rete/esempio1/esempio1_serverW.c:26:
C:/Dev-Cpp/include/stdlib.h:153:1: warning: this is the location of the
previous definition
C:/Documents and Settings/simone/Documenti/Università/LPSR - Lab
Programmazione Servizi su Rete/esempio1/esempio1_serverW.c: In function
`main':
C:/Documents and Settings/simone/Documenti/Università/LPSR - Lab
Programmazione Servizi su Rete/esempio1/esempio1_serverW.c:52: warning:
return type of `main' is not `int'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x3f7):esempio1_serverW.c:
undefined reference to `socket@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x416):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x44f):esempio1_serverW.c:
undefined reference to `setsockopt@20'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x47e):esempio1_serverW.c:
undefined reference to `htons@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x4a9):esempio1_serverW.c:
undefined reference to `bind@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x4cd):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x4f8):esempio1_serverW.c:
undefined reference to `listen@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x51c):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x56d):esempio1_serverW.c:
undefined reference to `accept@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x59d):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x5d8):esempio1_serverW.c:
undefined reference to `inet_ntoa@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x609):esempio1_serverW.c:
undefined reference to `recv@16'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x670):esempio1_serverW.c:
undefined reference to `send@16'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x6a6):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x6fc):esempio1_serverW.c:
undefined reference to `shutdown@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x70f):esempio1_serverW.c:
undefined reference to `shutdown@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x720):esempio1_serverW.c:
undefined reference to `closesocket@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x731):esempio1_serverW.c:
undefined reference to `closesocket@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x772):esempio1_serverW.c:
undefined reference to `WSAStartup@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x789):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x7b1):esempio1_serverW.c:
undefined reference to `WSACleanup@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x7db):esempio1_serverW.c:
undefined reference to `WSAStartup@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cc8Uaaaa.o(.text+0x817):esempio1_serverW.c:
undefined reference to `WSACleanup@0'
Esecuzione terminata
P.s. I sorgenti sono disponibili qui:
http://www.informatica.uniroma2.it/upload/2003/LPSR/esempio1.zip
Per windows sono: esempio1_serverW  e esempio1_clientW
POSTO IL CODICE DEL "SERVER":
////////////////////////////////
/************************************************************************
* ESEMPIO1_SERVERW
*
* Programma client/server per la trasmissione/ricezione di stringhe.
* Comunicazione effettuata tramite socket e protocollo TCP.
*
* Modulo Server:
*
* - crea un socket;
* - bind del socket ad un indirizzo;
* - ascolta su un socket;
* - accetta una connessione;
* - loop
* - legge una stringa dal socket;
* - modifica e scrive la stringa sul socket;
*
* N.B. Programma modificato per funzionare su Windows
************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#ifdef WIN32
 #include <windows.h>
 #include <io.h>
 #include <winsock.h>
#define IPPORT_USERRESERVED 5000
#define errno WSAGetLastError()
#else
 #include <netdb.h>
 #include <sys/socket.h>
 #include <unistd.h>
 #include <errno.h>
#define SOCKET_ERROR -1
#define INVALID_SOCKET -1
#endif
// Introdotte per compatibilita' con Windows
extern int StartProtocol(void);
extern int EndProtocol(void);
// In questo esempio i dati di connessione sono fissi
#define BUFFER_SIZE 1000
#define MY_PORT IPPORT_USERRESERVED+1
#define MAXQUEUE 5
void main(int argc, char **argv)
{
 char iobuffer[BUFFER_SIZE+100];
 struct sockaddr_in addr_in, *pAddr_In;
 struct sockaddr addr;
 int sock, sock_a, outlen, inlen, addrlen, ret;
 int on = 1;
 printf("\n\t\t-- TCP SERVER --\n\n");
 // Necessaria su Windows, inutile ma non perniciosa su unix
 ret = StartProtocol();
 if (ret != 0)
 {
  printf("TCPSERVER: Errore in StartProtocol. Codice errore:[%d].
Exiting....\n",
    ret);
  exit(5);
 }
/** Creo il socket. Famiglia AF_INET e tipo STREAM  **/
 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
  printf("TCPSERVER: Errore in creazione socket(socket()). Codice
errore:[%d]. Exiting....\n",
    errno);
  exit(1);
 }
/** ATTENZIONE
Setto la riusabilita' per evitare l'errore sulla bind. **/
 (void) setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &on,
sizeof(on));
/** Azzeramento struttura **/
 memset (&addr_in, 0, sizeof(struct sockaddr_in));
 addr_in.sin_family = AF_INET;
 addr_in.sin_port = htons(MY_PORT);
 addr_in.sin_addr.s_addr = INADDR_ANY;
/** Bind del socket alla struttura **/
 if (bind(sock,(struct sockaddr *) &addr_in, sizeof(struct sockaddr_in)) ==
SOCKET_ERROR){
  (void) close(sock);
  printf("TCPSERVER: Errore in binding socket(bind()). Codice errore:[%d].
Exiting....\n",
    errno);
  exit(3);
 }
/** Mi metto in ascolto su quel socket **/
 if (listen(sock, MAXQUEUE) == SOCKET_ERROR) {
  (void) close(sock);
  printf("TCPSERVER: Errore in ascolto socket(listen()). Codice errore:[%d].
Exiting....\n",
    errno);
  exit(4);
 }
 printf("\t\t<TCPSERVER> Il server e' pronto.\n\n");
/** Aspetta e accetta la nuova connessione **/
 addrlen = sizeof(struct sockaddr);
 if ((sock_a = accept(sock, &addr, &addrlen)) == SOCKET_ERROR) {
  (void) close(sock);
  printf("TCPSERVER: Errore in accettazione(accept()). Codice errore:[%d].
Exiting....\n",
    errno);
  exit(3);
 }
 // Chi ha chiamato ?
 pAddr_In = (struct sockaddr_in *) (&addr);
 printf("TCPSERVER: Ricevuto chiamata dal client:[%s]\n",
inet_ntoa(pAddr_In->sin_addr));
 for (;;){
  iobuffer[0] = '\0';
 /** Leggi **/
  inlen = recv(sock_a, iobuffer, BUFFER_SIZE, 0);
  printf("\t\t<TCPSERVER> Stringa letta:[%s]\n", iobuffer);
 /** Se la stringa e' "QUIT" allora esci **/
  if (!strcmp(iobuffer, "QUIT"))
  {
   printf("<TCPSERVER> Quitting....");
   break;
  }
 /** Scrivi **/
  outlen = send(sock_a, iobuffer, inlen, 0);
  if (outlen <= 0){
   (void) close(sock);
   (void) close(sock_a);
   printf("<TCPSERVER> Errore sulla scrittura (write()): Stringa:[%s]
Scritti:[%d] Codice errore:[%d]. Exiting....\n",
     iobuffer, outlen, errno);
   exit(5);
  }
  printf("\t\t<TCPSERVER> Inviati [%d] caratteri su [%d] totali!!\n",
       outlen, inlen);
 }
 (void) shutdown(sock, 2);
 (void) shutdown(sock_a, 2);
// Sui winsock non si puo' usare la close
#ifdef WIN32
 (void) closesocket(sock);
 (void) closesocket(sock_a);
#else
 (void) close(sock);
 (void) unlink(sock);
 (void) close(sock_a);
 (void) unlink(sock_a);
#endif
 // Necessaria su Windows, inutile ma non perniciosa su unix
 (void) EndProtocol();
 exit(0);
}
 /***********************
 * StartProtocol()
 ***********************/
int StartProtocol(void)
{
#ifdef WIN32
 WSADATA  wsaData;
 WORD  wVersionRequested;
 int      iErr;
/** Provo subito a richiedere una versione alta **/
/** Versione 2.2 = 0x0202 */
 wVersionRequested = 0x0202;
 iErr = WSAStartup(wVersionRequested, &wsaData);
 if (iErr != 0)
 {
  if (WSAGetLastError() != WSAVERNOTSUPPORTED)
   return(-1);
 }
/** Se la versione richiesta e la supportata differiscono, pulisci e
adeguati **/
 if (wVersionRequested != wsaData.wHighVersion)
 {
  WSACleanup();
  wVersionRequested = wsaData.wHighVersion;
  iErr = WSAStartup(wVersionRequested, &wsaData);
  if (iErr != 0)
   return(-1);
 }
 return(0);
#else
 return(0);
#endif // #ifdef WIN32
}
 /***********************
 * EndProtocol()
 ***********************/
int EndProtocol(void)
{
#ifdef WIN32
 if (WSACleanup() == SOCKET_ERROR)
  return(-1);
 return(0);
#else
 return(0);
#endif
}
////////////////////////////////////////////////////////

Dunque... Ti segnala due warning:
- main deve ritornare un int. Definiscila come int main(...) e poi mettici
dei return 0;
- si lamenta che ci sono più definizioni di errno... Vedo che ne crei una
anche tu con il define. Prova a medderci: #undef errno subito prima.
Per il resto gli errori errori sono dati dal linker. Il linker non trova
delle funzioni, e questo perchè non includi la WSock32.Lib. Cercala sul tuo
HD e controlla che dove configuri il dev-c++ sulla posizione delle librerie
sia inclusa anche quella cartella. Poi rimetti il comando che ti hanno dato.
--- bye

Grazie di cuore,mi metto alll'opera.
:-))
Simo


Purtroppo non riesco a trovare sul mio HD la WSock32.lib ...
al massimo mi trova:
libwsock32.a
wsock32.dll
:-(
che combino ora? :_(
Grazie!
Simone

 wsock32.dll
mmmh... Tu usavi il dev... che č basatu sul gnu... Prova a fargli linkare la
libwsock32.a. Nel DEV ci dovrebbe essere un posto in cui gli dici che
librerie linkare.
--- bye


Ed io in effetti il posto credo d'averlo trovato... anche perchè li ho
provati tutti.
Ho provato sia ad aggiungere libwsock32.a come opzione al gcc , che a
metterlo come  percorso nelle librerie
che a settare le variabili d'ambiente di windows...
ora mi spariscono tutti quegli errori del linker, ma ne rimane uno solo che
dice:
NEL LOG DI COMPILAZIONE:
 Esecuzione di  gcc.exe -libwsock32.a...
gcc.exe -libwsock32.a "C:\Documents and
Settings\simone\Documenti\Università\LPSR - Lab Programmazione Servizi su
Rete\esempio1\esempio1_serverW.c" -o "C:\Documents and
Settings\simone\Documenti\Università\LPSR - Lab Programmazione Servizi su
Rete\esempio1\esempio1_serverW.exe"    -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cp
p\lib" -L"C:\Dev-Cpp\lib\libwsock32.a"
C:\Dev-Cpp\Bin\..\lib\gcc-lib\mingw32\3.2\..\..\..\..\mingw32\bin\ld.exe:
cannot find -libwsock32.a
Esecuzione terminata
invece nella "linguetta" COMPILATORE mi dice:
\Dev-Cpp\Bin\..\lib\gcc-lib\mingw32\3.2\..\..\..\..\mingw32\bin\ld.exe
C:\Documents and Settings\simone\Documenti\Università\LPSR - Lab
Programmazione Servizi su Rete\esempio1\C
cannot find -libwsock32.a
...credo siano i risultati migliori raggiunti con -libwsock32.a
invece che provando con -lwsock32
Booh....
- Simone -

No, è peggio! Ti sta dicendo che non trova il file...E non lo trova perchè
il parametro è scorretto. Guarda il comando: gcc.exe -libwsock.a
quel -libwsock.a deve SPARIRE! Però deve continuare ad esserci
il -L"C:\Dev-Cpp\lib\libwsock32.a"
--- bye

 ha scritto nel messaggio
news:Wck4c.35583$z23.1...@news3.tin.it...

Si ma se faccio sparire quel -libwsock.a allora:
Compilatore: Default compiler
Esecuzione di  gcc.exe...
gcc.exe "C:\Documents and Settings\simone\Documenti\Università\LPSR - Lab
Programmazione Servizi su Rete\esempio1\esempio1_serverW.c" -o "C:\Documents
and Settings\simone\Documenti\Università\LPSR - Lab Programmazione Servizi
su
te\esempio1\esempio1_serverW.exe"    -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\
lib" -L"C:\Dev-Cpp\lib\libwsock32.a"
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x3f7):esempio1_serverW.c:
undefined reference to `socket@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x416):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x44f):esempio1_serverW.c:
undefined reference to `setsockopt@20'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x47e):esempio1_serverW.c:
undefined reference to `htons@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x4a9):esempio1_serverW.c:
undefined reference to `bind@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x4cd):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x4f8):esempio1_serverW.c:
undefined reference to `listen@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x51c):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x56d):esempio1_serverW.c:
undefined reference to `accept@12'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x59d):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x5d8):esempio1_serverW.c:
undefined reference to `inet_ntoa@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x609):esempio1_serverW.c:
undefined reference to `recv@16'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x670):esempio1_serverW.c:
undefined reference to `send@16'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x6a6):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x6fc):esempio1_serverW.c:
undefined reference to `shutdown@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x70f):esempio1_serverW.c:
undefined reference to `shutdown@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x720):esempio1_serverW.c:
undefined reference to `closesocket@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x731):esempio1_serverW.c:
undefined reference to `closesocket@4'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x772):esempio1_serverW.c:
undefined reference to `WSAStartup@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x789):esempio1_serverW.c:
undefined reference to `WSAGetLastError@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x7b1):esempio1_serverW.c:
undefined reference to `WSACleanup@0'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x7db):esempio1_serverW.c:
undefined reference to `WSAStartup@8'
C:\DOCUME~1\simone\IMPOST~1\Temp/cciCaaaa.o(.text+0x817):esempio1_serverW.c:
undefined reference to `WSACleanup@0'
Esecuzione terminata
Mizzica che angoscia 'sto Dev :-)

 
Allora, se non ricordo male, per il gcc il comando -l indica di 
aggiungere una libreria. Se la mia libreria si chiama libwsock.a devo 
mettere -lwsock senza il lib, mentre la direttiva -L dice in che 
percorso si trovano le librerie.
Martino.
-- 
Quando avrete abbattuto l'ultimo albero, quando avrete pescato l'ultimo
pesce, quando avrete inquinato l'ultimo fiume, allora vi accorgerete che
non si puo' mangiare il denaro.  Proverbio Indiano

Dunque... Ho fatto un paio di prove...
Fa cosě... Crea un progetto per Console Program. Poi vai nel menu
Progetto->Opzioni, vai in Parametri e in linker aggiungi la libreria
libws2_32.a .
Ah, io al Server ho dovuto modificare un (void *) in (const char *). Ma
dev'essere perchč l'ho compilato come C++ invece che come C. Se tu lo fai
come programma C non dovrebbe darti problemi.
--- bye

 ha scritto nel messaggio
news:p%l4c.36404$z23.1...@news3.tin.it...

E che cribbioooo!! Grazieeeeeee!!
finalmente st' accrocco gira :-))
Meno male che ti ho trovato! :)
Ciaooo!
- Simone -