是否可以使用sendto
、select
等winsock2函数来消除试图从SOCKET
强制转换为int
或从size_t
强制转换为int
的编译器警告?可以有一个共同的方法吗?(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())
_______~~~~~~
sendTo:编译器可能会对此发出警告,因为您试图构建一个64位应用程序。因此,size_t
将是64位宽的类型,int最多为32位。要解决此问题,请尝试将结果显式转换为int
,以便编译器知道这是有意的。此外,此功能可能会被send
取代,如MSDN所示sendto函数通常用于无连接套接字,将数据报发送到由to参数标识的特定对等套接字。即使无连接套接字以前连接到特定地址,to参数也只覆盖该特定数据报的目标地址。在面向连接的套接字上,to和tolen参数被忽略,使dto相当于发送。"所以也许也要检查一下。
选择:正如MSDN所说,第一个参数被忽略,但保留为与berkeley套接字的兼容性。显然,微软希望为UNIX系统提供简单的代码可移植性,因此设计了符合POSIX标准的API,这样代码几乎只需复制粘贴即可(显然有一些细微的更改(阅读更多信息。因此,如果使用winsock2
,请忽略此参数并将其设置为0
或任何整数。如果你想移植你的应用程序,复制你的代码并传递一个套接字的文件描述符,而不是0
。
是的,有可能:
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