假设我们的客户端应用程序执行以下操作:
WSADATA wsa_data;
int ret;
SOCKET sock;
ret = WSAStartup (MAKEWORD (2, 2), &wsa_data);
if (ret ==0) {
sock = socket (AF_INET6, SOCK_DGRAM, IPROTO_UDP);
}
sock == INVALID_SOCKET
和WSAGetLastError()
何时返回WSAEPROVIDERFAILEDINIT
?
微软关于socket()
函数的文档称,当时,它可以返回WSAEPROVIDERFAILEDINIT
服务提供程序初始化失败。如果分层服务提供程序(LSP(或命名空间提供程序安装不正确,或者提供程序无法正常运行,则会返回此错误。
非自定义服务提供程序的TCP/IP传输服务提供程序是否会在socket()
调用期间初始化失败?如果是,为什么?在什么情况下?如何补救?
默认提供程序可能永远不会发生这种情况,第三方提供程序也不太可能发生这种情况。
如果Windows本身无法加载提供程序,或者找不到WSPStartup
或更可能是NSPStartup
导出的函数,则可以返回WSAEPROVIDERFAILEDINIT
。我不确定这是否只能在WSAStartup
期间发生,或者是否允许Windows将此调用延迟到需要提供程序时。
提供者本身可能在任何时候都会因WSAEPROVIDERFAILEDINIT
而失败。想象一下,一个LSP记录每个连接,但无论出于何种原因,它所使用的数据库都有问题,它可能会选择使套接字失败并出现此错误。
(所有这些都是猜测,除非你有理由,否则你不应该以特定的方式处理每个可能的错误。(
例如,当试图将第三方提供程序加载到受Windows保护的进程中时,可能会发生这种情况。Microsoft只允许加载由Microsoft签名或使用特殊证书签名的DLL。情况并非总是如此。