Как избавиться от предупреждения C4244 / C4267 преобразования? - PullRequest
0 голосов
/ 19 ноября 2018

Можно ли избавиться от предупреждений компилятора при попытке привести от SOCKET к int или от size_t к int, используя такие функции winsock2, как sendto, select и т. Д.? Может есть общий подход? (Windows, MSVC15)

пример:

Преобразование C4267 из 'size_t' в 'int', возможная потеря данных:

sendto(_socket, managedPtr, _bufferSize, NULL, PSOCKADDR(&_sockaddr), sizeof(_sockaddr)) ____________________________________________________________ ~~~~~~~~~~~~~~

C4244 преобразование из 'SOCKET' в 'int', возможная потеря данных:

select(_socket + 1, &readfds, nullptr, nullptr, GetTV())

_______ ~~~~~~~~~ ______________________________________

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

sendTo : Компилятор может предупредить вас об этом, потому что вы пытаетесь построить 64-битное приложение.Таким образом, size_t будет 64-битным типом, а int будет максимум 32-битным.Чтобы решить эту проблему, попробуйте явным образом привести результат к int, чтобы компилятор знал, что это было задумано.Также эта функция может быть заменена на send, как указано здесь MSDN"Функция sendto обычно используется в сокете без установления соединения для отправки дейтаграммы в определенный одноранговый сокет, определенный параметром to. Даже если соединение без соединенияСокет ранее был подключен к определенному адресу, параметр to переопределяет адрес назначения только для этой конкретной дейтаграммы.На сокете, ориентированном на подключение, параметры to и tolen игнорируются, что делает sendto эквивалентным send ."поэтому, возможно, проверьте это тоже.

выберите : так как MSDN утверждает, что первый параметр игнорируется, но сохраняется как совместимость с сокетами Беркли.Очевидно, Microsoft хотела обеспечить легкую переносимость кода для систем UNIX и, таким образом, разработала свой API, чтобы соответствовать стандарту POSIX, чтобы код можно было просто скопировать (с некоторыми небольшими изменениями, очевидно) Подробнее здесь .Так что если вы используете winsock2 Игнорируйте этот параметр и установите его на 0 или любое другое целое число.Если вы хотите портировать свое приложение, скопируйте код и передайте файловый дескриптор сокета вместо 0.

0 голосов
/ 19 ноября 2018

Да, это возможно:

SOCKET s;
int i = static_cast<int>(s);

Для функций, принимающих int, просто убедитесь, что ваше значение не > std::numeric_limits<int>::max(), и все должно быть в порядке, чтобы сделать static_cast<int>(value).

sendto(_socket, managedPtr, _bufferSize, NULL,
       &_sockaddr, static_cast<int>(sizeof(_sockaddr)));

select(static_cast<int>(_socket)+1, ...); // the nfds parameter is ignored on Windows
...