Sto lavorando su una porta Windows di un programma POSIX C++.È sicuro trasmettere SOCKET a int con Win64?
Il problema è che le funzioni POSIX standard come accept() o bind() prevedono un 'int' come primo parametro mentre le sue controparti WinSock usano 'SOCKET'.
Quando compilato per 32bit tutto va bene, perché entrambi sono a 32 bit, ma sotto Win64 presa è a 64 bit e int rimane a 32 bit e genera un sacco di compilatore di avviso come questo:
warning C4244: '=' : conversion from 'SOCKET' to 'int', possible loss of data
ho provato per aggirare il problema utilizzando un typedef:
#ifdef _WIN32
typedef SOCKET sock_t;
#else
typedef int sock_t;
#endif
e sostituendo int di con sock_t nei luoghi appropriati.
Questo andava bene fino a quando non ho raggiunto una parte del codice che chiama API OpenSSL.
Come si è scoperto OpenSSL utilizza inte per socket anche su Win64. Che sembrava davvero strano, così ho iniziato la ricerca di una risposta, ma l'unica cosa che ho trovato è stato un vecchio post sulla mailing list openssl-dev, che riferisce a un commento e_os.h:
/*
* Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
* the value constitutes an index in per-process table of limited size
* and not a real pointer.
*/
Quindi la mia domanda è :
è davvero sicuro trasmettere SOCKET a int?
Mi piacerebbe vedere una sorta di documentazione che dimostra che i valori per SOCKET non possono essere maggiori di 2^32.
Grazie in anticipo!
Ryck
+1: Ho lo stesso problema ** ** LA SOCIETÀ ... – paercebal