Простой ответ на этот вопрос - нет. Взгляните на описание значений SOCKET на MSDN [1]:
Дескрипторы Windows Sockets не имеют ограничений, за исключением того, что значение INVALID_SOCKET не является допустимым сокетом. Дескрипторы сокетов могут принимать любое значение в диапазоне от 0 до INVALID_SOCKET – 1.
Очевидно, что API разрешает все значения в диапазоне [0, 2 ^ 64 - 1) в 64-битной Windows. И если API когда-либо вернет значение больше 2 ^ 32 - 1, присвоение ему значения int приведет к усечению дескриптора. Также взгляните на описание возвращаемого значения из функции socket () [2]:
Если ошибки не возникает, socket возвращает дескриптор, ссылающийся на новый сокет.
Обратите внимание, что он наиболее категорически не обещает вернуть дескриптор ядра. Это делает любое обсуждение возможных значений для дескрипторов ядра спорным.
При этом на момент написания этой статьи функция socket () действительно возвращала дескриптор ядра (или что-то неотличимое от дескриптора ядра) [3], а дескрипторы ядра действительно ограничены 32-битными [4]. Но имейте в виду, что Microsoft может изменить любую из этих вещей завтра, не нарушая контракты на интерфейс.
Однако, поскольку, несомненно, большое количество приложений зависело от этих конкретных деталей реализации (и, что более важно, так же, как и OpenSSL), Microsoft, вероятно, дважды подумала бы о внесении каких-либо серьезных изменений. Так что давай и брось розетку в int. Просто имейте в виду, что это опасная по своей природе, плохая практика, и она никогда не может быть оправдана во имя целесообразности.
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms740516(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms742295(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/aa384267(v=vs.85).aspx
Редактировать (2018-01-29)
Поскольку эта тема все еще представляет интерес, стоит отметить, что довольно просто написать код переносимых сокетов в C ++ 11, не прибегая к сомнительным приведениям типов:
using socket_t = decltype(socket(0, 0, 0));
socket_t s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);