Im работает над портом Windows программы POSIX С++.
Проблема заключается в том, что стандартные функции POSIX, такие как accept() или bind(), ожидают, что 'int является первым параметром, в то время как его коллеги WinSock используют "SOCKET".
Когда скомпилировано для 32-битного, все в порядке, потому что оба 32-битные, но под Win64 SOCKET - 64 бит, а int остается 32-битным, и он генерирует много предупреждений компилятора следующим образом: warning C4244: '=' : conversion from 'SOCKET' to 'int', possible loss of data
Я попытался решить проблему с помощью typedef:
#ifdef _WIN32
typedef SOCKET sock_t;
#else
typedef int sock_t;
#endif
и заменив 'ints на sock_t в соответствующих местах.
Это было нормально, пока я не достиг части кода, который вызывает API OpenSSL.
Как оказалось, OpenSSL использует ints для сокетов даже на Win64. Это казалось действительно странным, поэтому я начал искать ответ, но единственное, что я нашел, это старое сообщение в списке рассылки openssl-dev, который ссылается на комментарий e_os.h:
/*
* Even though sizeof(SOCKET) is 8, it safe to cast it to int, because
* the value constitutes an index in per-process table of limited size
* and not a real pointer.
*/
Итак, мой вопрос:
действительно ли безопасно бросать SOCKET в int?
Id нравится видеть какую-то документацию, которая доказывает, что значения для SOCKET не могут превышать 2 ^ 32.
Спасибо заранее!
Райк